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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 643|回复: 3

[原创] 孩子都能学会的FPGA:第七课——UART增加奇偶校验位和参数化传递

[复制链接]
发表于 2023-11-21 17:28:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 chdaj58 于 2023-11-21 17:28 编辑

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

第五课和第六课主要讲解了uart协议的发送模块和接收模块的设计,但是模块不包括奇偶校验位,实际应用中,奇偶校验位用的还是很多的,所以这课我们加上奇偶校验位的设计。

实际的开发应用中,有的不需要奇偶校验位,有的需要奇偶检验位,有的需要奇校验,有的需要偶校验,对我们FPGA设计来说,难道一个需求设计一个FPGA工程?那工作量也太大了,其实我们可以采用参数传递的方式来控制FPGA实现不同的功能。

我们先熟悉一下uart的奇偶校验。奇校验:数据中1的个数为奇时,校验为0,反之为1;偶校验:数据中1个数为偶时,校验为0,反之为1。这就是奇偶校验的规则。我们可以定义一个参数ODD_EVEN,这个参数是1的时候表示奇校验,是0的时候表示偶校验。然后这个参数和数据做异或运算,就可以得到就叫校验位的数值。

我们来推算一下,奇校验时ODD_EVEN1,数据中1个数为奇,加上ODD_EVEN1的个数就是偶数,偶数个1异或的结果是0;如果数据中1个数为偶,加上ODD_EVEN1的个数就是奇数,奇数个1异或的结果是1,符合奇校验的要求。

偶校验时ODD_EVEN0,数据中1个数为奇,加上ODD_EVEN1的个数就是奇数,奇数个1异或的结果是1;如果数据中1个数为偶,加上ODD_EVEN1的个数还是偶数,偶数个1异或的结果是0,符合偶校验的要求。

通过上面的分析,我们可以深入的理解奇偶校验的意义。不管奇校验还是偶校验,当传输的数据1的个数是奇数时奇偶校验位就一定是1,当传输的数据1的个数是偶数时奇偶校验位就一定是0,也就是说奇偶校验位是保证传输的数据中1的个数一定是偶数!这样是不是一下子就记住了奇偶校验!

然后再说一下FPGA的参数化传递,参数化的传递在软件编程中用的更多。如果有一个参数在很多模块中都要用,比如uart的波特率115200,当然我们可以直接在所有模块中用115200这个数字,功能绝对也是正常的。但是如果后续需求改变了,波特率变成了9600,那就需要到所有模块中将这个数值进行修改,如果粗心漏过一次,就会造成系统功能的异常!所以最简单的处理方式就是把波特率定义成一个可传递的参数,模块中直接用这个参数即可。这个参数层层上传,达到最顶层模块,在顶层模块赋值即可。所以后续即使需求改变了,只需要在顶层修改参数即可,不需要到每个模块分别修改了。

我们先看看uart发送模块的改动,传递了时钟频率CLK_FRE,波特率BAUDRATE,有无奇偶校验位标志PARITY和奇偶校验标志ODD_EVEN。同时参数BYTE_CNT和BANDRATE_CNT会根据传递的来的参数进行计算调整。传递参数必须要有默认值,如果该模块的上层模块没有传递参数过来,该模块就会使用这些默认值。


v2-cc067ba5b4d9608cdb794b44abe95d68_720w.png

模块中主要对tx_signal进行了修改,在byte_cnt计数为9的时候通过参数PARITY设置该位是奇偶校验位还是结束位。


v2-27f248388924c1f2c872c107baa62fd9_720w.png

uart接收模块的改动较大,首先参数的传递和参数的设置同发送模块一致。


v2-c855cfc2cb4c8f188d323cdc2a8409d1_720w.png

设置了奇偶校验位是否正确标志寄存器recv_parity_ok,通过比对计算的奇偶校验位parity_bit和接收到的奇偶校验位来确定;数据正确与否的判断依据寄存器data_ok,如果没有奇偶校验位,只需要判断停止位正确就可以认为接收的数据正确;有了奇偶校验位,就要奇偶校验位和停止位同时正确才能认为接收的数据正确。


v2-08f571aee367a18d7c251fec250298a3_720w.png [backcolor=rgba(0, 0, 0, 0.1)]

recv_parity_ok的设计如下,将计算的奇偶校验位parity_bituart线上的数据rx_sync2比对,如果一样就说明奇偶校验正确,否则奇偶校验错误。


v2-ec74f0d14691541aa411737bff8f3cdc_720w.png

最终采集的数据是否输出却决于data_ok,如果有奇偶校验位,那必须奇偶校验位和停止位都正确数据才能输出;如果没有奇偶校验位,那需要停止位正确数据才能输出。


v2-ba4c434ad3354da16a53a68617cd86f4_720w.png

仿真的tb文件uart发送和接收模块的上一层模块,所以在例化的时候只需要给需要传递的参数设置合适的数值即可。


v2-2824c3b0bc613b6b0865096c0e089367_720w.png

最后看看仿真波形,修改后功能是正确的,奇偶校验和停止位都正确,接收的数据和发送的数据一致。


v2-ec9b45049ae1010f6119ed1e192cb7b0_720w.png

目前实现了uart的单byte数据的发送和接收,但是在实际工程中,会有很多数据的传输,那该如何实现呢?思路很简单,把目前实现的uart的单byte数据的发送和接收模块当时底层最基础的模块,把常数据拆分成多个单byte的数据按照顺序一个个的发出去,就是按照时间顺序处理的流程最好用状态机来实现,下节课我们来将一下FPGA设计中的另外一个很基础的模块——状态机!


发表于 2023-11-21 17:55:02 | 显示全部楼层
厉害了
发表于 2023-11-21 20:49:02 | 显示全部楼层
支持
发表于 2024-1-4 15:15:33 | 显示全部楼层
请教一下,当uart反相以后,奇偶校验要跟着取反吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-8 00:43 , Processed in 0.023945 second(s), 7 queries , Gzip On, Redis On.

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