实验现象:

核心代码:

int main(void)
{
int i,n;
char buffer[];
char spi_buffer[]; HAL_Init();
system_clock.initialize(); led.initialize();
usart1.initialize();
spi.initialize(); usart1.printf("Hello! I am iCore1S!\r\n");
while()
{
if(usart1.receive_ok_flag)
{
usart1.receive_ok_flag = ;
for(i = ;i < ;i++)
{
buffer[i] = tolower(usart1.receive_buffer[i]);
}
n = strlen(buffer); if(memcmp(buffer,"ledr",strlen("ledr")) == )
{ LED_RED_ON;
LED_GREEN_OFF;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledg",strlen("ledg")) == )
{ LED_RED_OFF;
LED_GREEN_ON;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledb",strlen("ledb")) == )
{ LED_RED_OFF;
LED_GREEN_OFF;
LED_BLUE_ON;
}
buffer[]=;
n=strlen(buffer);
spi.write_nbyte(n,buffer);
for(i=;i<;i++)
{
spi_buffer[i] = spi.write_byte(0x00);
} usart1.printf("%s\n",spi_buffer);
}
}
}
    module SPI(
input CLK_12M,
input spi_clk,
input spi_mosi,
input spi_cs,
output spi_miso, output FPGA_LEDR,
output FPGA_LEDG,
output FPGA_LEDB
); //-------------------------rst_n---------------------------//
/*复位信号*/
reg [:]rst_cnt = 'd0;
reg rst_n = 'd0; always @(posedge CLK_12M)
if(rst_cnt == 'd50)
begin
rst_n <= 'd1;
rst_cnt <= rst_cnt;
end
else rst_cnt <= rst_cnt + 'd1; //-------------------------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_12M or negedge rst_n)
if(!rst_n)
begin
led <= 'b111;
end
else if (data == ledr)
led <= 'b011; //红灯亮
else if (data == ledg)
led <= 'b101; //绿灯亮
else if (data == ledb)
led <= 'b110; //蓝灯亮 assign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led; //--------------------------spi_miso----------------------------//
/*发送模块*/
reg [:]data_out;
reg [:]j;
reg MISO; always@(negedge spi_clk or negedge rst_n)
if(!rst_n)
begin
data_out <= hello;
j <= 'd0;
end
else case(j) //连续40个spi_clk_r时钟发送“hello”字符串
'd0:
begin
{MISO,data_out[:]} <= data_out;
j <= j + 'd1;
end
'd39:
begin
{MISO,data_out[:]} <= data_out;
data_out <= hello;
j <= 'd0;
end
default:
begin
{MISO,data_out[:]} <= data_out;
j <= j + 'd1;
end
endcase assign spi_miso = MISO; //--------------------------endmodule----------------------------//
endmodule

实验方法及指导书:

链接:http://pan.baidu.com/s/1jImpPRo 密码:c4s0

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

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

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

  2. 【iCore3 双核心板】例程十六:USB_HID实验——双向数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1bojcVoV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

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

    实验现象: iCore1s 双核心板上与FPGA相连的三色LED(PCB上标示为FPGA·LED),按键按下红灯点亮,松开按键红灯熄灭. 核心源代码: module KEY( input CLK_12 ...

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

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

  5. 【iCore1S 双核心板_FPGA】例程六:状态机实验——状态机使用

    核心代码: module FSM( input CLK_12M, input FPGA_KEY, output FPGA_LEDR, output FPGA_LEDG, output FPGA_LED ...

  6. 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用

    实验现象: 通过FPGA 的一个I/O 口连接LED:设定I/O 为输出模式.内部乘法器完成乘法计算后改变输出LED 的状态(红色LED 闪烁). 核心代码: module MULT( input C ...

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

    实验现象: 核心代码: module single_port_ram( input CLK_12M, input WR, input RD, input CS0, inout [:]DB, input ...

  8. 【iCore1S 双核心板_FPGA】例程十四:FSMC总线通信实验——独立地址模式

    实验原理: STM32F103上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...

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

    实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...

随机推荐

  1. C++雾中风景番外篇3:GDB与Valgrind ,调试代码内存的工具

    写 C++的同学想必有太多和内存打交道的血泪经验了,常常被 C++的内存问题搅的焦头烂额.(写 core 的经验了)有很多同学一见到 core 就两眼一抹黑,不知所措了.笔者 入"坑&quo ...

  2. 用python批量生成简单的xml文档

    最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...

  3. 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)

    To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...

  4. python 字符串的一些方法

    总结:# split 分割 ********# strip 脱 默认脱头尾的空格 ********# replace 替换 ********# join 插入 拼接 ********# format ...

  5. Saltstack 命令

    命令格式 salt '<操作目标>' <方法>[参数] 查看被控主机内存使用情况 [root@node1 ~]# salt '*' cmd.run 'free -h' node ...

  6. 推荐两款好用的反编译工具(Luyten,Jadx)

    使用JD-Gui打开单个.class文件,总是报错// INTERNAL ERROR 但当我用jd-gui反编译前面操作获得的jar文件的时,但有一部分类不能显示出来--constants类,仅仅显示 ...

  7. Linux.Centos安装scp反复失败的解决方式

    现象 在A服务器用scp命令从B服务器拉文件时, 报找不到scp指令的错误 在A服务器运行 scp --help 发现是有指令的 在B服务器上 常规方式, 安装openssh-clients yum ...

  8. C#获取类名为Internet_Explorer_Server控件的内容

    为了让大家都能够使用demo,我以IE为测试对象,另外为了突出重点,所以如何获取窗口句柄我就不做演示了(不清楚的童鞋,可以去Google下哈),句柄值我使用spy++获得 大家可以下载demo(附:s ...

  9. 如何使用Bootstrap自带图标

    查看可用的字体图标列表: http://www.runoob.com/try/demo_source/bootstrap3-glyph-icons.htm 第一步:下载Bootstrap,发现目录中包 ...

  10. 理解HTTP之keep-alive

    理解HTTP之keep-alive 在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive.两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大 ...