小言_互联网的博客

基于FPGA的远程升级系统概述

291人阅读  评论(0)

目录

一、理论基础

二、核心程序

三、仿真测试结果



  
  1. 作者ID :fpga和matlab
  2. CSDN主页: https:/ /blog.csdn.net/ccsss22? type=blog
  3. 擅长技术:
  4. 1.无线基带,无线图传,编解码
  5. 2.机器视觉,图像处理,三维重建
  6. 3.人工智能,深度学习
  7. 4.智能控制,智能优化
  8. 5.其他

一、理论基础

        通过串口接收升级文件,将升级文件写入EPCS中,然后使用Remote_system_update模块进行升级操作。

存储器类型使用片上RAM,约20KB空间

使用的芯片是EP4CE40F23C6

        这里,主要的核心部分是基于NIOSIIRemote system update模块的调用,这里在设计说明中,重点介绍一下Remote system update模块的使用方法。

          RSU单元主要包括如下几个部分:

第一:页模式的选择

          通过页模式选择特性,我们可以选择重配置期间时加载不同的配置程序。在FPGA芯片中,通过PGM[2:0]三个引脚来实现页选择。

第二:工厂配置

         工厂配置就是系统的默认配置,当使用增强配置期间的时候,工厂配置会存放在000页。当使用串行配置器件的时候,工作配置则被放在从0X00000000地址开始的空间。工厂配置值能被系统生产商第一次配置进去,静止用户通过远程升级模式进行修改。

第三,应用配置

      从远程接收到的配置数据,并存放到远程存储器里除工厂配置的其他的任意的空间。

第四,看门狗计数器

     主要用来进行复位计数的功能。

第五,远程程序升级子模块

     远程程序升级子模块管理着远程配置特性,这个字模块是由一个远程配置状态机来实现的。

第六,远程配置寄存器

      远程配置寄存器主要用在存储配置地址以及引起重配置的错误类型。

系统的设计。

二、核心程序

第一,基于NIOSIIRSU单元模块设计

      在SOPC界面中,做如下的IP核总线连接:

        从上面的设置可以看到,整个NIOSII系统,主要包括CPU核,片上RAM以及UART串口模块三个部分。

这些模块的参数设置以及地址分配分别如下所示:

片上RAM

注意,片上存储器的总大小这里设置为40960,当然你也可以改为你所要求的大小。

UART串口:

CPU核:

第二,系统整体设计

         整个系统的结构如下所示:

整个系统的资源占用如下所示:


  
  1. `timescale 1 ns / 1 ps
  2. module RSU_tops(
  3. i_clk_80Mhz,
  4. i_rst,
  5. i_EPCS_DO,
  6. i_RX_UART,
  7. o_clk_40Mhz,
  8. o_Pause,
  9. o_TX_UART,
  10. o_EPCS_CS,
  11. o_EPCS_DI,
  12. o_EPCS_CLK,
  13. o_PWM,
  14. o_PWM1,
  15. o_LED1,
  16. o_LED2
  17. );
  18. input i_clk_80Mhz;
  19. input i_rst;
  20. input i_EPCS_DO;
  21. input i_RX_UART;
  22. output o_clk_40Mhz;
  23. output o_Pause;
  24. output o_TX_UART;
  25. output o_EPCS_CS;
  26. output o_EPCS_DI;
  27. output o_EPCS_CLK;
  28. output [ 7: 0]o_PWM;
  29. output o_PWM1;
  30. output o_LED1;
  31. output o_LED2;
  32. CLKDCM CLKDCM_u(
  33. .i_clk (i_clk_80Mhz),
  34. .i_rst (i_rst),
  35. .o_clk (o_clk_40Mhz)
  36. );
  37. Count Count_u(
  38. .i_clk (o_clk_40Mhz),
  39. .i_rst (i_rst),
  40. .o_pause (o_Pause)
  41. );
  42. nios_rsu2 nios_rsu2_u(
  43. .EPCS_DO (i_EPCS_DO),
  44. .RX_UART (i_RX_UART),
  45. .CLK_40MHz (o_clk_40Mhz),
  46. .Reset_n (o_Pause),
  47. .TX_UART (o_TX_UART),
  48. .EPCS_CS (o_EPCS_CS),
  49. .EPCS_DI (o_EPCS_DI),
  50. .EPCS_CLK (o_EPCS_CLK),
  51. .PWM (o_PWM),
  52. .PWM1 (o_PWM1),
  53. .led1 (o_LED1),
  54. .led2 (o_LED2)
  55. );
  56. endmodule

  
  1. `timescale 1 ns / 1 ps
  2. module nios_rsu2(
  3. EPCS_DO,
  4. RX_UART,
  5. CLK_40MHz,
  6. Reset_n,
  7. TX_UART,
  8. EPCS_CS,
  9. EPCS_DI,
  10. EPCS_CLK,
  11. PWM,
  12. PWM1,
  13. led1,
  14. led2
  15. );
  16. input wire EPCS_DO;
  17. input wire RX_UART;
  18. input wire CLK_40MHz;
  19. input wire Reset_n;
  20. output wire TX_UART;
  21. output wire EPCS_CS;
  22. output wire EPCS_DI;
  23. output wire EPCS_CLK;
  24. output wire [ 7: 0] PWM;
  25. output wire PWM1;
  26. output reg led1;
  27. output reg led2;
  28. Remote_NIOS b2v_inst(
  29. .clk_0(CLK_40MHz),
  30. .reset_n(Reset_n),
  31. .data0_to_the_epcs_flash_controller(EPCS_DO),
  32. .rxd_to_the_fifoed_avalon_uart(RX_UART),
  33. .dclk_from_the_epcs_flash_controller(EPCS_CLK),
  34. .sce_from_the_epcs_flash_controller(EPCS_CS),
  35. .sdo_from_the_epcs_flash_controller(EPCS_DI),
  36. .txd_from_the_fifoed_avalon_uart(TX_UART),
  37. .out_port_from_the_pio(PWM));
  38. assign PWM1 = 1 'b0;
  39. wire sel;
  40. assign sel = EPCS_CS;
  41. always @(posedge CLK_40MHz or posedge Reset_n)
  42. begin
  43. if(Reset_n)
  44. begin
  45. led1 <= 1 'b0;
  46. led2 <= 1 'b0;
  47. end
  48. else begin
  49. if(sel == 1 'b1)
  50. begin
  51. led1 <= 1 'b0;
  52. led2 <= 1 'b1;
  53. end
  54. else begin
  55. led1 <= 1 'b1;
  56. led2 <= 1 'b0;
  57. end
  58. end
  59. end
  60. endmodule

三、仿真测试结果

         这里,仿真效果如下图所示:

        然后我这里下面的测试步骤都是基于这个板子来做的测试,测试步骤:

管脚的绑定截图:

        然后,我们这里主要观察的是LED1和LED2两个灯的工作情况。这里,我再我的板子上连接的两个绿色的LED灯。

A12-23


转载:https://blog.csdn.net/ccsss22/article/details/127389512
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场