【注】该项目是我们团队参加2019届全国大学生FPGA大赛的作品,系统主要实现视频任意角度旋转。该项目最终晋级决赛,并获得紫光同创企业特别奖。该系列文章介绍我们团队的作品。关注公众号“数字积木”对话框回复 FPGA2019 ,即可获得该项目的工程源代码,详细的文档说明,MATLAB仿真代码。
4.5 ddr 串口联合测试
4.5.1总体设计
DDR端的数据通过AXI总线进行数据传输。在前面章节介绍了DDR数据读写模块的设计(aq_axi_master),本章节中便对这个axi的读写模块进行测试。在测试中,先向ddr的某个地址中写入数据,然后再将该地址的数据读取出来,通过串口将此数据发送到电脑端,以此验证ddr数据的读写是否正确。
4.5.2串口收发模块设计
该串口收发模块有串口发送模块,串口接收模块,波特率生成模块,发送数据fifo模块,接收数据的fifo模块组成。
默认配置下,要求输入的参考时钟为50MHz,输入输出的波特率默认配置为115200.该设置体现在波特率生成模块中。
波特率可以通过定制化参数来修改。
SYS_CLK_FRP为串口模块的输入时钟频率。
BAUDRATE为要设置的数据传输波特率。
整体的设计框架如下:
端口定义如下:
端口名 | 方向 | 描述 |
---|---|---|
Clk | Input | 主时钟,默认频率为50MHz |
Rst_n | Input | 复位信号,低有效 |
uart_rx | Input | 串口接收端口 |
uart_tx | Output | 串口发送端口 |
tx_data[7:0] | Input | tx端要发送的1字节数据 |
rx_data[7:0] | output | rx端口接收到的1字节数据 |
tx_en | Input | 发送数据的写入使能信号 |
rx_done | output | 串口接收到数据的有效标志位 |
该模块的使用方法:
发送数据:
将要发送的数据放置到Tx_data_in[7:0]总线上,同时将Tx_wen置为高,下一个时钟时,该数据会写进tx_fifo中。如要发送多字节数据,则重复上述步骤,每个时钟向TX_FIFO中发送一个字节的数据,tx_fiof的默认深度为256,可以储存256个字节的数据,则一次最多可以发送256字节数据。
接收数据:
接收到一个字节的有效数据时,接收数据标志位rx_done为高,同时在rx_data端口输出接收到的数据.
4.5.3ddr端的数据读写设计
ddr端的读写设计如上图所示。首先进入空闲态,延时等待1秒,计时达到1秒后,进入写数据状态。起始状态下写地址和写数据设置为0,向该地址写入数据后,写地址和写数据均加1,然后读取此次写入地址的数据,待读完成后,进入空闲态,再次延时等待1秒,计时达到1秒后,在进行下一次的数据读写验证。
4.5.4串口发送数据设计
从ddr中读出的数据是64bit,但串口一次只能发送8bit的数据,则要将这64bit的数据分为8次发送出去。设计了一个数据发送模块,将64bit的数据转换为8个8bit的数据,依次通过串口发送。
具体的实现方法是,设置一个计数器,待收到ddr读出的有效数据后,将该数据分8次传输到串口发送模块。同时将串口发送数据的有效标志位置高,直到8bit的数据全部发送完成。
核心代码如下图所示:
4.5.5测试结果
将经过综合,布局布线后,生成的比特流文件下载到开发板中,打开串口终端,连接到FPGA的串口。可以看到数据以1秒8字节的速度在不断的接收。
而且接收到的数据以8字节为一组,以依次加一的规律出现。证明ddr的数据读写过程无误。