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

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

第五课和第六课主要讲解了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会根据传递的来的参数进行计算调整。传递参数必须要有默认值,如果该模块的上层模块没有传递参数过来,该模块就会使用这些默认值。

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值