一 同步串行通信需要通信双方在同一时钟的控 制下,同步传输数据;异步串行通信是指通信双方使用各自的时钟控制数据的发送和接收过程。UART 是一种采用异步串行通信方式的通用异步收发传输器, 它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。
UART 负责完成数据的串并转换,而信号的传输则由外部驱动电 路实现。电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有 RS232、RS422、RS485 等,它们定义了接口不同的电气特性,如 RS-232 是单端输入输出,而 RS-422/485 为差分输入输出等。
实验任务:本节实验任务是上位机通过串口调试助手发送数据给 Zynq,Zynq PL 端通过 USB_UART 串口接收数据 并将接收到的数据发送给上位机,完成串口数据环回。
对于本次实验来说,需要通过跳帽(或者杜邦线)将图中 P5 的 3 号脚和 5 号脚连接在一起,将 4 号脚 和 6 号脚连接在一起。
约束:create_clock -period 20.000 -name clk [get_ports sys_clk] set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk] set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n] set_property -dict {PACKAGE_PIN T19 IOSTANDARD LVCMOS33} [get_ports uart_rxd] set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports uart_txd]
二 程序设计:
uart_loopback.v:连接两个模块 rx_data和tx_data. done和busy。rx出的两个信号对应tx进的两个信号。
uart_rx.v: BAUD_CNT_MAX = CLK_FREQ/UART_BPS;434,系统时钟计数1bit数据计数次数 对串口发送的uart_rxd信号做同步处理,打三拍。接收标志赋值:rx_cnt ,baud_cnt 一个是数据位计数,波特率计数能计数每一位的中间时刻,采稳定的信号。baud_cnt从0~434,每记到434rx_cnt+1. 把计数rx_cnt的值在中间采沿,保存在rx_data_t中。当记到9,在中间时刻停止。把寄存的值和done标志进行赋值,
uart_tx.v: 对busy信号赋值,发送过程中拉高,并且寄存并行数据->串行。baud_cnt == BAUD_CNT_MAX - BAUD_CNT_MAX/16 ( baud_cnt == BAUD_CNT_MAX*15/16 -1'b1)相等? rx_cnt ,baud_cnt两个计数器与rx同理。 根据tx_cnt将并行数据转换成串行信号。
三 modelsim仿真
rx模块问题:计数器不加,打拍无效。更改代码assign start_en = uart_rxd_d2 & (~uart_rxd_d1) & (~rx_flag); 。 该模块难点在于对data_t寄存的理解。
tx模块:许多信号无数据,替换顶层模块的例化代码,问题得到解决。重点理解tx_data_t和txtxd,结合波形图。
四 下载验证:连接串口线,将跳帽改成对应的连接方式。打开上位机,下载bit文件
发送与接收的一致,说明实验成功。