Menu Close

UART 组装与实验

上几节内容介绍了UART的组成部分发送(tx.v), 接收(rx.v)以及波特率发生器(bd_rate_en.v)等原理及代码,本节内容介绍如何将各个模块组装在一起形成一个完整的UART收发系统UART.v。组装后的结果如图1 所示。根据图1的结构,下面将进行程序组装,并提供仿真与实验结果。

图1

一  rx采用中心对齐的模块。

  1. UART组装的程序


 

2. test_uart.v 程序

  • 本测试程序将仿真程序和板载测试程序合二为一。
  • 仿真数据由本程序产生,通过tx module 串行发送到 tx pin 上。 通过回环方式由rx module 进行串行接收,即:rx <= tx。为了方便测试,在仿真中每包只有8个数据。
  • 板载测试数据由计算机产生,通过rx module 进行串行接收。将接收到的并行数据回环到tx module。

图2

从图2 中可以看出:

1)初始化使用变量,

如果是SIM_DEBUG 模式, 等待16000时钟周期后,tx_data = 0; tx_req = 1; 发送第一笔数据;

如果是正常接收模式,等待rx_rdy_r == 1, tx_data = rx_data_r; tx_req = 1; rx_ack = 1; 发送从接收端得到的数据。

2)rx_ack = 0; 等待发送模块tx.v 返回tx_ack 信号, 如果tx_ack == 1 ,  发送请求信号 tx_req = 0;

3)等待tx_ack 是否为0, 如果tx_ack == 0 ,

如果是SIM_DEBUG 模式, 查看目前是否已经发送过 8个数据了(tx_data = 0~7), 如果已经发送过8个数据,返回状态0

如果是正常接收模式,跳转状态3

4)tx_cnt 清零,

如果是SIM_DEBUG 模式, 数据 + 1; 发送tx_req = 1; 返回到状态1

如果是正常接收模式,等待是否有新的数据被接收, 发送tx_req = 1; 同时将rx_ack = 1 ; 通知rx  rx_data_r数据已经被接收到了, 返回到状态1

 


 

 

2.  仿真

仿真时采用回环的方式,即TX与RX信号在tb.v内实现回环,如图2所示。

图3

  • 仿真程序


 

  • 仿真波形(Modelsim)

图4

从图4的波形可以看出,经过回环测试,接收数据可以正确接收数据。

二  RXD部分用判多方式


 

加载rx_more_one 变量到仿真波形中,观察其中一位的接收,移位,求和,判多的结果看看是否与预期的设计相符,图5,图6显示了停止位的解码过程。

图5

 

图6

图6的红框标注了sample_bit,count_one,rx_bit与状态机及sample_count_cs之间的逻辑与时序关系。最终测试在停止位解码时,count_one得到8个1,提高了判决的冗余度。

练习题:

  1. 将奇偶校验设为奇校验,重新仿真,并验证接收数据的正确性。
  2. 分析对照仿真波形rx_r[1],sample_st_cs, sample_count_cs,sample_bit,count_one,rx_bit的时序关系,并分析在判多时为什么要如下语句出现:


 

而不是直接采用if(sample_count_cs == 7)begin 的方式实现 ?

工程代码如下:

[content_control]

uart_demo_prj.zip

[/content_control]

Posted in FPGA, FPGA 教材教案, Quartus II, Quartus II, Verilog, 开发工具, 开发语言, 教材与教案, 文章