用户工具

站点工具


icore3_fpga_16

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
icore3_fpga_16 [2019/12/23 17:44]
zhangzheng 创建
icore3_fpga_16 [2022/03/18 15:44] (当前版本)
sean
行 1: 行 1:
-[[http://www.cnblogs.com/xiaomagee/p/5507488.html]]+|  **银杏科技有限公司旗下技术文档发布平台** ​ |||| 
 +|技术支持电话|**0379-69926675-801**||| 
 +|技术支持邮件|Gingko@vip.163.com||| 
 +^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ 
 +|  V1.0  |  2019-12-25 ​ |  gingko |  初次建立 ​ | 
 + 
 + 
 +===== 实验十六:基于SPI总线的ARM+FPGA通信实验 ===== 
 + 
 +==== 一、实验目的与意义 ==== 
 +  - 了解SPI通信的基本原理。 
 +  - 掌握SPI通信基于FPGA的实现方法。 
 +  - 学习基于SPI总线的ARM+FPGA数据传输应用。 
 +==== 二、实验设备及平台 ==== 
 +  - iCore3 双核心板( FPGA型号为EP4CE10F17,ARM型号为STM32F407IGT6)。[[https://item.taobao.com/item.htm?​spm=a1z10.1-c.w4024-251734887.3.5923532fXD2RIN&​id=524229438677&​scene=taobao_shop|点击购买]] 
 +  - Blaster(或相同功能的)仿真器和USB线缆。[[https:​//item.taobao.com/​item.htm?​spm=a1z10.5-c.w4002-251734908.13.20822b61MmPeNN&​id=554869837940|点击购买]] 
 +  - Micro USB线缆。 
 +  -QuartusII开发软件(本实验中使用的是13.1版本)。 
 +==== 三、实验原理 ==== 
 +  * **SPI简介** 
 +    * 串行外设接口(SPI)可与外部器件进行半双工/​全双工的同步串行通信。通常SPI通过4个引脚与外部器件连接: 
 +    * MISO:主输入/​从输出数据。从模式下发送数据,主模式下接受数据。 
 +    * MOSI:主输出/​从输入数据。从模式下接受数据,主模式下发送数据。 
 +    * SCLK:主器件的串行时钟输出和从器件的串行时钟输入 
 +    * CS:从器件选择。挂载多个从器件时,此信号是“片选”信号。 
 +  * 通过FPGA建立的SPI模块对外提供SCLK、CS、MOSI、MISO接口,与STM32的SPI相连接,Commix串口精灵与STM32通过串口连接,实现三者之间的通信。本实验中,Commix串口精灵向STM32发送数据,STM32的RXD端口接收数据,然后,通过SPI把数据发送至FPGA,STM32起到一个桥梁的作用。程序运行后,FPGA收到数据向STM32发送数据,经过STM32发送至Commix串口精灵显示出来,并辅以LED显示进行验证。 
 +  * 本实验中SPI通信双方只有ARM和FPGA,因此信号按照单个主器件/​单个从器件的方式连接,既MOSI引脚连接在一起,MISO引脚连接在一起。通过这种方式,主器件和从器件之间以串行方式传输数据(最高有效位在前)。下图为信号连接图:  
 +  
 +{{ :​icore3:​icore3_fpga_16_1.png?​direct&​700 |图1  信号连接图}} 
 +  
 +==== 四、代码讲解 ==== 
 + 
 +  * SPI总线器件有主从之分,本实验中ARM作为主器件,FPGA作为从器件。所以在ARM和FPGA之间,SCLK信号和CS信号是由ARM发送给FPGA的。当ARM发送数据时,控制数据和SCLK同步输出,拉高CS信号。当ARM接收数据时,控制SCLK输出和CS电平为低,并接收数据。 
 +  * FPGA作为从器件,要实现两个工程,即数据的接收和数据的发送。下面分两部分介绍。 
 +=== 1.FPGA接收数据。 === 
 +  * 由ARM提供的数据和SCLK是同步的,那么FPGA接收数据的触发信号可以选用SCLK。阅读过STM32F407手册能够发现,它的SPI总线发送数据时,是先发送高位,再发送低位的。因此,FPGA接收到的数据也是先接收到高位数据,再接收到低位数据。这里可以采用位移操作,将数据依次存入寄存器的相应位。代码实现如下所示。 
 +<code verilog>​ 
 +    always@(posedge spi_clk or negedge rst_n) 
 + if(!rst_n) 
 + data_in<​=40'​d0;​ 
 + else if(!spi_cs) 
 + data_in<​=40'​d0;​ 
 + else 
 + data_in<​={data_in[38:​0],​spi_mosi_r};//​将SPI输入数据存入data_in寄存器 
 +</​code>​ 
 +  * 为了验证SPI通信的正确性,可以通过点亮LED来具象化实验效果。iCore3板卡上FPGA连接有三色LED。那么,可以通过发送“ledr、ledg、ledb”指令,点亮LED相应色彩,进行程序正确性的验证。由于这些指令是ASCII码格式,而SPI传输的是二进制模式,所以FPGA进行接收指令判断时,对比的为指令的二进制值。为了判断数据是否接收完毕,代码中做了“回车”指令检测,既检测到“回车”指令的ASCII码之后,判断为数据接收完毕,然后将接收数据“回车”指令之前的数据和LED点亮指令做对比,从而控制三色LED的显示。代码实现如下: 
 +<code verilog>​ 
 +        always@(posedge spi_clk or negedge rst_n) 
 +     if(!rst_n) 
 + data<​=32'​d0;​ 
 +     else if(data_in[7:​0] == 8'​d13)//​“回车”键对应的ASCII码的值为8‘d13 
 + data<​=data_in>>​8;//​取回车键之前的值 
 +      ​else 
 + data<​=data;​ 
 + //​对比接收数据//​ 
 + reg [2:​0]led;​  
 +        always@(posedge CLK_25M or negedge rst_n) 
 + if(!rst_n) 
 +    led <= 3'​b111;​ 
 + else if (data == ledr) 
 + led <= 3'​b011; ​                 //​红灯亮 
 + else if (data == ledg) 
 + led <= 3'​b101;​ //​绿灯亮 
 + else if (data == ledb) 
 + led <= 3'​b110;​ //​蓝灯亮 
 +</​code>​ 
 +=== 2.FPGA发送数据。 === 
 +  * FPGA发送数据的时候,ARM是接收方,但是发送时钟还是由ARM提供,即CS信号为低时,FPGA按照SCLK的时序发送数据,实验中,FPGA发送至ARM的内容是字符串“hello”对应ASCII码的二进制数。按照SPI总线定义,先发送高位,再发送低位。代码如下: 
 +<code verilog>​ 
 +always@(negedge ​ spi_clk or negedge rst_n) 
 +        if(!rst_n) 
 +            begin  
 +                spi_miso<​=1;​ 
 +                data_out<​=hello;​ 
 +            end 
 +        else    if(!spi_cs ) 
 +                begin 
 +                    spi_miso <= data_out[39];​ //​将最高位通过SPI总线发送出去 
 +                    data_out<​=data_out<<​1;​ 
 +                end 
 +            else 
 +                begin 
 +                    spi_miso<​=1'​b1;​ 
 +                    data_out<​=hello;​ 
 +                end 
 +</​code>​ 
 +==== 五、操作流程和测试结果 ==== 
 + 
 +=== 1.操作步骤 === 
 +  * 把仿真器与iCore3的SWD调试口连接(直接相连或者通过转换器相连); 
 +  * 将USB-Blaster与iCore3的JTAG调试口相连; 
 +  * 将跳线帽插在USB UART; 
 +  * 把iCore3(USB_UART)通过Micro USB线与计算机连接,为iCore3供电; 
 +  * 打开Commix串口精灵,找到对应的端口打开; 
 +  * 打开Quartus II开发环境,并打开实验工程;  
 +  * 烧写FPGA程序到iCore3上; 
 +  * 打开Keil MDK开发环境,并打开实验工程;  
 +  * 烧写ARM程序到iCore3上; 
 +  * 输入串口命令,观察实验现象。 
 +=== 2.实验结果 === 
 +|串口发送命令格式 ARM_LED现象| FPGA_LED现象| 
 +|LEDR\CR\LF| 红灯亮| 红灯亮| 
 +|LEDG\CR\LF| 绿灯亮| 绿灯亮| 
 +|LEDB\CR\LF| 蓝灯亮| 蓝灯亮| 
 +  * 在Commix上发送命令后,对应的ARM和FPGA的LED灯亮,同时接收显示:“hello”表示实验成功,如下面两图所示: 
 +{{ :​icore3:​icore3_fpga_16_2.png?​direct |图2  串口指令发送}} 
 +{{ :​icore3:​icore3_fpga_16_3.png?​direct |图3  实验效果展示}}
icore3_fpga_16.1577094270.txt.gz · 最后更改: 2019/12/23 17:44 由 zhangzheng