【手撕代码】HDB3编解码

2023-08-30 09:57:10 浏览数 (1)

【手撕代码】HDB3编解码

1. 来源和需求

HDB3编解码任务来源于2023年3月4日“FPGA技术讨论群”的一次活动《101群第一次FPGA编码交流研讨会》,要求设计HDB3编解码,本篇文章作者【roy2022】,经作者授权后转发,以下所有文件版权归作者所有。

输出物包括:

    1. 编码模块。
    1. 解码模块。
    1. 编解码的仿真模块。
    1. 设计报告、代码工程包等。

HDB3的编码规则、编码及解码模块接口定义见《101群第一次FPGA编码交流研讨会》(在最后的代码链接中)。

2. 设计

2.1. 需求分析

此次需求提供的十分明确,给出了编码规则及示例,明确了编解码端口要求;仿真模块根据设计进行适配。

2.2. HDB3编码模块

对HDB3编码规则解读如下:

  1. 复位(RST)有效(1)时,进行初始化,输出VALID为0、HDB3_CODE为0编码(000)。采用异步复位、同步释放。当复位(RST)无效(0)时进行编码。
  2. 在输入时钟CLK的上升沿进行转换。
  3. 在CLK上升沿进行判别时,当输入READY为有效(1),DATA_IN有效,为0或1。
  4. 对READY和DATA_IN打一节拍,人为产生1个CLK的延时。
  5. 在CLK上升沿进行编码判别,DATA_IN有效为1时,立即进行编码,若存在待转换的0,待转换的0也进行编码,并加入待输出编码队列;当DATA_IN有效为0时,若存在待转换的0的个数为(0~3)、也即当前为第4个0,则进行编码,并加入待输出编码队列,否则暂停编码。
  6. 在CLK上升沿进行编码输出,若存在待输出编码,则输出VALID为1、HDB3_CODE为对应编码。
  7. 一共7种编码形式,对应0、±1、±B、±V;1可能被编码为 1、-1,0可能被编码为0、 B、-B、 V、-V。1、B极性交替( 、-交替出现)、V极性交替;第一个编码极性为 。当出现0时,若是连续的第4个0,则替换为V(极性按交替规则),然后若V极性和前一个1或B的极性不同,则将连续4个0中的第1个0替换为B且极性和V相同,其余0编码为0. 由此可见,编码应在RST无效(为0)、READY有效(为1)时按照DATA_IN(0或1)、积累的待编码0数量(0~3)、上一个1或B的极性、上一个V的极性开展,编码后更新待输出编码数量和待输出编码队列。故在编码模块“tt_hdb3_encoder”中设置了如下信号量:
  8. tmp_rst:std_logic_vector(1 downto 0),初始化为00,用于复位同步释放,同时将复位输入RST有效性由1变为0.
  9. tmp_din,tmp_ready:std_logic,分别对DATA_IN和READY打一节拍。
  10. tmp_dataout,深度为4、宽度为3的输出编码缓冲,最多4个。
  11. flag_1BPOL、flag_VPOL:std_logic,1或B极性、V极性标志位,表征上一个1/B/V的极性,0表示-、1表示 。
  12. cnt_tbpo:natural range 0 to 7 := 0,待输出编码个数,实际范围为(0~4)。
  13. cnt_tbc:natural range 0 to 3 := 0,待编码0个数,范围为(0~3)。 当cnt_tbpo>0时,每个clk上升沿将输出编码缓冲的(cnt_tbpo-1)编码对外输出。 具体代码实现使用VHDL,在ISE14.7中完成,文件为“tt_hdb3_encoder.vhd”。 2.3. HDB3解码模块 相对于编码,HDB3解码较为简单,输入有效时,将±1解码为1、将0/±B/±V解码为0;解码模块tt_hdb3_decoder的复位、输入打节拍处理同编码模块。 具体代码实现使用VHDL,在ISE14.7中完成,文件为“tt_hdb3_decoder.vhd”。 2.4. 编解码仿真模块 编解码仿真需要提供可控的输入数据流DATA_IN。此次,通过附加test_2bit模块来提供仿真数据流,建立一个多位的std_logic_vector(80位),在CLK时钟上升沿从低位逐位移出。 仿真准备:将test_2bit、tt_hdb3_encoder、tt_hdb3_decoder例化在test_top工程下,但是将test_2bit的输入时钟和编解码模块的输入时钟取反,便于在编解码仿真时输入数据稳定。

3. 验证

由于预建立了仿真工程test_top,仿真文件tbw_test_top处理较为简单,设置RST和READY即可。在ISE14.7环境下使用ISim完成了仿真验证。

在Vivado2018.3环境下(仿真Vivado Simulator)也进行了仿真验证。

资源使用情况(Target Device: xc7k325t-2ffg900,ISE14.7):

Module Name

Slices

Slice Reg

LUTs

BUFG

说明

test_top

1/36

0/47

1/79

1/1

测试top文件

Inst_test_2bit

3/3

8/8

8/8

0/0

测试激励文件1

Inst_tt_hdb3_decoder

4/4

8/8

3/3

0/0

解码模块

Inst_tt_hdb3_encoder

28/28

31/31

67/67

0/0

编码模块

代码链接

❝https://github.com/suisuisi/FPGATechnologyGroup/tree/main/HDB3 ❞

0 人点赞