概述
外部存储器接口( 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核有以下功能特性:
接口采用axi4 slave memory map,位宽支持32、64bits;支持axi4增量和包传输,支持窄带和非对其传输;最多支持4个外部存储器;支持奇偶校验和流水线级同步sram等;参数配置
axi data width:axi总线位宽选择32位;number of memory banks:存储器个数这里选择1即可;axi id位宽和存储空间地址选择默认配置;
memory type:内存型号选择异步sram;data width:数据位宽选择32位,与axi总线位宽保持一致;timing parameters参数默认是100mhz axi时钟下的配置;
advanced configuration:高级配置选项保持默认,不用配置ip核内部寄存器;vivado工程创建
本工程是在microblaze最小系统工程基础上进行创建,利用axi-emc在microblaze软核端对fpga端进行emif数据读写,进而实现ps和pl端数据交互功能。
搭建block design
在microblaze最小系统的block design工程中添加axi-emc ip核,并对参数进行配置;将ip核的 rdclk 接口以及 s_axi_aclk 接口与mig ip提供的100mhz用户时钟接口 ui_clk 进行连接;将 mem_a (地址)、 mem_cen (片选)、 mem_dq_o (输出数据)、 mem_dq_i (输入数据)、 mem_oen (读使能)、 mem_wen (写使能)接口引出,在顶层文件中会进行调用。最终搭建完成的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};endalways@(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 endalways@(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 endila_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 #include platform.h#include xil_io.h#include xparameters.h#include xuartlite.h#include xuartlite_l.hint 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地址下读出。
无人驾驶系统的设计与实现解决方案
小米5x和红米note4x对比评测
焊接机器人的组成有哪些部件
SMT贴片加工有什么要求
库克回应iPhone14Pro供不应求
基于Xilinx FPGA AXI-EMC IP的EMIF通信测试
日亚化宣布终结其专利案争议,获宏齐科技赔偿
脉冲信号用万用表怎么测?
湿法贴膜技术在HDI细线路制作工艺中的应用(三)
三星Neo QLED 8K无障碍电视,让更多人“看见”更美好的视界
华为愿与美国政府共同探讨和建立保障网络安全的有效测试机制
美国声称限制华为使用美国技术和软件在国外设计和制造其半导体的能力
如何使用KD2204M/SMB2204M驱动器驱动步进电机?
优傲机器人助力新西兰锁具制造商提高生产率方案
realme真我X50对比小米9 Pro 5G版 realme真我X50更胜一筹
三座大山下 中国移动如何确保利润增长?
苹果花10亿美元收购英特尔智能手机调制解调器业务
大数据分析挖掘技术助力城市交通拥堵治理
EMC测试从连接器、电缆开始
Linux中的可用磁盘空间如何检查?