实验现象:

1、先烧写ARM程序,然后烧写FPGA程序。

2、打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO。

3、通过串口精灵发送命令可以控制ARM·LED和FPGA·LED。

命令格式
LEDR\CR\LF ARM·LED、FPGA·LED亮
LEDG\CR\LF ARM·LED、FPGA·LED亮
LEDB\CR\LF ARM·LED、FPGA·LED亮

核心代码:

int main(void)
{ /* USER CODE BEGIN 1 */
int i;
char buffer[];
char spi_buffer[];
/* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI4_Init();
MX_USART6_UART_Init(); /* USER CODE BEGIN 2 */
usart6.initialize();
usart6.printf("Hello,I am iCore4!\r\n");
LED_GREEN_ON;
/* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while ()
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
if(usart6.receive_ok_flag == ){
usart6.receive_ok_flag = ;
for(i = ;i < ;i++){
buffer[i] = tolower(usart6.receive_buffer[i]);
}
//±È½Ï½ÓÊÕÐÅÏ¢
if(memcmp(buffer,"ledr",strlen("ledr")) == ){
LED_RED_ON;
LED_GREEN_OFF;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledg",strlen("ledg")) == ){
LED_GREEN_ON;
LED_RED_OFF;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledb",strlen("ledb")) == ){
LED_BLUE_ON;
LED_GREEN_OFF;
LED_RED_OFF;
}
spi4.write(strlen(buffer),(unsigned char *)buffer);
for (i = ;i < ; i++); SPI4_CS_OFF;
for(i = ; i < ; i++){ //SPI½ÓÊÕÊý¾Ý
spi_buffer[i] = spi4.send_data(0x00);
}
SPI4_CS_ON; usart6.printf(spi_buffer);
}
}
/* USER CODE END 3 */ }
module spi_ctrl(
input clk_25m,
input rst_n,
input spi_clk,
input spi_mosi,
input spi_cs,
output spi_miso,
output led_red,
output led_green,
output led_blue
);
//--------------------------parameter--------------------------//
parameter ledr = {'d108,8'd101,'d100,8'd114},
ledg = {'d108,8'd101,'d100,8'd103},
ledb = {'d108,8'd101,'d100,8'd98},
hello = {'d104,8'd101,'d108,8'd108,'d111}; //--------------------------spi_mosi---------------------------//
reg[:]i;
reg[:]data_in;
reg [:]temp_data,data; always@(posedge spi_clk or negedge rst_n)
if(!rst_n)
begin
i <= 'd0;
temp_data <= 'd0;
data <= 'd0;
data_in <= 'd0;
end
else case(i) //从高位开始接收数据,每8个spi_clk时钟接收一个Byte
'd0:
begin
i <= i + 'd1;
data_in <= {data_in[:],spi_mosi};
temp_data <= {temp_data[:],data_in};
if(data_in == 'd13)
begin
data <= temp_data;
end
else
begin
data <= data;
end
end
'd1,4'd2,'d3,4'd4,'d5,4'd6:
begin
i <= i + 'd1;
data_in <= {data_in[:],spi_mosi};
end
'd7:begin
i <= 'd0;
data_in <= {data_in[:],spi_mosi};
end
default: i <= 'd0;
endcase //--------------------------data----------------------------//
/*对比接收数据*/
reg [:]led; always@(posedge clk_25m or negedge rst_n)
if(!rst_n)
begin
led <= 'b101;
end
else if (data == ledr)
led <= 'b011; //红灯亮
else if (data == ledg)
led <= 'b101; //绿灯亮
else if (data == ledb)
led <= 'b110; //蓝灯亮 assign {led_red,led_green,led_blue} = led; //--------------------------delay----------------------------//
reg spi_clk_r;
always@(posedge clk_25m or negedge rst_n)
if(!rst_n)
begin
spi_clk_r <= 'd1;
end
else
spi_clk_r <= spi_clk; //--------------------------spi_miso----------------------------//
/*发送模块*/
reg [:]data_out;
reg [:]j;
reg spi_out;
always@(negedge spi_clk_r or negedge rst_n)
if(!rst_n)
begin
data_out <= hello;
spi_out <= 'd0;
j <= 'd0;
end
else case(j) //连续40个spi_clk_r时钟发送“hello”字符串
'd0:
begin
{spi_out,data_out[:]} <= data_out;
j <= j + 'd1;
end
'd39:
begin
{spi_out,data_out[:]} <= data_out;
data_out <= hello;
j <= 'd0;
end
default:
begin
{spi_out,data_out[:]} <= data_out;
j <= j + 'd1;
end
endcase assign spi_miso = spi_out;
//--------------------------endmodule----------------------------// endmodule

源代码下载链接:

链接:http://pan.baidu.com/s/1kUDbJoz 密码:du7e

iCore4链接:

【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验的更多相关文章

  1. 【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验

    实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...

  2. 【iCore4 双核心板_FPGA】例程十七:基于FIFO的ARM+FPGA数据存取实验

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int fsmc_read_data; ; ]; ]; char *p; /* ...

  3. 【iCore4 双核心板_FPGA】例程十二:基于UART的ARM与FPGA通信实验

    实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·LED和FPGA·LED. 核心代码: int main ...

  4. 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验

    实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·L ...

  5. 【iCore4 双核心板_FPGA】例程十五:基于单口RAM的ARM+FPGA数据存取实验

    实验现象: 写RAM命令格式:write:地址(0-255),数据(0-65535)\cr\lf 读RAM命令格式:read:地址(0-255)\cr\lf 核心代码: int main(void) ...

  6. 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int address,data; ; ]; ]; char *p; /* US ...

  7. 【iCore4 双核心板_FPGA】例程四:Signal Tapll 实验——逻辑分析仪

    实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...

  8. 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用

    实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl( input clk_25m, input rs ...

  9. 【iCore4 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入

    实验现象: 按键每按下一次,三色LED切换一次状态. 核心源代码: module key_ctrl( input clk_25m, input rst_n, input key, output fpg ...

随机推荐

  1. 通过反射的方式注入自己的ShutdownHook并清除其他HOOK

    String className = "java.lang.ApplicationShutdownHooks"; Class<?> clazz = Class.forN ...

  2. convert时间格式转换参数表

    本文摘自:http://blog.csdn.net/zc19820620/article/details/2043829 CONVERT (data_type[(length)], expressio ...

  3. Educational Codeforces Round 47 (Div 2) (A~G)

    目录 Codeforces 1009 A.Game Shopping B.Minimum Ternary String C.Annoying Present D.Relatively Prime Gr ...

  4. swoole深入学习 4. process

    swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...

  5. 打包maven后出现jar包丢失

    http://blog.csdn.net/asdfsfsdgdfgh/article/details/51373222

  6. MAC自动脚本

    链接: crontab 详细用法 定时任务 Linux crontab命令 定时任务 用法详解以及no crontab for root解决办法

  7. 利用java8对设计模式的重构

    java8中提供的很多新特性可以用来重构传统设计模式中的写法,下面是一些示例: 一.策略模式 上图是策略模式的类图,假设我们现在要保存订单,OrderService接口定义要做什么,而NoSqlSav ...

  8. 使用three.js写全景图,使用sprite类canvas,结合射线,点击跳转指定全景图【转】

    https://blog.csdn.net/WDCCSDN/article/details/81214804 话不多说上代码: 1.html: <!DOCTYPE html>    < ...

  9. Java 面试题 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. Windows上的git、github部署及基本使用方法

    1.介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本 ...