【RISC-V】基于开源RISC-V MCU内核PicoRV32的FPGA移植

一、FPGA板卡的介绍

核心板:GW2A-LV18PG256C8IC8I7

底板:Dock底板

有关核心板和底板相关资料的参考网址:Tang Primer 20K - Sipeed Wiki 

FPGA硬件设计软件:高云云源软件;下载地址:广东高云半导体科技股份有限公司

二、PicoRV32 

PicoRV32描述,以及文档介绍详情见网址PicoRV32 - 高云 - 广东高云半导体科技股份有限公司 

我们使用的PicoRV32的系统架构如下图所示

 三、移植到FPGA

1、时序约束

由于官方给的例程是基于DK_START_GW2A-LV18PG256C8I7_V2.0 开发板,该开发板板载的晶振为50MHz。开发板如下图

而对于我们手中的Tang prime 20k,板载的晶振为27MHz,时许的约束需要改。具体如下

 2、管脚约束

如果仅仅测试该软核是否移植成功,仅需要修改时钟、复位及中断按键、led灯以及UART串口的对应管脚。

①时钟管脚

//System clock
IO_LOC "clk_in" H11;
IO_PORT "clk_in" IO_TYPE=LVCMOS33;

 ②复位及中断按键 

//System reset
IO_LOC "resetn_in" T3;//KEY_4
IO_PORT "resetn_in" IO_TYPE=LVCMOS15;

//External Interrupt
IO_LOC "irq_in[0]" T2;//KEY_1
IO_LOC "irq_in[1]" D7;//KYE_2
IO_PORT "irq_in[0]" IO_TYPE=LVCMOS15;
IO_PORT "irq_in[1]" IO_TYPE=LVCMOS15;

 ③LED灯

//LED
IO_LOC "gpio_io[0]" L16;//LED1
IO_LOC "gpio_io[1]" L14;//LED2
IO_LOC "gpio_io[2]" N14;//LED3
IO_LOC "gpio_io[3]" N16;//LED4
IO_PORT "gpio_io[0]" IO_TYPE=LVCMOS33;
IO_PORT "gpio_io[1]" IO_TYPE=LVCMOS33;
IO_PORT "gpio_io[2]" IO_TYPE=LVCMOS33;
IO_PORT "gpio_io[3]" IO_TYPE=LVCMOS33;

④UART串口

//WB UART
IO_LOC "wbuart_tx" M11;//J4_5
IO_LOC "wbuart_rx" T13;//J4_6
IO_PORT "wbuart_tx" IO_TYPE=LVCMOS33;
IO_PORT "wbuart_rx" IO_TYPE=LVCMOS33;

PS:关于为何使用WB UART而不使用simple UART可以参考软核的程序 

3、下载到板卡

由于我们采用的下载方式为“软件编程设计产生映像文件,作为硬件设计中指令存储器 ITCM 的初 始值”。下载流程如下图所示:

所以我们需要将生产的十六进制的hex映像文件加入到IP核中。

四、软件相关 

编程软件:GOWIN MCU Designer V1.1.01教育版

下载地址:广东高云半导体科技股份有限公司

只需要修改picorv32.h中的时钟频率即可,将原本的50MHz改为27MHz

五、现象 

连接好串口,波特率设置为115200。

板卡上的现象是四个LED灯轮流闪烁,并且串口打印数值符合main.c中的程序

串口打印的结果如代码块所示



------------- Gowin RiscV MCU <PicoRV32> Demo ----------------



MCU boot from and run in ITCM.



Open Wishbone interface demo beginning...

Wishbone extension demo, write and read back the three registers on the open Wishbone interface

Before write Wishbone demo register:

Reg0: 22222222

Reg1: 2222

Reg2: 22

After write Wishbone demo register:

Reg0: 33333333

Reg1: 3333

Reg2: 33

Open Wishbone interface demo finished.	// main.c(wbreg_demo)



Open AHB bus interface demo beginning...

ahbreg0 is  01234567

ahbreg1 is 89abcdef

Open AHB bus interface demo finished.	//main.c(ahbreg_demo)



Wishbone SPI-Flash demo beginning...

Read data by memory map mode from flash...

ffffffff ffffffff ffffffff ffffffff ffffffff c3a5ffff 00000006 1b080000 00000010 00000000 ffff0051 ffffffff 0000000b ffff00d2 00000000 00000012 3e08803b 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 08000000 00000010 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10080000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001400 00000000 00000000 00000000 00000000 00000000 00103000 00000000 00000000 00000008 00001030 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 03000000 00000001 

Read initialized data from flash...

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 

Erase flash...

Read data after erase flash...

ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 

Page program data...

Read data after page program flash...

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 

Read data by memory map mode from flash...

03020100 07060504 0b0a0908 0f0e0d0c 13121110 17161514 1b1a1918 1f1e1d1c 23222120 27262524 2b2a2928 2f2e2d2c 33323130 37363534 3b3a3938 3f3e3d3c 43424140 47464544 4b4a4948 4f4e4d4c 53525150 57565554 5b5a5958 5f5e5d5c 63626160 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 

Wishbone SPI-Flash demo finished.	//main.c(spi_flash_demo)



Wishbone GPIO output demo beginning...

Please check the LED running status on board

LED running: 1

LED running: 2

LED running: 3

LED running: 4

LED running: 5

LED running: 6

LED running: 7

LED running: 8

LED running: 9

LED running: 10

LED running: 11

LED running: 12

LED running: 13

LED running: 14

LED running: 15

LED running: 16

LED running: 17

LED running: 18

LED running: 19

LED running: 20

Wishbone GPIO output demo finished.
Wishbone UART rx demo beginning...

Receive a byte from uart rx port

  当通过串口调试助手给板卡发送任意一个字节的数据时,现象为

-------------------------------------

Running status: 

Cycle counter ........: 2045557224

Instruction counter ..: 319375636

CPI: 6.08

-------------------------------------	//stats(in firmware)





Enter WBUART RX interrupt...

Receive a byte in WBUART RX interrupt : a



Enter timer interrupt...

Timer interrupt counter :        0



Enter timer interrupt...

Timer interrupt counter :        1



Enter timer interrupt...

Timer interrupt counter :        2



Enter timer interrupt...

Timer interrupt counter :        3



Enter timer interrupt...

Timer interrupt counter :        4



Enter timer interrupt...

Timer interrupt counter :        5

 后续不断计数,并且可以测试两个中断的按键,显示如下

Enter timer interrupt...

Timer interrupt counter :       41



Enter timer interrupt...

Timer interrupt counter :       42



Press button 1, enter an external interrupt 20...

Interrupt 20 is triggered by button 1



Enter timer interrupt...

Timer interrupt counter :       43



Enter timer interrupt...

Timer interrupt counter :       44



Enter timer interrupt...

Timer interrupt counter :       45



Enter timer interrupt...

Timer interrupt counter :       46



Enter timer interrupt...

Timer interrupt counter :       47



Enter timer interrupt...

Timer interrupt counter :       48



Enter timer interrupt...

Timer interrupt counter :       49



Enter timer interrupt...

Timer interrupt counter :       50



Press button 2, enter an external interrupt 21...

Interrupt 21 is triggered by button 2



Enter timer interrupt...

Timer interrupt counter :       51



Enter timer interrupt...

Timer interrupt counter :       52



Enter timer interrupt...

Timer interrupt counter :       53



Enter timer interrupt...

Timer interrupt counter :       54



Enter timer interrupt...

Timer interrupt counter :       55



Enter timer interrupt...

Timer interrupt counter :       56



Enter timer interrupt...

Timer interrupt counter :       57

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 基于开源RISC-V 核——PicoRV32,我们可以搭建一个简单的片上系统(SoC)。首先,我们需要明确片上系统包含的核心组件:处理器核心、内存、总线、外设和系统接口等。 首先,我们可以将 PicoRV32 核心作为处理器核心引入片上系统。PicoRV32 是一个简洁而高效的 RISC-V 处理器,它是开源的,并且易于扩展和定制。 其次,我们需要添加适当的内存组件来存储程序和数据。常见的内存组件包括静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)。我们可以根据实际需求选择合适的内存组件。 然后,我们需要设计一个总线系统,用于连接处理器核心、内存和外设。常见的总线标准包括存储器映射I/O总线(Memory-Mapped I/O Bus)和高级扩展总线(Advanced Extensible Interface)。我们可以选择适合需求的总线标准,并设计总线连接线路。 接下来,我们需要添加外设来扩展功能。外设可以包括但不限于串口、以太网控制器、图形处理器或显示控制器等。我们可以根据实际需求选择适合的外设,并将其连接到总线系统上。 最后,我们需要设计系统接口,包括时钟和复位电路、电源管理、调试接口等。这些接口可以确保系统的正确运行和调试。 总的来说,基于开源PicoRV32 核心,我们可以搭建一个完整的片上系统(SoC),包括处理器核心、内存、总线、外设和系统接口等组件。这样的系统可以用于各种应用,例如嵌入式系统、物联网设备、嵌入式计算平台等。在搭建过程中,我们需要根据实际需求选择合适的组件,并设计相应的连接和接口电路。通过这样的搭建过程,我们可以实现一个基于开源的 SoC,并对其进行定制和扩展。 ### 回答2: 要基于开源risc-v核——picorv32搭建一个完整的SOC(片上系统),可以按照以下步骤进行: 1. 硬件设计:根据picorv32的开源设计,可以使用HDL语言(如Verilog)编写硬件描述文件,包括CPU核心、存储器、外设控制器等。可以选择添加适合自己需求的外设,如UART、SPI、GPIO等。 2. 硬件实现:基于上一步的硬件描述文件,使用FPGA开发工具进行逻辑综合、布局布线和生成比特流文件。可以选择常见的FPGA平台,如Xilinx、Altera等。 3. 软件开发:使用RISC-V架构的编译器工具链进行软件开发。首先,编写启动代码和链接脚本,以初始化SOC的外设,设置中断处理等。然后,根据需求编写C/C++代码或汇编代码来实现特定功能或应用程序。 4. 烧录和调试:将生成的比特流文件烧录到FPGA开发板上,然后在开发环境中配置相应的调试接口(如JTAG、UART等)来进行调试和测试。可以使用调试工具,如GDB,来单步调试程序。 5. 系统调试和优化:一旦SOC成功启动,可以通过外设接口与SOC进行交互,并根据实际需求进行系统调试和优化。可以添加额外的外设、调整时钟频率、优化算法或引入其他性能提升措施。 需要注意的是,在搭建SOC的过程中,会涉及到硬件设计、底层软件开发和FPGA调试等多个领域的知识。因此,需要具备相关的技术背景和经验,并参考picorv32的开源文档和社区资料进行学习和实践。 ### 回答3: 搭建一个基于开源RISC-Vpicorv32的完整SOC(片上系统)可以通过以下步骤实现。 首先,我们需要明确要搭建SOC的目标和组件。一个完整的SOC通常包括一个或多个CPU核心、内存控制器、外设控制器、总线接口、外设设备等。在这个例子中,我们将使用picorv32作为CPU核心。 其次,我们需要根据具体需求,在picorv32的基础上添加所需的组件。例如,我们可以添加一个RAM作为内存控制器,并使用I2C控制器控制一个外设设备。我们还可以使用像AXI或AHB这样的总线接口,将CPU核心与其他组件连接起来。 然后,我们需要编写代码来实现这些组件及其之间的通信和控制。对于picorv32核心,可以使用Verilog或SystemVerilog编程语言来描述其行为和功能。同样,我们需要编写代码来描述内存控制器、外设控制器和总线接口等组件。 接下来,我们使用一个合成工具,例如Yosys或Vivado,将Verilog代码综合成一个逻辑电路。这需要处理和优化代码,生成相应的网表和约束文件。 在综合完成后,我们将使用布局工具(如OpenLANE)对设计进行布局。布局工具可以根据所需的规格约束和性能要求将逻辑电路映射到实际的物理芯片上。 接下来,我们使用物理验证工具(如Magic)对设计进行验证,确保所有信号/功率完整性和时序满足要求。 最后,我们将设计加载到FPGA芯片或ASIC芯片上,并通过仿真和测试验证SOC的功能和性能。 通过以上步骤,我们可以搭建一个基于开源RISC-Vpicorv32的完整SOC,在自己的项目中使用和调试。这将提供给我们一个高度可定制和灵活的SOC架构,适应我们特定的应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值