本章节主要使用ddr3做为缓存,串口接收的数据通过ddr缓存后通过发送模块发送出去。我们之前的串口发送数据通过ddr缓存是一个突发长度,本篇文章将会传输64个突发长度。整体的功能框图所下图所示
因本博文使用的是上个章节的图片数据,所以数据大小是1024*768*3 = 2359296(byte),也就是2359296个八位,因之前的输入的rx_data_convert模块是八转32位,而我们输入的数据是一个24位的图片数据,所以rx_data_convert模块会将高8位添0凑成一个32位数据
本章节的图片数据存放到uart_data.txt文件里
将 uart_data.txt里的数据复制到串口调试助手
串口调试助手里的数据如下图所示
将程序下载到黑金开发板
注意串口调试助手的波特率设置为115200,发送和接收都设置为Hex
点击发送后可以看到串口待发送的数据量刚好是2359296byte,也就是1024*768*3的图片数据
可以看到黑金开发板的uart的rx灯一直在闪烁,说明一直在接收串口发送的数据
串口接收结束后,可以看到串口发送开始往电脑发送数据
串口发送结束后,可以看到数据量刚好是3145728byte,和我们计算的一样,也就是1024*768*4,为什么是1024*768*4而不是输入的1024*768*3,因为我的输入转换模块将24位的图片数据高位添0一共凑成32位数据,所以是1024*768*4 = 3145728byte
从上面串口截图数据可以看出高位都是添加0的,如下图所示
程序说明
突发长度设置为64
突发写使能设置为62产生一次突发写突发
//突发写使能
always@(posedge ui_clk or negedge i_rst_n)begin
if(!i_rst_n)
wr_len_en <= 1'd0;
else if(ddr_wr_end)
wr_len_en <= 1'd0;
else if(rd_len_en)
wr_len_en <= 1'd0;
else if(wr_len_done)
wr_len_en <= 1'd0;
else if(rd_data_count >= 9'd62)
wr_len_en <= 1'd1;
end
突发读使能设置为64产生一次突发读突发
//突发读使能
always@(posedge ui_clk or negedge i_rst_n)begin
if(!i_rst_n)
rd_len_en <= 1'd0;
else if(ddr_rd_end)
rd_len_en <= 1'd0;
else if(wr_len_en)
rd_len_en <= 1'd0;
else if(rd_len_done)
rd_len_en <= 1'd0;
else if(ddr_wr_end && wr_data_count <= 9'd64)
rd_len_en <= 1'd1;
end
数据地址设置为1024*768-8
前面我们提到数据量是1024*768*4,为什么是乘以4,因为这里的ddr3数据宽度是32位的,所以乘以4,当然如果ddr的数据宽带是16位的,那么就是乘以2
整体的工程如下,还是挺长的,我这里只对部分重要的设置进行说明,其它的大家可以参考工程自己慢慢看
这个工程测了几次了每次测试总是接收的数据量不对,以为是工程的问题,然后通过ila各种抓数据发现读和写的地址都没有错,最后发现接收和发送的时间比较长,一直将开发板放到哪里自己发送和接收,然后电脑运行一段时间360出现弹窗屏保,居然会让串口中断一下,所以一直导致接收的数据不对,搞了好几天才发现是弹窗导致的,真是无语了,然后将弹窗关闭后,果然接收的数据是对的,希望大家不要碰到我踩过的坑
工程链接:https://pan.baidu.com/s/17pZoHgK_Y_ajleSD320yTA
提取码:gv3w