这是本文档旧的修订版!
实验十三:基于ARM+FPGA的FSMC复用模式通信
一、实验目的与意义
了解FSMC的复用模式及时序
掌握ARM和FPGA基于FSMC复用模式的通信设计方法
二、实验设备及平台
iCore3 双核心板( FPGA型号为EP4CE10F17,ARM型号为STM32F407IGT6)。
Blaster(或相同功能的)仿真器和USB线缆。
Micro USB线缆。
QuartusII开发软件(本实验中使用的是13.1版本)。
三、实验原理
本实验要实现的目的是将ARM的FSMC外设连接到FPGA,并实现数据的传输。那么具体实验内容可以设计为将STM32F407连接到FPGA,并通过FSMC外设实现向FPGA发送和接受数据。FPGA并没有FSMC外设,要实现和STM32之间的通信,则必须对FSMC信号进行处理。本实验为了验证ARM和FPGA之间的数据传输是否正确,在STM32程序中自动生成数据,通过FSMC向FPGA写数据并读回进行对比判断。两组数据相同,说明通信正常,点亮绿色LED;不同,则说明通信异常,点亮红色LED。而FPGA除了对FSMC的信号进行处理,用于接收数据之外,还例化了RAM,用于缓存ARM发送的数据。
所以整体思路是ARM将FPGA内的RAM当成外挂存储器,通过FSMC向RAM中写入自动生成的数据,并读回进行对比,从而验证ARM和FPGA之间基于FSMC的通信。系统框架如下图所示:
FSMC的复用模式
四、代码讲解
//-------------------------rd_wr ----------------------------//
assign rd = (csn | rdn);
assign wr = (csn | wrn);
//-------------------------ab ------------------------------//
reg [24:0]address;
always @ (posedge nadv or negedge RST_n)
begin
if(!RST_n)
begin
address <= 25'd0;
end
else
begin
address <= {ab,db};
end
end
//-------------------------clk ----------------------------//
reg wr_clk1,wr_clk2;
always @(posedge PLL_100M or negedge RST_n)
begin
if(!RST_n)
begin
wr_clk1 <= 1'd1;
wr_clk2 <= 1'd1;
end
else
{wr_clk2,wr_clk1} <= {wr_clk1,wr}; //提取读写时钟
end
wire clk = (!wr_clk2 | !rd);
//将rd和wr信号结合起来,读写都可以用,取反是因为两个信号都是低电平有效,wr延后2个100M时钟周期,是为了保证存储数据的时候,时钟的上升沿在数据的稳定期。
五、操作流程和测试结果
1.操作步骤
将仿真器和iCore3双核心板连接。
给开发板供电。
将编译成功的FPGA代码和ARM代码分别下载到开发板。
观察现象,亦可通过signalTap查看相关信号,判断时序和逻辑是否有误。
2.实验结果