当前位置: 首页 > news >正文

【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

前言

        书接上文【FPGA项目】沙盘演练——基础版报文收发_子墨祭的博客-CSDN博客,前面我们做了基础版的报文收发,相信对逻辑设计有了一定的认知,在此基础上,继续完善一个实际报文收发可能会遇到的一些处理:

  1. 报文处理
  2. 握手与反压
  3. 跨时钟域处理CDC
  4. 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功能分解

通过前面的描述,我们可以将功能分解为以下几块:

  1. 报文处理,包括接收的格式处理,输出的格式处理;
  2. CRC校验,这里我们使用并行的CRC8算法
  3. 跨时钟域处理,这里我们使用异步FIFO
  4. 握手与反压,上个项目只是规定了包间隔>2clk cycle,但是发送方不遵守咋办?这里就需要一个反压信号,在你能接收的时候才打开使能。

2.2系统框图

问:CRC在FIFO之后可以吗?

2.3项目代码

方案写的这么清楚了,代码还不是分分钟拿捏?

当然这不是唯一的设计方案,可以先自行考虑设计及验证。

若需完整代码工程,后续再补充。

三、工程仿真

对激励数据做CRC校验,然后与系统输出进行比数,完全匹配则通过。

四、项目收获

  1. 方案设计的重要性:任何项目都是始于方案设计,前期需要花大量的功夫去理清思路,方案设计完成,代码实现只不过是水到渠成的事情。
  2. 仿真的学习:通过本项目,完成了testbench的编写,仿真验证,是对自己设计的一次检验,是实际项目缩短调试时间的最佳利器。
  3. 对时序的理解,时钟是FPGA的心跳:任何时序操作都是发生在时钟的跳变沿。当采样发生在当前上升沿时刻,数据变化是发生在下一时刻的上升沿。
  4. 绘画时序图,可以使用https://wavedrom.com/editor.html  (每个模块的信号都可以画出时序图,便于代码设计及调试)

后记

        这个算是一个标准的完备的数字逻辑设计虚拟项目学习。可以为我们系统设计奠定一个基础。

        后续我们将进行实际项目演练。

        咱们下期见~

http://www.lryc.cn/news/166587.html

相关文章:

  • 【程序员装机】自定义Edge浏览器用户目录
  • ubuntu18、20 cv_bridge 与自带opencv版本冲突问题
  • 贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...
  • css自学框架之图片懒加载
  • RoutingKafkaTemplate,DefaultKafkaProducerFactory和 ReplyingKafkaTemplate
  • Flutter动态化开发之Fair实战
  • Stream流编程
  • jenkins自动化脚本集成时钉钉消息未发送
  • java面试题第七天
  • MATLAB入门-矩阵的运算
  • [X3m]ros交叉编译
  • 【漏洞库】Fastjson_1.2.47_rce
  • zabbix 钉钉微信企微告警(动作操作消息内容模板)
  • 阿里云国际站云服务器数据备份方法有哪些?
  • 游戏笔记本电脑可以进行 3D 建模和渲染吗?有哪些优势与缺点?
  • 【AI】推理系统和推理引擎的整体架构
  • k8s集群中流水线部署微服务
  • Socks5代理与网络安全:保护您的隐私与数据
  • 2024年山东高企申报注意事项
  • npm publish包报404,is not in the npm registry错误
  • pytest-基础
  • 在openSUSE上开启护眼模式
  • vue基础知识十:Vue中组件和插件有什么区别?
  • Arthas是一个Java诊断工具 的入门使用
  • 数据结构——排序算法——桶排序
  • Kafka消息发送可靠性分析
  • 如何将一个字符串转换为驼峰命名法(camel case)?
  • 牛客网项目-第一章-笔记
  • CISP汇总
  • KALILINUX MSF中kiwi(mimikatz)模块的使用