FPGA大赛【五】具体模块设计--AXI总线数据传输
【注】该项目是我们团队参加2019届全国大学生FPGA大赛的作品,系统主要实现视频任意角度旋转。该项目最终晋级决赛,并获得紫光同创企业特别奖。该系列文章介绍我们团队的作品。关注公众号“数字积木”对话框回复 FPGA2019 ,即可获得该项目的工程源代码,详细的文档说明,MATLAB仿真代码。
AXI总线数据传输方案
4.2.1总体设计
经过摄像头获取到图像数据后,经过图像数据的预处理后,将图像数据缓存到ddr中。显示模块再从DDR中读取图像数据,显示到显示屏上。
图像数据通过AXI接口写入到DDR中,通过AXI总线从DDR中读取。这期间要跨三个时钟域。分别是 摄像头数据输出时钟,AXI读写时钟,显示屏驱动时钟。在跨时钟域传输数据时,数据都要经过fifo缓存。
分别设置两个fifo模块,用于跨时钟域的数据缓存。一个设置在摄像头数据模块和DDR中,用于缓存向DDR中写入的数据。一个设置在 DDR和显示屏驱动模块之间,用于缓存从DDR中读取出的数据。
在将数据从摄像头传输到DDR中时,当fifo中的数据数量大于预设值,启动一次突发写传输,将缓存在fifo中的数据缓存到DDR的预设的地址中。
在将数据从DDR传输到显示控制模块中时,当fifo中的数据数量小于预设值,启动一次突发读传输,从DDR的预设的地址中读取出图像数据,缓存到fifo中,共显示模块读取。
4.2.2数据的写入方案
AXI的写传输由fifo中缓存的数据数量触发,当储存在fifo中的数据大于预设值时,进行一次突发传输,将缓存在fifo中的数据写入到DDR中。
当开始启动一次突发传输时,先发送突发传输的起始地址,地址信号通过axi_awaddr端口传输。同时将 axi_awvalid 信号置高,用与通知主机地址通道有有效的地址信息。从机通过 AXI_AWREADY 信号来标志接收到该地址信息。主机接收到 AXI_AWREADY 有效信号后,将 axi_awvalid 置低,直到下一次突发传输,再重复该过程。
启动一次突发传输时,便将 axi_wvalid 置为有效,同时将第一个要发送的数据放置在 axi_wdata 总线上。AXI写通道的数据(axi_wdata)要和axi_wvalid 对齐,从机通过 AXI_WREADY 来标识从机开始接收数据,待从机的AXI_WREADY 有效时,表示从机已准备好接受数据,在 AXI_WREADY 有效的后,从机在下一个时钟寄存接收该数据。此时主机便可将 AXI_WREADY 作为读使能信号,在下一个时钟输出突发传输的下一个数据。重复该步骤,直到一次突发传输完成。即在 AXI_WREADY 有效时,主机在下一个时钟发送新数据,从机在下一时钟寄存该时钟接收到的数据。
主机通过 axi_wlast 信号来标记一次突发传输的最后一个数据。该信号由主机产生,通过设置一个计数器来记录突发传输的数据的数量。axi_wlast 信号要提前一个时钟判断使能,和要发送的最后一个数据对齐。当计数值到倒数第二个数据时,使能 axi_wlast 信号,使之在下一个时钟有效,这样便可以将 axi_wlast 信号和最后一个发送的数据对齐。
在紫光的官方fifo中,数据输出段不会直接输出当前读指针指向的数据,需要提供一个读使能信号后,数据才会在下一时钟在读数据端口输出。故在启动突发传输时,也要提供一个时钟的读fifo使能信号,将第一个要写入的数据从fifo中读出。在从机的 AXI_WREADY 有效后,从机开始接受数据,主机也要从fifo中读出新的数据送给从机。
Fifo的数据是在该时钟使能,下一个时钟输出。读使能信号和数据输出有一个时钟的延迟。
主机的读fifo使能信号设置为
rd_fifo_en = rd_first_data || ( axi_wvalid && M_AXI_WREADY && ( !axi_wlast ) );
rd_first_data:启动突发传输时的读使能信号,一个时钟有效。
axi_wvalid && M_AXI_WREADY : 在主机发送有效且从机接受数据时,读取fifo中的数据。
!axi_wlast : 发送最后一个数据时,该数据通过上一个时钟的读使能信号已经读出,在该周期,不再读取新的数据。
4.2.3数据的读出方案
图像数据储存在fifo中,显示驱动模块用于控制图像的显示,通过从DDR中读出图像数据,送给显示屏进行显示。数据从DDR中读出,送给显示驱动模块时,也要经过fifo缓存。
主机先发送读地址(aw_araddr) 以及地址有效信号( aw_arvalid )。从机接收到 aw_arvalid 有效信号后,在接收地址信号的同时 ,返回 AW_ARREADY 有效信号,标志地址已经接收完成。
在主机接收到 AXI_ARREADY 有效信号后,便可以开始进行读数据的接收,主机等待从机发送的 AXI_ARVALID 有效信号,此信号有效时,表明读数据总线 AXI_RDATA 上此时有有效的输出数据。此时主机发送 axi_rready 信号,通知从机主机已经开始接收数据,此时从机便可以发送新的数据。
从机在接收到有效数据后,需要将读出的数据在fifo中进行缓存。该fifo的使能信号 设置为如下:
rd_fifo_en = ( axi_rready && AXI_RVALID );
AXI_RVALID : 该信号表示读数据总线上有有效的数据。
axi_rready:该信号有效后,从机在下一个周期才发送新的数据。在该信号无效时,从机发送的数据保持不变。故只有在该信号有效时,将输出数据端口的数据写入到fifo中即可。
Fifo端的写数据,写使能和写数据对齐,数据在下一个时钟写入到fifo中去。
本文完!!!
欢迎关注,更精彩的内容等着你!