实验现象:

核心代码:

  1. int main(void)
  2. {
  3. int i,n;
  4. char buffer[];
  5. char spi_buffer[];
  6.  
  7. HAL_Init();
  8. system_clock.initialize();
  9.  
  10. led.initialize();
  11. usart1.initialize();
  12. spi.initialize();
  13.  
  14. usart1.printf("Hello! I am iCore1S!\r\n");
  15. while()
  16. {
  17. if(usart1.receive_ok_flag)
  18. {
  19. usart1.receive_ok_flag = ;
  20. for(i = ;i < ;i++)
  21. {
  22. buffer[i] = tolower(usart1.receive_buffer[i]);
  23. }
  24. n = strlen(buffer);
  25.  
  26. if(memcmp(buffer,"ledr",strlen("ledr")) == )
  27. {
  28.  
  29. LED_RED_ON;
  30. LED_GREEN_OFF;
  31. LED_BLUE_OFF;
  32. }
  33. if(memcmp(buffer,"ledg",strlen("ledg")) == )
  34. {
  35.  
  36. LED_RED_OFF;
  37. LED_GREEN_ON;
  38. LED_BLUE_OFF;
  39. }
  40. if(memcmp(buffer,"ledb",strlen("ledb")) == )
  41. {
  42.  
  43. LED_RED_OFF;
  44. LED_GREEN_OFF;
  45. LED_BLUE_ON;
  46. }
  47. buffer[]=;
  48. n=strlen(buffer);
  49. spi.write_nbyte(n,buffer);
  50. for(i=;i<;i++)
  51. {
  52. spi_buffer[i] = spi.write_byte(0x00);
  53. }
  54.  
  55. usart1.printf("%s\n",spi_buffer);
  56. }
  57. }
  58. }
  1. module SPI(
  2. input CLK_12M,
  3. input spi_clk,
  4. input spi_mosi,
  5. input spi_cs,
  6. output spi_miso,
  7.  
  8. output FPGA_LEDR,
  9. output FPGA_LEDG,
  10. output FPGA_LEDB
  11. );
  12.  
  13. //-------------------------rst_n---------------------------//
  14. /*复位信号*/
  15. reg [:]rst_cnt = 'd0;
  16. reg rst_n = 'd0;
  17.  
  18. always @(posedge CLK_12M)
  19. if(rst_cnt == 'd50)
  20. begin
  21. rst_n <= 'd1;
  22. rst_cnt <= rst_cnt;
  23. end
  24. else rst_cnt <= rst_cnt + 'd1;
  25.  
  26. //-------------------------parameter---------------------------//
  27. parameter ledr = {'d108,8'd101,'d100,8'd114},
  28. ledg = {'d108,8'd101,'d100,8'd103},
  29. ledb = {'d108,8'd101,'d100,8'd98},
  30. hello = {'d104,8'd101,'d108,8'd108,'d111};
  31.  
  32. //--------------------------spi_mosi---------------------------//
  33. /*接收模块*/
  34. reg [:]i;
  35. reg [:]data_in;
  36. reg [:]temp_data,data;
  37.  
  38. always@(posedge spi_clk or negedge rst_n)
  39. if(!rst_n)
  40. begin
  41. i <= 'd0;
  42. temp_data <= 'd0;
  43. data <= 'd0;
  44. data_in <= 'd0;
  45. end
  46. else case(i) //从高位开始接收数据,每8个spi_clk时钟接收一个Byte
  47. 'd0:
  48. begin
  49. i <= i + 'd1;
  50. data_in <= {data_in[:],spi_mosi};
  51. temp_data <= {temp_data[:],data_in};
  52. if(data_in == 'd13)
  53. begin
  54. data <= temp_data;
  55. end
  56. else
  57. begin
  58. data <= data;
  59. end
  60. end
  61. 'd1,4'd2,'d3,4'd4,'d5,4'd6:
  62. begin
  63. i <= i + 'd1;
  64. data_in <= {data_in[:],spi_mosi};
  65. end
  66. 'd7:begin
  67. i <= 'd0;
  68. data_in <= {data_in[:],spi_mosi};
  69. end
  70. default: i <= 'd0;
  71. endcase
  72.  
  73. //--------------------------data----------------------------//
  74. /*对比接收数据*/
  75. reg [:]led;
  76.  
  77. always@(posedge CLK_12M or negedge rst_n)
  78. if(!rst_n)
  79. begin
  80. led <= 'b111;
  81. end
  82. else if (data == ledr)
  83. led <= 'b011; //红灯亮
  84. else if (data == ledg)
  85. led <= 'b101; //绿灯亮
  86. else if (data == ledb)
  87. led <= 'b110; //蓝灯亮
  88.  
  89. assign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led;
  90.  
  91. //--------------------------spi_miso----------------------------//
  92. /*发送模块*/
  93. reg [:]data_out;
  94. reg [:]j;
  95. reg MISO;
  96.  
  97. always@(negedge spi_clk or negedge rst_n)
  98. if(!rst_n)
  99. begin
  100. data_out <= hello;
  101. j <= 'd0;
  102. end
  103. else case(j) //连续40个spi_clk_r时钟发送“hello”字符串
  104. 'd0:
  105. begin
  106. {MISO,data_out[:]} <= data_out;
  107. j <= j + 'd1;
  108. end
  109. 'd39:
  110. begin
  111. {MISO,data_out[:]} <= data_out;
  112. data_out <= hello;
  113. j <= 'd0;
  114. end
  115. default:
  116. begin
  117. {MISO,data_out[:]} <= data_out;
  118. j <= j + 'd1;
  119. end
  120. endcase
  121.  
  122. assign spi_miso = MISO;
  123.  
  124. //--------------------------endmodule----------------------------//
  125. 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. MySQL 5.7基于GTID复制的常见问题和修复步骤(二)

    [问题二] 有一个集群(MySQL5.7.23)切换后复制slave报1236,其实是不小心在slave上执行了事务导致 Got fatal error 1236 from master when r ...

  2. SQL RAISERROR 用法

    ) ), YOUR UNIQUEIDENTIFIER KEY) ,, @raiseErrorCode) RAISERROR ( N'This is message %s %d.', -- Messag ...

  3. Mysql数据库小结

    1. 基础概念 1.1 数据 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中描述一个事 ...

  4. 潭州课堂25班:Ph201805201 python 模块json,os 第六课 (课堂笔记)

    json 模块 import json data = { 'name':'aa', 'age':18, 'lis':[1,3,4], 'tupe':(4,5,6), 'None':None } j = ...

  5. SpringMybatisMapper

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...

  6. HDOJ 1770 - 阅读理解...树形DP

    题意: 一个能量E可以通过吸收某个光子的能量变成E1或者释放某个光子的能量变成E2...并且任意两个能量的转化路径至多一条...现在有一堆能量,有一堆光子...如果某个能量与某个光子做直接运算(加上其 ...

  7. AngularJS中实现Model缓存

    在AngularJS中如何实现一个Model的缓存呢? 可以通过在Provider中返回一个构造函数,并在构造函数中设计一个缓存字段,在本篇末尾将引出这种做法. 一般来说,Model要赋值给Scope ...

  8. What is a UINavigationTransitionView

    **AFAIK UINavigationTransitionView is a class used to animate UINavigationController child views aro ...

  9. Linux ./configure --prefix命令

    源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install),具体的安装方法一般作者都会给出文档,这里主要讨论配置(configure).Configu ...

  10. 如何让FireFox/chrome新打开的标签页在后台打开,而不是立即跳转过去

    firefox: 地址栏输入about:config 找到下面三项,全部设为true browser.tabs.loadInBackground browser.tabs.loadDivertedIn ...