差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
fpga项目_使用arduino玩转fpga [2018/04/02 11:30]
group003 [步骤1:获取PulseRain FP51-1T MCU软核]
fpga项目_使用arduino玩转fpga [2019/10/03 22:46] (当前版本)
gongyu [步骤5:定制自己的硬件外设]
行 6: 行 6:
  
 我们知道在MCU(Microcontroller Unit)中运行的是CPU硬核,比如Intel的8051核,ARM的Cortex-M核,Arduino板上用的AVR核等,各大半导体厂商在CPU Core的基础上集成了各种各样的外设模块,以适用于不同的应用需求。用户需要关心的就是这款MCU有哪些资源,寄存器如何配置。如果我想根据自己的应用需求来定制一款MCU,但是半导体厂商又不理我怎么办呢?办法总是有的,那就回到MCU出生之前的状态。通过将处理器内核移植到FPGA中,使用FPGA内部的逻辑资源和存储资源来构建一个软MCU,再通过内部总线挂载需要的外设电路就构成了一个定制化的MCU,我们称之为软核。 \\ 我们知道在MCU(Microcontroller Unit)中运行的是CPU硬核,比如Intel的8051核,ARM的Cortex-M核,Arduino板上用的AVR核等,各大半导体厂商在CPU Core的基础上集成了各种各样的外设模块,以适用于不同的应用需求。用户需要关心的就是这款MCU有哪些资源,寄存器如何配置。如果我想根据自己的应用需求来定制一款MCU,但是半导体厂商又不理我怎么办呢?办法总是有的,那就回到MCU出生之前的状态。通过将处理器内核移植到FPGA中,使用FPGA内部的逻辑资源和存储资源来构建一个软MCU,再通过内部总线挂载需要的外设电路就构成了一个定制化的MCU,我们称之为软核。 \\
 +
 ====软核中的野马战斗机——FP51-1T==== ====软核中的野马战斗机——FP51-1T====
 目前,在FPGA中移植软核已经是一种常见的做法,但是大多数MCU软核都是FPGA厂商定制的,比如Altera的Nios II、Xilinx的MicroBlaze和Lattice的MICO32/​MICO8,这些软核并不完全开源并且对用户做了诸多限制。国外有一家名叫PulseRain Technology的公司开发并开源了一款高性能的MCU软核[[https://​www.pulserain.com/​fp51|FP51-1T]],该软核虽然基于8位的8051体系,但是它巧妙地实现了RISC架构,并且优化了指令集,大部分指令都可以单时钟周期实现,主频可以飙到100MHz以上,以二战时彪悍的野马战斗机P51来命名这款软核再合适不过了。 \\ 目前,在FPGA中移植软核已经是一种常见的做法,但是大多数MCU软核都是FPGA厂商定制的,比如Altera的Nios II、Xilinx的MicroBlaze和Lattice的MICO32/​MICO8,这些软核并不完全开源并且对用户做了诸多限制。国外有一家名叫PulseRain Technology的公司开发并开源了一款高性能的MCU软核[[https://​www.pulserain.com/​fp51|FP51-1T]],该软核虽然基于8位的8051体系,但是它巧妙地实现了RISC架构,并且优化了指令集,大部分指令都可以单时钟周期实现,主频可以飙到100MHz以上,以二战时彪悍的野马战斗机P51来命名这款软核再合适不过了。 \\
行 28: 行 29:
 现在FP51-1T已经成功移植到STEP-MAX10开发板并且提供了Arduino板卡支持包。 \\ 现在FP51-1T已经成功移植到STEP-MAX10开发板并且提供了Arduino板卡支持包。 \\
 下面我们使用STEP FPGA开发板来体验一下这个神奇的操作吧! 下面我们使用STEP FPGA开发板来体验一下这个神奇的操作吧!
 +
 =====使用Arduino开发STEP-MAX10 FPGA===== =====使用Arduino开发STEP-MAX10 FPGA=====
 ====准备工作==== ====准备工作====
行 33: 行 35:
   * Intel Quantus Prime软件   * Intel Quantus Prime软件
   * Arduino IDE   * Arduino IDE
 +
 ===准备1:​STEP-MAX10 FPGA开发板 — FPGA型号Intel MAX10-08系列=== ===准备1:​STEP-MAX10 FPGA开发板 — FPGA型号Intel MAX10-08系列===
 STEP-MAX10是小脚丫FPGA系列中基于Intel/​Altera公司的FPGA芯片MAX10M08的FPGA开发板,它同样也采用了DIP40封装,小巧、携带方便,板载资源也是十分丰富,包含:​ STEP-MAX10是小脚丫FPGA系列中基于Intel/​Altera公司的FPGA芯片MAX10M08的FPGA开发板,它同样也采用了DIP40封装,小巧、携带方便,板载资源也是十分丰富,包含:​
行 44: 行 47:
  
 <WRAP centeralign>​ **小脚丫STEP-MAX10实物图片** </​WRAP>​ <WRAP centeralign>​ **小脚丫STEP-MAX10实物图片** </​WRAP>​
 +
 ===准备2:​Intel Quantus Prime软件=== ===准备2:​Intel Quantus Prime软件===
 Quartus Prime是Altera被Intel收购之后推出的免费、强大的设计软件,包括了从设计输入到综合直至优化、验证以及仿真等各个阶段所需的一切功能。Quartus Prime Lite是大批量器件系列的理想设计工具,可以免费下载使用。 Quartus Prime是Altera被Intel收购之后推出的免费、强大的设计软件,包括了从设计输入到综合直至优化、验证以及仿真等各个阶段所需的一切功能。Quartus Prime Lite是大批量器件系列的理想设计工具,可以免费下载使用。
  
 Quartus Prime下载安装、使用☞: ​ [[Quartus Prime]] ​ Quartus Prime下载安装、使用☞: ​ [[Quartus Prime]] ​
 +
 ===准备3:​Arduino IDE软件=== ===准备3:​Arduino IDE软件===
 Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)两大核心部分。Arduino IDE基于processing IDE开发,对于初学者来说极易掌握,同时有足够的灵活性。Arduino语言是基于wiring语言开发的,是对 avr-gcc库的二次封装,不需要太多的单片机基础和编程基础,只需简单学习后,你就可以快速的进行开发。 \\ Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)两大核心部分。Arduino IDE基于processing IDE开发,对于初学者来说极易掌握,同时有足够的灵活性。Arduino语言是基于wiring语言开发的,是对 avr-gcc库的二次封装,不需要太多的单片机基础和编程基础,只需简单学习后,你就可以快速的进行开发。 \\
行 78: 行 83:
 进入该目录 \\ 进入该目录 \\
  
- ​**git ​ submodule ​ update ​ --init ​ --recursive** \\+ ​**git ​ submodule ​ update ​ - - init   ​- - recursive** ​注意init和recursive前面是两个 - \\
  
 更新所有的submodules ​ \\ 更新所有的submodules ​ \\
行 100: 行 105:
   * 36个用户可扩展I/​O,这36个可扩展I/​O可以与底板外设连接   * 36个用户可扩展I/​O,这36个可扩展I/​O可以与底板外设连接
 底板外设模块如下图所示: \\ 底板外设模块如下图所示: \\
 +
 {{:: 底板外设接口图.png?​360 |底板外设接口}} {{:: 底板外设接口图.png?​360 |底板外设接口}}
 {{:​db.png?​650|}} {{:​db.png?​650|}}
-<WRAP centeralign>​**step_base_board_demo模块划分**</​WRAP>​+ 
 +<WRAP centeralign>​ **step_base_board_demo模块划分** </​WRAP>​ 
 直接从GitHub上clone的项目已默认编译,使用Micro USB数据线连接PC和开发板后,使用Quartus Prime软件可以直接下载到STEP-MAX10芯片。 \\ 直接从GitHub上clone的项目已默认编译,使用Micro USB数据线连接PC和开发板后,使用Quartus Prime软件可以直接下载到STEP-MAX10芯片。 \\
 {{ ::​stepmax10编译结果.png?​440 |}} {{ ::​stepmax10编译结果.png?​440 |}}
 如果不熟悉Quartus prime的使用可以先学习这里的上手教程[[quartus_prime的使用]]。 \\ 如果不熟悉Quartus prime的使用可以先学习这里的上手教程[[quartus_prime的使用]]。 \\
 如果不熟悉FPGA的开发可以先学习入门教程[[step-max10入门教程]]。 \\ 如果不熟悉FPGA的开发可以先学习入门教程[[step-max10入门教程]]。 \\
 +
 ====步骤2:Arduino IDE安装板卡支持包和软件库==== ====步骤2:Arduino IDE安装板卡支持包和软件库====
-===1_安装板卡支持包===+===1.安装板卡支持包===
 Arduino IDE可以支持第三方板子的开发,但是需要安装第三方板卡的支持包。 \\ Arduino IDE可以支持第三方板子的开发,但是需要安装第三方板卡的支持包。 \\
 打开Arduino IDE,打开 **文件**——**首选项**——**附加开发板管理器网址**,添加如下链接:​ \\ 打开Arduino IDE,打开 **文件**——**首选项**——**附加开发板管理器网址**,添加如下链接:​ \\
行 120: 行 129:
 该BSP主要包括三部分:FP51 Core、[[http://​sdcc.sourceforge.net/​|SDCC]] Compiler和Target Downloade Tools 该BSP主要包括三部分:FP51 Core、[[http://​sdcc.sourceforge.net/​|SDCC]] Compiler和Target Downloade Tools
  
-===2_安装软件库===+===2.安装软件库===
 Arduino之所以开发简单快速,是因为Arduino官方和众多的开源硬件爱好者贡献了大量的应用软件库,对于常见外设接口或模块的软件库都可以从网上下载到,而且能非常方便的嵌入到我们的程序中。\\ Arduino之所以开发简单快速,是因为Arduino官方和众多的开源硬件爱好者贡献了大量的应用软件库,对于常见外设接口或模块的软件库都可以从网上下载到,而且能非常方便的嵌入到我们的程序中。\\
 PulseRain 为FT51-1T MCU提供了常用外设接口的软件库如I2C,​microSD,CODEC,PWM,ESP8266等,而且有详细的文档说明 ☞[[https://​www.pulserain.com/​m10 |]]。 \\ PulseRain 为FT51-1T MCU提供了常用外设接口的软件库如I2C,​microSD,CODEC,PWM,ESP8266等,而且有详细的文档说明 ☞[[https://​www.pulserain.com/​m10 |]]。 \\
行 128: 行 137:
 <WRAP centeralign>​**Arduino中安装库文件**</​WRAP>​ <WRAP centeralign>​**Arduino中安装库文件**</​WRAP>​
 用户在程序中如果需要用到某个库,只需要在**项目**——**加载库**,选择相应的库,即可将该库的头文件包含到应用程序中。 用户在程序中如果需要用到某个库,只需要在**项目**——**加载库**,选择相应的库,即可将该库的头文件包含到应用程序中。
 +
 ====步骤3:在Arduino IDE中开发应用程序==== ====步骤3:在Arduino IDE中开发应用程序====
 在Arduino IDE **工具**一栏,选择 **开发板**为**StepFPGA M10**, 搭建好软硬件环境,我们可以开始开发自己的应用程序了,这里我们编写一段应用程序实现以下功能: 在Arduino IDE **工具**一栏,选择 **开发板**为**StepFPGA M10**, 搭建好软硬件环境,我们可以开始开发自己的应用程序了,这里我们编写一段应用程序实现以下功能:
行 142: 行 152:
 这里建议用户在Preferences对话框 (菜单File / Preferences) 中打开"​Show Verbose Output"​选项,这样信息栏中会给出详细的编译结果。 \\ 这里建议用户在Preferences对话框 (菜单File / Preferences) 中打开"​Show Verbose Output"​选项,这样信息栏中会给出详细的编译结果。 \\
 {{::​fp51arduino编译结果.png?​500|}} {{::​fp51arduino编译结果.png?​500|}}
 +
 ====步骤4:配置软核到STEP-MAX10 FPGA开发板==== ====步骤4:配置软核到STEP-MAX10 FPGA开发板====
-===串口一键下载===+===1.串口一键下载===
 Arduino开发板之所以能够使用串口实现一键下载,是因为在主控制器内部有Bootloader,而在我们的软核内部没有使用软件bootloader,而是在软核中嵌入了OCD (onchip debugger)模块,相当于MCU内部的硬件BOOT模块,通过外接串口同样可以实现串口一键下载。只不过程序下载到FPGA内部的SRAM区,掉电数据会丢失,如果想程序掉电不丢失还是需要将Arduino IDE 生成的.hex文件通过Quatus prime烧录到MAX10内部的Flash区。 \\ Arduino开发板之所以能够使用串口实现一键下载,是因为在主控制器内部有Bootloader,而在我们的软核内部没有使用软件bootloader,而是在软核中嵌入了OCD (onchip debugger)模块,相当于MCU内部的硬件BOOT模块,通过外接串口同样可以实现串口一键下载。只不过程序下载到FPGA内部的SRAM区,掉电数据会丢失,如果想程序掉电不丢失还是需要将Arduino IDE 生成的.hex文件通过Quatus prime烧录到MAX10内部的Flash区。 \\
  
行 153: 行 164:
 <WRAP centeralign>​**Arduino中开发STEP-MAX10 FPGA演示效果**</​WRAP>​ <WRAP centeralign>​**Arduino中开发STEP-MAX10 FPGA演示效果**</​WRAP>​
 \\ \\
-===片上闪存的配置(Onchip Flash Memory)===+===2.片上闪存的配置(Onchip Flash Memory)===
 Step FPGA M10采用Single Compressed Image设置,​ 在该设置下,​ 其片上闪存的地址如下图所示:​ Step FPGA M10采用Single Compressed Image设置,​ 在该设置下,​ 其片上闪存的地址如下图所示:​
-{{:​max10闪存配置.png?400|}} \\+{{ :​max10闪存配置.png |}} \\
 在上图所示的4个分区中,​ 分区1和2一共有32KB,​ 被用来存放代码。 PulseRain FP51-1T MCU的缺省配置有32KB Instruction RAM和8KB Data RAM. 分区1和2 正好和FP51-1T MCU的 Instruction RAM 大小相对应.在上电启动时,source / code_mem_power_on_loader.sv 会把用户的代码从闪存分区1和2载入到Instruction RAM 中并执行。 \\ 在上图所示的4个分区中,​ 分区1和2一共有32KB,​ 被用来存放代码。 PulseRain FP51-1T MCU的缺省配置有32KB Instruction RAM和8KB Data RAM. 分区1和2 正好和FP51-1T MCU的 Instruction RAM 大小相对应.在上电启动时,source / code_mem_power_on_loader.sv 会把用户的代码从闪存分区1和2载入到Instruction RAM 中并执行。 \\
 闪存分区3目前被用来存放LOGO图片,该图片可以在LCD上显示。STEP Base Board自带的LCD有132 x 162的分辨率。这里建议用户存放一个大小为128 x 154的真彩图片在这个分区。 \\ 闪存分区3目前被用来存放LOGO图片,该图片可以在LCD上显示。STEP Base Board自带的LCD有132 x 162的分辨率。这里建议用户存放一个大小为128 x 154的真彩图片在这个分区。 \\
行 161: 行 172:
 当用户用Arduino IDE 编译Sketch以后,可以把Arduino生成的.hex 文件的最后一行删除,并与bitmap.hex合并,并将合并后的文件命名为synth/​output_files/​ufm.hex。 \\ 当用户用Arduino IDE 编译Sketch以后,可以把Arduino生成的.hex 文件的最后一行删除,并与bitmap.hex合并,并将合并后的文件命名为synth/​output_files/​ufm.hex。 \\
 这样在生成FPGA Image时,ufm.hex 会被自动包含在最后生成的Image里面。 这样在生成FPGA Image时,ufm.hex 会被自动包含在最后生成的Image里面。
-===烧录程序到MAX10 FPGA内部Flash===+===3.烧录程序到MAX10 FPGA内部Flash===
 用户可以用Intel Quartus Prime打开synth / Mustang_fast.qpf , 并点击"​Start a new compilation",​ \\ 用户可以用Intel Quartus Prime打开synth / Mustang_fast.qpf , 并点击"​Start a new compilation",​ \\
 Mustang project 内含一个叫post_flow.tcl的script.这个script会自动做文件合成与转换. ​ \\ Mustang project 内含一个叫post_flow.tcl的script.这个script会自动做文件合成与转换. ​ \\
行 172: 行 183:
 \\ \\
 **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\submodules\PulseRain_rtl_lib\LCD** 下面的那些文件 \\ **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\submodules\PulseRain_rtl_lib\LCD** 下面的那些文件 \\
 +
 \\ \\
 +
 2. 给新增加的外设分配SFR 地址, 地址分配见 \\ 2. 给新增加的外设分配SFR 地址, 地址分配见 \\
 \\ \\
 +
 **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\common\SFR.svh** \\ **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\common\SFR.svh** \\
 +
 **parameter unsigned [DATA_WIDTH - 1 : 0] LCD_CSR_ADDR = 8'​hC1;​** \\ **parameter unsigned [DATA_WIDTH - 1 : 0] LCD_CSR_ADDR = 8'​hC1;​** \\
 +
 **parameter unsigned [DATA_WIDTH - 1 : 0] LCD_DATA_ADDR = 8'​hC2;​** \\ **parameter unsigned [DATA_WIDTH - 1 : 0] LCD_DATA_ADDR = 8'​hC2;​** \\
 +
 \\ \\
 +
 3. 更改 **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\peripherals\peripherals.sv** \\ 3. 更改 **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\peripherals\peripherals.sv** \\
 +
 \\ \\
 +
 把新外设增加到**Peripheral bus** 上. 由于新的外设增加了新的管脚,​ 所以除了**peripherals.sv** 之外, \\ 把新外设增加到**Peripheral bus** 上. 由于新的外设增加了新的管脚,​ 所以除了**peripherals.sv** 之外, \\
 +
 \\ \\
 +
 **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\source\PulseRain_FP51_MCU.sv** 和 \\ **GitHub\step_fpga\submodules\PulseRain_FP51_MCU\source\PulseRain_FP51_MCU.sv** 和 \\
 +
 \\ \\
 +
 **GitHub\step_fpga\source\Mustang_fast.sv** 也要相应修改,​ 在**port list** 中增加管脚. 比如 \\ **GitHub\step_fpga\source\Mustang_fast.sv** 也要相应修改,​ 在**port list** 中增加管脚. 比如 \\
 +
 \\ \\
 **output wire LCD_BL,​** ​ \\ **output wire LCD_BL,​** ​ \\
-**output wire LCD_DAT_CMD,​** \\ + 
 +**output wire LCD_DAT_CMD,​** \\ 
 **output wire LCD_RES,​** ​ \\ **output wire LCD_RES,​** ​ \\
 +
 **inout wire LCD_SDA,​** ​ \\ **inout wire LCD_SDA,​** ​ \\
 +
 **inout wire LCD_SCL,** \\ **inout wire LCD_SCL,** \\
 +
 \\ \\
 +
 4. 对新增的管脚做**Constrain**,​ 比如**Pin assignment**,​ **voltage level** 等 \\ 4. 对新增的管脚做**Constrain**,​ 比如**Pin assignment**,​ **voltage level** 等 \\
 +
 \\ \\
 +
 5. 由于新增加了**SFR**,​ **Arduino** 编译器的SFR定义也要相应修改. 编译器的SFR头文件通常被安装在 \\ 5. 由于新增加了**SFR**,​ **Arduino** 编译器的SFR定义也要相应修改. 编译器的SFR头文件通常被安装在 \\
 +
 \\ \\
 +
 **C:​\Users\...\AppData\Local\Arduino15\packages\StepFPGA_M10\tools\M10_compiler\...\SDCC\include\mcs51\8051.h** \\ **C:​\Users\...\AppData\Local\Arduino15\packages\StepFPGA_M10\tools\M10_compiler\...\SDCC\include\mcs51\8051.h** \\
-\\ 
  
-====相关设计资源==== + 
-**Copy from PulseRain Technology**+ 
 +#### 相关设计资源
   * {{::​step_fpga_m10_user_guide_cn.pdf|STEP FPGA FP51-1T MCU中文用户手册 }}   * {{::​step_fpga_m10_user_guide_cn.pdf|STEP FPGA FP51-1T MCU中文用户手册 }}
-  *{{::​datasheet_fp8051_1t.pdf|FP51-1T Datasheet}} +  * {{::​datasheet_fp8051_1t.pdf|FP51-1T Datasheet}} 
-  *{{::​pulserain_8_bit_mcu_trm.pdf|FP51-1T Technical Reference Manual}} +  * {{::​pulserain_8_bit_mcu_trm.pdf|FP51-1T Technical Reference Manual}} 
-  *[[https://​github.com/​PulseRain/​Mustang/​tree/​step_fpga|Repository for FPGA]] +  * [[https://​github.com/​PulseRain/​Mustang/​tree/​step_fpga|Repository for FPGA]] 
-  *[[https://​github.com/​PulseRain/​Arduino_M10_IDE/​tree/​step_fpga|Repository for Arduino IDE package]] +  * [[https://​github.com/​PulseRain/​Arduino_M10_IDE/​tree/​step_fpga|Repository for Arduino IDE package]] 
-  *[[https://​github.com/​PulseRain/​M10_high_speed_config_rtl|TRM for M10 High Speed Configuration]] +  * [[https://​github.com/​PulseRain/​M10_high_speed_config_rtl|TRM for M10 High Speed Configuration]] 
-  *[[https://​github.com/​PulseRain|Repository for Peripherals]]+  * [[https://​github.com/​PulseRain|Repository for Peripherals]]