原创 【博客大赛】高速uart设计及验证之关键点分析-附参考代码

2014-11-7 21:20 1734 17 17 分类: FPGA/CPLD

UART设计及关键点和难点分析

 

20141106223204737.jpg

UART:设计架构

1bus_interface中定义一些寄存器,如控制寄存器(control_reg),包括波特率的设置、奇偶校验位设置,bits数目的设置,停止位的设置等;状态寄存器(status_reg)包括奇偶校验错误状态,中断状态,发送接收fifo空满状态,CRC错误状态等;数据寄存器(data_reg)包括发送数据和接收数据。

2uart_tx_fifo用于缓存待发送的数据,关于它的大小,要根据发送端的吞吐率和uart的速率进行计算,然后给出一个比较合理的值;例如fifo深度为Depth*Width,那么你可以设计成当fifo不满的状态反馈到状态寄存器,接口那边检测到不满就可以继续往里面写,uart_tx_rsm检测到fifo不空时就可以继续发送数据;但是这样需要接口那边频繁来检测状态(如果接口那边是cpu的话,则会使cpu频繁访问uart寄存器,使其不能够很好的做其他工作),所以可以设计成将fifo填满(或者达到某个阈值),然后uart_tx_rsm发送数据,当fifo中的数据发送完毕后产生中断,通知接口那边继续填满fifo,这种采用中断的方式可以使接口另一端的设备不至于频繁访问寄存器。

3uart_divxy用于根据波特率寄存器及系统时钟产生uart_clk;

4uart_rx_fifo用于缓存uart_rx接收的的数据,关于它的大小,要根据接收端的吞吐率和uart的速率进行计算,然后给出一个比较合理的值;例如fifo深度为Depth*Width,那么你可以设计成当fifo不空的状态反馈到状态寄存器,接口那边检测到不空就可以继续从里面读取,uart_rx_rsm检测到fifo不满时就可以继续接收数据;但是这样需要接口那边频繁来检测状态(如果接口那边是cpu的话,则会使cpu频繁访问uart寄存器,使其不能够很好的做其他工作),所以可以设计成将fifo填满(或者达到某个阈值),然后产生中断,通知接口来读取,这种采用中断的方式可以使接口另一端的设备不至于频繁访问寄存器。

5uart_tx_rsm用于从uart_tx_fifo中取一个字节,然后按照格式{开始位,数据位(位数可变),奇偶校验位,停止位}(有些位可以选择),在uart_baud的控制下一个一个bit的发送出去。

6uart_baud用于控制uart_tx_rsmuart_rx_rsm

7uart_rx_rsm接收一个一个bit(关于uart_rx_rsm采样bit采用16倍波特率的速率,然后取中间值),然后剥去起始位,奇偶校验位停止位,组成一个字节,然后存入uart_rx_fifo

8uart_interruput产生中断,通知接口,然后接口接收到中断后,读取相应的中断寄存器,查看是何种类型的中断。

9uart_modem产生流控制信号,大致是表明uart当前是否可以用于传输。

10、关于接口部分,由于uart的速率较低,可以采用APB总线协议实现,方面后面的系统集成和IP复用。

20141106223234157.jpg

 

Cpu通过总线发送一组数据到uart_dut,同时将这组数据送到scoreboard,数据经过总线及uart_dut后被uart_driver接收至数组(或者其它存储结构)中,然后这组数据被送到scoreboardcpu送出的数进行比对;同理,uart_dut通过uart_dut发送一组数据到cpu(也可以理解为cpu读取数据,因为cpu相当于masteruartslave),同时将这组数据送到scoreboard,数据经过总线后被cpu接收至数组(或者其它存储结构)中,然后这组数据被送到scoreboarduart_dut送出的数进行比对。其中上图中的中断信号输入到cpu的中断控制器中,cpu根据中断的情况进行相应的处理。

注意:uart是如何确保数据传输的正确性的呢??

1)在数据位的两端添加了起始位,奇偶校验位,停止位等用于进行数据的同步和纠错;

2)接收端用16倍波特率对数据进行采样,取采样中间点的值,这样可以很大程度上确保采样数据的正确性。

3)通过流控制信号(如上面的uart_rts,uart_cts信号)确保数据传输的正确性,不会发生underrunoverrun

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
17
关闭 站长推荐上一条 /3 下一条