孩子都能学会的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设计中的另外一个很基础的模块——状态机。

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FPGA(现场可编程门阵列)是可编程逻辑器件,可以被重新配置以执行特定的功能。串口通信是一种通过单根线传输数据的通信方式,而UART(通用异步收发传输器)是一种实现串口通信的硬件接口。 FPGA可以实现带奇偶校验串口UART奇偶校验是一种用于检测和纠正串行传输中数据错误的技术。在奇偶校验串口UART中,发送方会在数据中插入一个校验位,以表示数据中1的个数是奇数还是偶数。接收方在接收数据时会计算接收到的数据中1的个数,并与校验位进行比较,以判断数据是否正确。如果校验错误,接收方会发出错误标志。 在FPGA中,可以使用VHDL或Verilog等硬件描述语言来实现带奇偶校验串口UART。首先,需要定义数据的格式,包括起始、数据校验位和停止。然后,根据数据格式编写发送和接收数据的逻辑代码。发送数据时,FPGA会将发送的数据添加起始、数据校验位和停止,并通过串口线发送出去。接收数据时,FPGA会接收串口线上的数据,并进行校验和解析,得到有效的数据。 通过使用FPGA实现带奇偶校验串口UART可以实现可编程的串口通信接口,使得我们可以根据需要对串口通信进行定制和优化。这对于很多应用场景,如通讯设备、工业控制、嵌入式系统等都是非常有用的。 ### 回答2: FPGA(现场可编程门阵列)是一种可编程的芯片,可以通过在内部重新连接其门和触发器,以实现不同的逻辑和功能。串口(Serial Port)是一种用于数据传输的通信接口,UART(Universal Asynchronous Receiver Transmitter)是一种串行通信协议。 FPGA可以实现带奇偶校验串口UART功能。奇偶校验是一种错误检测方法,用于判断数据传输过程中是否存在误码。在传输数据的过程中,发送端将数据按照一定规则进行校验,在接收端对校验结果进行检查以确认数据的正确性。 要在FPGA中实现带奇偶校验串口UART,首先需要在FPGA内部设计一个串口UART模块。该模块可以包括发送端和接收端的功能单元。 在发送端,数据需要进行奇偶校验。发送的数据经过计算生成奇偶校验,并与发送数据一起发送出去。 在接收端,接收到的数据会自动检查奇偶校验。如果接收到的数据与校验位不匹配,将会产生一个错误标志。反之,如果匹配成功,可以确认数据的正确性。 在FPGA设计中,需要编写相应的逻辑代码实现串口UART模块的功能。通过使用硬件描述语言(如VHDL或Verilog),可以描述功能单元和模块之间的连接关系。 此外,还需根据具体的硬件平台和串口通信的标准进行配置和接口实现。例如,串口通信的波特率、数据长度、停止校验位等参数需要在FPGA中进行设置。 通过以上步骤,可以在FPGA上实现带奇偶校验串口UART功能。这种实现可以在很多应用中使用,如通信设备、工业自动化等领域,以实现可靠的数据传输和通信。 ### 回答3: FPGA是一种可编程逻辑器件,可以用于实现各种数字逻辑电路。而UART(通用异步收发器)是一种常见的串口通信协议,用于在电子设备之间进行数据的传输和通信。 在实现带奇偶校验串口UART通信时,FPGA可以用于设计和实现相关的电路逻辑。一般来说,串口UART的核心是一个收发器(Transceiver)模块,它负责将数据从串口接收到的电平信号转换为数字信号,并将数字信号转换为串口发送的电平信号。 对于奇偶校验,其作用是检测和纠正数据传输过程中的错误。在UART通信中,奇偶校验通过对数据进行计算,确定数据中的1的个数是奇数还是偶数,并将这个结果添加到数据后面作为校验位。接收端会通过比较接收到数据的奇偶性和接收到的校验位来判断数据是否传输正确。 在FPGA中,可以通过使用逻辑门来计算奇偶校验并与数据进行拼接。当数据校验位传输到UART的收发器时,FPGA还可以通过电平转换电路将这些信号转换为适配串口标准的电平信号。 总之,通过FPGA实现带奇偶校验串口UART主要涉及设计和实现收发器模块,计算奇偶校验以及进行电平信号的转换。这样就可以实现带有奇偶校验功能的串口通信,提高数据传输的可靠性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值