在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1082|回复: 2

[原创] 孩子都能学会的FPGA:第十课——UART通信增加CRC校验

[复制链接]
发表于 2023-11-29 09:16:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 chdaj58 于 2023-11-29 09:16 编辑

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如果需要整个工程请留言索要(微信15092150280索要也可以),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

第九课已经完成了多字节UART通信的设计,可以在实际工程中应用了。但是一般的通信协议是有CRC校验的,有了CRC校验,就可以进一步增加数据的传输正确率。本节主要是讲述在通信协议中如何使用CRC校验,至于CRC校验的公式,CRC是如何运算的,网上的文章很多,在这儿就不具体的讲解了。

本节工程要求:系统时钟是100MHz,低电平复位,使用UART协议完成4byte数据的传输,为了保证数据传输的正确性,每帧数据添加帧头(5a),数据长度(4),CRC8校验和帧尾(a5)。UART的波特率是115200,有奇偶校验位,偶校验。

首先要设计一个CRC8模块,这是选择的多项式是X^8+X^2+X^1+1,网上有自动生成verilog代码的网站Easics CRC Tool进行如下的设置即可以生成相应的CRC的代码。


v2-6e120727bae66ad07d717bb4ee7bbf1b_720w.png
打开后代码如下所示:


v2-93c919808ed93ff260f34a97e84d6707_720w.png
笔者根据自己的习惯对该模块进行了改写,如下所示:


v2-27ddc11bd204788bdbb2c6c6a8ead134_720w.png

CRC8的模块设计完毕后,考虑一下UART通信协议帧的结构,和第九课相比,多了一个字节的CRC,这儿的CRC是对数据1-数据4的CRC。当然也可以是帧头+长度+数据1-数据4的CRC,这个要根据具体的要求来定。一般的协议中如果有了CRC就不会有帧尾了,本工程主要是教学,所以都保留了。
v2-c446b2c507b931136f4cb30aff69bc73_720w.png
如下是数据发送和数据接收的状态流程,都是增加了CRC状态。

v2-cb03280662978705bb061f245e90d323_720w.png

在发送模块中,增加了CRC状态机的设计。


v2-51fd2faa0a8594304045757b3142746c_720w.png

发送模块通过如下的代码完成CRC码的生成,就是将每个要发送的数据和上次计算完成的CRC数据分别送入crc8_coder模块,当4个数据发送完毕后,将crc_out信号在CRC状态内通过UART串行发送出去


v2-c0220eeddebacb577278e9c5095ddd74_720w.png

接收模块也是相应的增加了CHK_CRC状态机的设计。

v2-4525276d9117dba6a410d71c21bef89a_720w.png

发接收模块通过如下的代码完成CRC码的生成,就是将每个接收的数据和上次计算完成的CRC数据分别送入crc8_coder模块,当4个数据完成接收后,也完成了数据CRC的生成,即crc_out信号


v2-c1bc30d48ddf5118667f457773ab4932_720w.png
判断接收的CRC和接收模块计算的CRC是否一样,如果一样,说明接收的数据正确,如果不一样,说明接收的数据有错误。

v2-e9ade3415c3fb208c343453ab7222ae6_720w.png

看仿真结果,发送的数据和接收的数据是一样的,功能正确。


v2-8c741883c37a15ff95cf7752cd33a04a_720w.png

最后看看接收端状态cur_state=6的时候是CHK_CRC状态,此时接收模块计算的crc_out和通过UART接收到的rx_data是一样的,说明UART线上传输数据正常,没有误码的产生。

v2-d61e1de03cc4f4ce1bf5d77704da377a_720w.png

本实例的UART的协议,使用了帧头,数据长度,CRC校验,帧尾,UART的奇偶校验位等多种方式来保证数据传输的正确性!UART还是低速通信,对于PCIE,SRIO,千兆网口等接口,需要用更多的方式来保证数据传输的可靠性!

发表于 2024-6-25 13:45:05 | 显示全部楼层
感谢分享
发表于 2024-10-11 16:33:48 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-26 03:08 , Processed in 0.016609 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表