这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| icore3_fpga_16 [2020/12/18 10:00] zgf [四、代码讲解] | icore3_fpga_16 [2022/03/18 15:44] (当前版本) sean | ||
|---|---|---|---|
| 行 2: | 行 2: | ||
| |技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
| |技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
| - | |技术论坛|http://www.eeschool.org||| | ||
| ^ 版本  ^ 日期  ^ 作者  ^ 修改内容  ^ | ^ 版本  ^ 日期  ^ 作者  ^ 修改内容  ^ | ||
| | V1.0 | 2019-12-25  | gingko | 初次建立  | | | V1.0 | 2019-12-25  | gingko | 初次建立  | | ||
| 行 37: | 行 36: | ||
| * 由ARM提供的数据和SCLK是同步的,那么FPGA接收数据的触发信号可以选用SCLK。阅读过STM32F407手册能够发现,它的SPI总线发送数据时,是先发送高位,再发送低位的。因此,FPGA接收到的数据也是先接收到高位数据,再接收到低位数据。这里可以采用位移操作,将数据依次存入寄存器的相应位。代码实现如下所示。 | * 由ARM提供的数据和SCLK是同步的,那么FPGA接收数据的触发信号可以选用SCLK。阅读过STM32F407手册能够发现,它的SPI总线发送数据时,是先发送高位,再发送低位的。因此,FPGA接收到的数据也是先接收到高位数据,再接收到低位数据。这里可以采用位移操作,将数据依次存入寄存器的相应位。代码实现如下所示。 | ||
| <code verilog> | <code verilog> | ||
| - | always@(posedge spi_clk or negedge rst_n) | + | always@(posedge spi_clk or negedge rst_n) | 
| if(!rst_n) | if(!rst_n) | ||
| data_in<=40'd0; | data_in<=40'd0; | ||
| 行 47: | 行 46: | ||
| * 为了验证SPI通信的正确性,可以通过点亮LED来具象化实验效果。iCore3板卡上FPGA连接有三色LED。那么,可以通过发送“ledr、ledg、ledb”指令,点亮LED相应色彩,进行程序正确性的验证。由于这些指令是ASCII码格式,而SPI传输的是二进制模式,所以FPGA进行接收指令判断时,对比的为指令的二进制值。为了判断数据是否接收完毕,代码中做了“回车”指令检测,既检测到“回车”指令的ASCII码之后,判断为数据接收完毕,然后将接收数据“回车”指令之前的数据和LED点亮指令做对比,从而控制三色LED的显示。代码实现如下: | * 为了验证SPI通信的正确性,可以通过点亮LED来具象化实验效果。iCore3板卡上FPGA连接有三色LED。那么,可以通过发送“ledr、ledg、ledb”指令,点亮LED相应色彩,进行程序正确性的验证。由于这些指令是ASCII码格式,而SPI传输的是二进制模式,所以FPGA进行接收指令判断时,对比的为指令的二进制值。为了判断数据是否接收完毕,代码中做了“回车”指令检测,既检测到“回车”指令的ASCII码之后,判断为数据接收完毕,然后将接收数据“回车”指令之前的数据和LED点亮指令做对比,从而控制三色LED的显示。代码实现如下: | ||
| <code verilog> | <code verilog> | ||
| - | always@(posedge spi_clk or negedge rst_n) | + | always@(posedge spi_clk or negedge rst_n) | 
| - | if(!rst_n) | + | if(!rst_n) | 
| data<=32'd0; | data<=32'd0; | ||
| - | else if(data_in[7:0] == 8'd13)//“回车”键对应的ASCII码的值为8‘d13 | + | else if(data_in[7:0] == 8'd13)//“回车”键对应的ASCII码的值为8‘d13 | 
| data<=data_in>>8;//取回车键之前的值 | data<=data_in>>8;//取回车键之前的值 | ||
| else | else | ||
| 行 56: | 行 55: | ||
| //对比接收数据// | //对比接收数据// | ||
| reg [2:0]led; | reg [2:0]led; | ||
| - | always@(posedge CLK_25M or negedge rst_n) | + | always@(posedge CLK_25M or negedge rst_n) | 
| if(!rst_n) | if(!rst_n) | ||
| - | begin | + | led <= 3'b111; | 
| - | led <= 3'b111; | + | |
| - | end | + | |
| else if (data == ledr) | else if (data == ledr) | ||
| led <= 3'b011;  //红灯亮 | led <= 3'b011;  //红灯亮 | ||