AXI总线之DMA的实现

在zynq系列中,PS与PL的数据交互主要通过AXI总线进行,对于少量数据的传输(如寄存器配置、状态信息获取等)常常采AXI4-LITE。对于大量的、高速的数据传输,常采用AXI4-FULL。虽然官方也有相应的DMA模块,但是本着“自给自足”的原则,结合“适合自己的才是最好的”的方针,决定自己做一个基于AXI的DMA控制器。

设计目标:

 PHY芯片挂在PL端,完成PL端网口与PS端的数据交换,注意:PL和PS都会自动向网口发送数据。

设计过程: 

由于PL和PS端都会自动向网口发送数据,因此,将PHY直接挂载在PS端是不可取的,需要做一级网口数据的分离与复用。

按照设想,FPGA接收到一个IP数据包后,将数据自动发送给CPU,发送完成后,FPGA产生中断,随后CPU进行处理,若有返回结果,由FPGA自动读取并向网口发送数据。

网上有很多自定义IP的设计方法,在这里就不在赘述。

这里主要总结下AXI4协议接口的设计方法。 AXI4协议接口主要有两种方法:一是由Vivado外设自定义的模板生成,需要对AXI4有个基本的了解。二是由HLS产生,需要对HLS的接口有一定的了解。

比起直接修改AXI4的模板,个人比较推荐HLS进行接口设计,HLS比起AXI4模板来说,可以免去很多的时序修改问题。

一般而言,IP的数据包长度不超过2K,因此,在FPGA端需要一个2K的存储器。长度字段11个比特。

接收端的参考代码如下:

void phy_rec_dma(ap_uint<8> in[2048],ap_uint<11> *in_len,ap_uint<8> out[2048],ap_uint<11> *out_len)
{
	*out_len = *in_len;
	for(int i=0;i<*in_len;i++){
		out[i] = in[i];
	}
}

随后,将in[2048]约束成FIFO或者RAM,将out约束成m-axi并设置突发长度,将out_len约束成s-axilite,将默认IO约束成s-axilite。综合实现后,通过IP导出即可。

猜你喜欢

转载自blog.csdn.net/kemi450/article/details/89946262