|**银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801** ||| |技术支持邮件|Gingko@vip.163.com ||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-1-21 | gingko | 初次建立 | ===== 实验十四:基于ARM+FPGA的FSMC非复用模式通信 ===== ==== 一、实验目的与意义 ==== - 了解FSMC的非复用模式及时序 - 掌握ARM和FPGA基于FSMC非复用模式通信的设计方法 ==== 二、实验设备及平台 ==== - iCore3 双核心板( FPGA型号为EP4CE10F17,ARM型号为STM32F407IGT6)[[https://item.taobao.com/item.htm?id=524229438677|点击购买]]。 - Blaster(或相同功能的)仿真器和USB线缆[[https://item.taobao.com/item.htm?id=554869837940|点击购买]]。 - Micro USB线缆。 - QuartusII开发软件(本实验中使用的是13.1版本)。 ==== 三、实验原理 ==== * 本次实验是要实现ARM和FPGA在FSMC非复用模式下通信的设计。ARM外设FSMC在连接NOR型FLASH时,可以设置为复用模式和非复用模式,本实验就是在FSMC非复用模式下,实现ARM和FPGA之间的数据传输。 * 具体实验内容可以设计为,将STM32F407的引脚连接到FPGA,FSMC配置为非复用模式,向FPGA发送和接受数据。本实验为了验证ARM和FPGA之间的数据传输是否正确,在STM32程序中自动生成数据,通过FSMC向FPGA写数据并读回进行对比判断。两组数据相同,说明通信正常,点亮绿色LED;不同,则说明通信异常,点亮红色LED。FPGA例化了RAM,用于缓存ARM发送的数据,并对FSMC的信号进行处理,实现数据的接收。 * 所以整体思路是ARM将FPGA内的RAM当成NOR FLASH型外挂存储器,将FSMC配置为非复用模式。通过FSMC向RAM中写入自动生成的数据,并和读回数据进行对比,从而验证ARM和FPGA之间基于FSMC的通信。系统框架如下图所示: {{ :icore3:icore3_fpga_14_1.png?direct&500 |图13-1 系统框架图}} * 这里主要讲一下FPGA对FSMC信号的处理。下图是FPGA和ARM之间的FSMC信号连接。 {{ :icore3:icore3_fpga_14_2.png?direct&500 |图13-2 FSMC信号连接图}} * WR和RD分别是写使能信号和读使能信号。 * CS0表示片选,低电平有效。 * NADV是地址有效信号,非复用模式下并未使用此信号。 * A[24:16]表示存储器地址数据。 * DB[15:0]双向传输IO口,在非复用模式下,只发送和接收数据。 **FSMC的非复用模式** * 所谓非复用模式,就是A[24:16]地址线发送地址,DB[15:0]数据传输线只发送数据。本实验FPGA例化的RAM深度为512字节,所以地址线只需A[24:16]的低9位便可。由于地址线和数据线是相互独立的,因此不需要NADV信号进行判断,驱动较为简单。 ==== 四、代码讲解 ==== * 本实验是基于ARM和FPGA的双核心实验,工程分为ARM部分和FPGA部分。ARM部分主要是配置外设,以及通过程序产生数据并通过FSMC传输到FPGA内。FPGA部分则是接收FSMC传输的信息,并根据信息进行RAM的读写操作。下面主要讲一下FPGA代码。 * 首先是提取读写使能信号,代码如下: //-------------------------rd_wr ----------------------------// assign rd = (csn | rdn); assign wr = (csn | wrn); * 下面这段代码中,先是对wr信号做了100MHz时钟延两拍处理,然后取反,结合(!rd)信号控制clk。wr信号延两拍取反是为了向RAM写数据时,clk的上升沿在数据的稳定期。取反是因为两个信号都是低电平有效,而RAM是高电平有效。或操作是将两个信号合成一个clk信号。因为wr和rd信号并不冲突,因此,读RAM和写RAM都可以通过这个clk来驱动。 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}; //提取写时钟,延2拍使取反后的时钟上升沿在数据的稳定期。 end wire clk = (!wr_clk2 | !rd);//将写和读时钟信号结合作为RAM的驱动时钟。两个信号都是低有效,因此取反。 * 由于非复用FSMC,因此可以将地址信号直接连接到RAM的地址信号端口,数据信号直接连接到RAM的数据端口。RAM信号是高电平有效,读写使能信号取反后连接到RAM的读写使能端口。代码较为简单,结合时序理解代码对信号做的处理。 * 波形图参考如下: {{ :icore3:icore3_fpga_14_3.png?direct&900 |图13-3 信号波形图}} * 通过上图可以看到,wr_clk2信号和rd信号分别处于不同的时期,clk信号和(!rd)信号同步,和(!wr_clk2)同步。且地址寄存器address和数据db的有效值符合程序设置。说明ARM成功通过FSMC读写RAM内的数据。 ==== 五、操作流程和测试结果 ==== === 1.操作步骤 === - 将仿真器和iCore3双核心板连接。 - 给开发板供电。 - 将编译成功的FPGA代码和ARM代码分别下载到开发板。 - 观察现象,亦可通过signalTap查看相关信号,判断时序和逻辑是否有误。 === 2.实验结果 === * 观察iCore3双核心板,可以看到ARM•LED和FPGA•LED均为绿色,表示实验成功。 {{ :icore3:icore3_fpga_14_4.png?direct&500 |图13-4 实验效果图}} * 本次实验一定要理解FSMC的复用模式,及其数据传输时的信号时序变化,这样才能掌握基于FSMC的传输设计。关于FSMC的详细介绍,可以查阅《STM32F4xx中文参考手册》。