概述
外部存储器接口( EMIF )通信常用于FPGA和DSP之间的数据传输,即将FPGA作为DSP的外部SRAM、或者协同处理器等。Xilinx提供了AXI-EMC IP核,将其挂载到AXI总线用于EMIF通信,也可方便地实现 PL (FPGA)和 PS (MicroBlaze或者ARM)之间的数据交互功能。
本文主要介绍一下该IP核的使用,以及创建Vivado工程对EMIF通信功能进行板上测试。
软硬件平台
软件平台 :Vivado 2017.4;
硬件平台 :xc7a35tftg256-1;
AXI-EMC
功能特性
AXI-EMC IP核是一种可以支持各种型号内存的控制器,和EMIF接口类似,利用它可以实现数据的交互和通信。该IP核有以下功能特性:
参数配置
Vivado工程创建
本工程是在MicroBlaze最小系统工程基础上进行创建,利用AXI-EMC在MicroBlaze软核端对FPGA端进行EMIF数据读写,进而实现PS和PL端数据交互功能。
搭建Block Design
最终搭建完成的Block Design如下图所示:
修改顶层文件
在生成的顶层文件中添加以下代码,用于实现FPGA端基本的EMIF通信功能,以及添加ILA模块实现对EMIF接口信号的实时观察。
reg [31:0] data_reg,mem_dq_i_reg;
reg [2:0] mem_wen_r,mem_oen_r;
assign mem_dq_i = mem_dq_i_reg;
always@(posedge ui_clk) begin
mem_wen_r <= {mem_wen_r[1:0],mem_wen};
mem_oen_r <= {mem_oen_r[1:0],mem_oen};
end
always@(posedge ui_clk)
if(mem_wen_r[2:1] == 2'b10) begin
case(mem_a[17:2])
16'h5555:
data_reg <= mem_dq_o;
default:
data_reg <= data_reg;
endcase
end
always@(posedge ui_clk)
if(mem_oen_r[2:1] == 2'b10) begin
case(mem_a[17:2])
16'haaaa:
mem_dq_i_reg <= data_reg;
default:
mem_dq_i_reg <= mem_dq_i_reg;
endcase
end
ila_0 ila_0_u0
(
.clk (ui_clk),
.probe0 (mem_a),
.probe1 (mem_cen),
.probe2 (mem_dq_i),
.probe3 (mem_dq_o),
.probe4 (mem_oen),
.probe5 (mem_wen),
.probe6 (uart_rtl_0_txd)
);
创建SDK工程
在SDK软件中,采用Xilinx提供的Hello World工程,在helloworld.c文件中添加以下代码,用于实现MicroBlaze软核每隔一定时间在FPGA端0x55554地址下写入32位十进制数据:111,并从0xaaaa4地址将该数据读出。
#include < stdio.h >
#include "platform.h"
#include "xil_io.h"
#include "xparameters.h"
#include "xuartlite.h"
#include "xuartlite_l.h"
int ii,data;
int main()
{
init_platform();
print("EMIF TESTnr");
while(1)
{
Xil_Out32(XPAR_EMC_0_S_AXI_MEM0_BASEADDR+0x5555*4,111);
data=Xil_In32(XPAR_EMC_0_S_AXI_MEM0_BASEADDR+0xaaaa*4);
for(ii=0;ii< 100;ii++);
}
cleanup_platform();
return 0;
}
功能测试
该Vivado工程利用AXI-EMC IP核实现异步SRAM接口,在MicroBlaze软核CPU和FPGA之间进行基础的EMIF通信。该工程为实现PS和PL之间的数据交互功能提供一种很好的思路。
FPGA板上测试结果如上图所示,MicroBlaze软核往FPGA 0x55554地址下写入32位十进制数据111,FPGA将该数据进行寄存,供软核从0xaaaa4地址下读出。
全部0条评论
快来发表一下你的评论吧 !