一水寒

【再说FPGA】uart数据收发控制器结构设计

0
阅读(4586)

前几天写了UART的收发控制器,能够正确地发送和接收数据,但是用于实际应用还差很远,最主要的是数据输入端需要发送的数据你必须配合UART的波特率时钟送入才行,否则会丢失数据,解决这个问题的方法是在发送端和接收端都加一个FIFO缓存数据,这样不管你数据什么时候送进来我都准确地给你发送出去,或者接收到。这里改进的UART收发器增加了奇偶校验位的模块,你可以选择是否带有校验位,选择是奇校验还是偶校验,具体结构如下:

图一

数据发送流程:

1、要发送的数据先存入FIFO
2、T2中产生FIFO的读请求,此时FIFO将8位数据位传给T2,同时T2中产生奇偶校验位
3、T3数据发送完毕以后,T2将数据和校验位一起送给T3,T3将T2送来的数据串行输出

数据接收流程:

1、R1接收到串行输入的数据并行输出给R2
2、R2进行奇偶的校验,检查数据接受的正确性
3、确认数据接收正确,将需要的数据存入FIFO

把思路理清以后规划各模块连接信号及端口,我的初步设计原理图如下:


图二


图三

注:图二是串口发送模块和波特率时钟发生器,图三是串口接收模块,其中波特率时钟发生器是共用的。本来图二的发送器和图三的接收器是相互独立的,如图一所示他们分别是构成串口收发器的两个相互独立的模块,这里我把发送机串行输出的数据接到了接收机的串行接收端,联合测试两个模块的正确性。之前对发送机和接收机都做了单独的测试,都是正确的,这里直接给两个模块的联合测试方案。实际应用的时候将接收机的rx端口接input,然后封装起来就ok.

仿真波形如下:


图四
NOTE1:接收到得数据从FIFO并行输出,从原理图看得出来,接收端fifo的读时钟是系统时钟(sorry,被input给遮掉了),相对波特率始终来说是非常快的,所以其实13前面还有很多的数据,如图五。

NOTE2:同NOTE1,发送端写时钟非常快 ,这里13前面也有很多数据,如图六。

NOTE3:发送机串行输出

NOTE4:是经过奇偶校验位检测以后写进FIFO的数据,其实NOTE1,NOTE2放大以后看到的就是这些数据。这里他下面的rx_fifo_wreq的产生是非常有讲究的,你必须是在需要写数据的时候给他一个FIFO时钟的高电平然后马上把他拉低,一定要要注意这里FIFO写时钟到底用的是什么,然后在这里给写请求一个该时钟宽度的高电平。这里我也是不断地仿真不断地修改代码才得到这个波形图。


图五


图六

部分代码如下:(上次贴代码排版整理了很久,现在直接贴图)


Baidu
map