前言
书接上文【FPGA项目】沙盘演练——基础版报文收发_子墨祭的博客-CSDN博客,前面我们做了基础版的报文收发,相信对逻辑设计有了一定的认知,在此基础上,继续完善一个实际报文收发可能会遇到的一些处理:
- 报文处理
- 握手与反压
- 跨时钟域处理CDC
- CRC校验
一、项目要求
从上游模块接收报文数据,对报文中的数据进行CRC校验,生成CRC8校验码并附在报文后,随数据输出发送给下游模块。注意,接收与发送为两个时钟域,所以需要异步FIFO进行跨时钟域处理。
1.1 接口时钟
接收(与上游模块接口)时钟频率:180MHz
发送(与下游模块接口)时钟频率:200MHz
1.2 接口时序
输入时序:
输出时序:
1.3 接口信号
信号 | I/O | 位宽 | 描述 |
系统接口信号 | |||
clk_in_180 | I | 1 | 系统时钟,180Mhz |
rst_n_180 | I | 1 | 硬复位,低有效 |
clk_out_200 | I | 1 | 系统时钟,200Mhz |
rst_n_180 | I | 1 | 硬复位,低有效 |
与上游模块接口信号 | |||
sop_in | I | 1 | 输入报文头指示信号,高有效 |
eop_in | I | 1 | 输入报文尾指示信号,高有效 |
vld_in | I | 1 | 输入报文数据有效信号,高有效 |
din_rdy | O | 1 | 可以接收上游模块报文的指示信号,高有效 |
data_in | I | 8 | 输入报文数据 |
与下游模块接口信号 | |||
sop_out | O | 1 | 输出报文头指示信号,高有效 |
eop_out | O | 1 | 输出报文尾指示信号,高有效 |
vld_out | O | 1 | 输出报文数据有效信号,高有效 |
data_out | O | 8 | 输出报文数据 |
dout_rdy | I | 1 | 下游模块可以接收报文的指示信号,高有效 |
1.4 数据格式
1.输入数据格式:
输入数据的第一拍(sop)为报文参数head[2:0],指示报文前面有多少bit数据是无效的,即:
Head =0 : 第一行数据全部有效(0 bit无效);
Head =1 : 第一行数据最低bit无效(1 bit无效);
...
Head =7 : 第一行数据最高位有效(7 bit无效);
2.CRC校验前的数据格式:
在做CRC校验之前,需要将无效bit清除,替换为0;
并且参数(head)不参与CRC校验。
3.输出数据格式:
输出数据要求向前对齐,将CRC校验码附在报文之后,并且在末尾填充0以补足8bit。
二、项目方案设计
2.1功能分解
通过前面的描述,我们可以将功能分解为以下几块:
- 报文处理,包括接收的格式处理,输出的格式处理;
- CRC校验,这里我们使用并行的CRC8算法
- 跨时钟域处理,这里我们使用异步FIFO
- 握手与反压,上个项目只是规定了包间隔>2clk cycle,但是发送方不遵守咋办?这里就需要一个反压信号,在你能接收的时候才打开使能。
2.2系统框图
问:CRC在FIFO之后可以吗?
2.3项目代码
方案写的这么清楚了,代码还不是分分钟拿捏?
当然这不是唯一的设计方案,可以先自行考虑设计及验证。
若需完整代码工程,后续再补充。
三、工程仿真
对激励数据做CRC校验,然后与系统输出进行比数,完全匹配则通过。
四、项目收获
- 方案设计的重要性:任何项目都是始于方案设计,前期需要花大量的功夫去理清思路,方案设计完成,代码实现只不过是水到渠成的事情。
- 仿真的学习:通过本项目,完成了testbench的编写,仿真验证,是对自己设计的一次检验,是实际项目缩短调试时间的最佳利器。
- 对时序的理解,时钟是FPGA的心跳:任何时序操作都是发生在时钟的跳变沿。当采样发生在当前上升沿时刻,数据变化是发生在下一时刻的上升沿。
- 绘画时序图,可以使用https://wavedrom.com/editor.html (每个模块的信号都可以画出时序图,便于代码设计及调试)
后记
这个算是一个标准的完备的数字逻辑设计虚拟项目学习。可以为我们系统设计奠定一个基础。
后续我们将进行实际项目演练。
咱们下期见~