【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验
实验现象:
核心代码:
- 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通信实验的更多相关文章
- 【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO. 3.通过串口精灵发送命令可以控制ARM·LE ...
- 【iCore3 双核心板】例程十六:USB_HID实验——双向数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1bojcVoV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore1S 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入
实验现象: iCore1s 双核心板上与FPGA相连的三色LED(PCB上标示为FPGA·LED),按键按下红灯点亮,松开按键红灯熄灭. 核心源代码: module KEY( input CLK_12 ...
- 【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...
- 【iCore1S 双核心板_FPGA】例程六:状态机实验——状态机使用
核心代码: module FSM( input CLK_12M, input FPGA_KEY, output FPGA_LEDR, output FPGA_LEDG, output FPGA_LED ...
- 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
实验现象: 通过FPGA 的一个I/O 口连接LED:设定I/O 为输出模式.内部乘法器完成乘法计算后改变输出LED 的状态(红色LED 闪烁). 核心代码: module MULT( input C ...
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module single_port_ram( input CLK_12M, input WR, input RD, input CS0, inout [:]DB, input ...
- 【iCore1S 双核心板_FPGA】例程十四:FSMC总线通信实验——独立地址模式
实验原理: STM32F103上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...
- 【iCore1S 双核心板_FPGA】例程十七:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...
随机推荐
- MySQL 5.7基于GTID复制的常见问题和修复步骤(二)
[问题二] 有一个集群(MySQL5.7.23)切换后复制slave报1236,其实是不小心在slave上执行了事务导致 Got fatal error 1236 from master when r ...
- SQL RAISERROR 用法
) ), YOUR UNIQUEIDENTIFIER KEY) ,, @raiseErrorCode) RAISERROR ( N'This is message %s %d.', -- Messag ...
- Mysql数据库小结
1. 基础概念 1.1 数据 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中描述一个事 ...
- 潭州课堂25班:Ph201805201 python 模块json,os 第六课 (课堂笔记)
json 模块 import json data = { 'name':'aa', 'age':18, 'lis':[1,3,4], 'tupe':(4,5,6), 'None':None } j = ...
- SpringMybatisMapper
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...
- HDOJ 1770 - 阅读理解...树形DP
题意: 一个能量E可以通过吸收某个光子的能量变成E1或者释放某个光子的能量变成E2...并且任意两个能量的转化路径至多一条...现在有一堆能量,有一堆光子...如果某个能量与某个光子做直接运算(加上其 ...
- AngularJS中实现Model缓存
在AngularJS中如何实现一个Model的缓存呢? 可以通过在Provider中返回一个构造函数,并在构造函数中设计一个缓存字段,在本篇末尾将引出这种做法. 一般来说,Model要赋值给Scope ...
- What is a UINavigationTransitionView
**AFAIK UINavigationTransitionView is a class used to animate UINavigationController child views aro ...
- Linux ./configure --prefix命令
源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install),具体的安装方法一般作者都会给出文档,这里主要讨论配置(configure).Configu ...
- 如何让FireFox/chrome新打开的标签页在后台打开,而不是立即跳转过去
firefox: 地址栏输入about:config 找到下面三项,全部设为true browser.tabs.loadInBackground browser.tabs.loadDivertedIn ...