关于区块链:手把手教你移植蜂鸟E203-hbridv2集创芯来RISCV杯

33次阅读

共计 7848 个字符,预计需要花费 20 分钟才能阅读完成。

我是 雪天鱼,一名 FPGA 爱好者,钻研方向是 FPGA 架构摸索和数字 IC 设计。
CSDN 集体博客链接:https://blog.csdn.net/qq_44447544?spm=1000.2115.3001.5343

关注公众号【集成电路设计教程】,获取更多学习材料,并拉你进“IC 设计交换群”。
QQIC 设计交换群 群号:866169462

所用开发板:晚点原子达芬奇 FPGA 开发板
芯片型号:Xilinx Artix-7 35T

应群友之邀,分享下集创芯来 RISC- V 杯赛 所用的软核 蜂鸟 E203 hbirdv2 移植教程。

思路: 参考 Nulei 开发板的顶层代码 (e200_opensource-master/fpga/nucleikit/src/system.v(后缀不是.v 能够本人改下而后关上)) 和束缚文件(e200_opensource-master/fpga/nucleikit/constrs),写达芬奇开发板的顶层代码和束缚文件,具体步骤如下所示。

如果感觉步骤有点多,那也能够间接用我搭建好的 Vivado(2018.3 版本) 工程。资源链接:https://download.csdn.net/download/qq_44447544/83354895

一、管脚剖析

1.1 时钟管脚

首先看时钟管脚的绑定,MCU SoC 的两个输出时钟输出在 nuclei-kit 上别离依照如下形式产生:

  • 低速的实时时钟间接由 FPGA 开发板上的 32.768KHz 时钟源输出。
  • 高速时钟由 FPGA 开发板上的 100MHz 时钟通过 FPGA 外部 PLL 降频而得(16MHz)

(1)16M 时钟生成

而当初达芬奇开发板上只有一个 50MHz 时钟源,所以我先用 MMCM 将 50MHz 时钟源降频为 16MHz(32.768KHz 因为频率过低无奈通过此 IP 实现,须要本人写分频器),应用的是此 IP,具体用法可参考 晚点原子达芬奇之 FPGA 开发指南 1.1 第十五章 IP 核之 MMCM/PLL 试验,这里不过多解说。

例化应用如下图所示,而后能够把原顶层的那个 MMCM IP 核例化给删了

(2)32.768KHz 时钟生成

分频器代码如下:

// 50MHz --> 32768Hz 约为 1526 倍 50MHz/1526=32765.4 HZ, 作为常开域时钟
module clk_div(
   input  clk,
   input  rst_n,
   output reg  clk_div
);
    parameter NUM_DIV = 11'd1526;
    reg    [10:0] cnt;
    
always @(posedge clk or negedge rst_n)
    if(!rst_n) begin
        cnt     <= 11'd0;
        clk_div <= 1'b0;
    end
    else if(cnt < NUM_DIV / 2 - 1) begin
        cnt     <= cnt + 1'b1;
        clk_div <= clk_div;
    end
    else begin
        cnt     <= 11'd0;
        clk_div <= ~clk_div;
    end
endmodule

在顶层例化并绑定对应信号

这样时钟局部顶层的代码批改算是实现了,之后就是管脚束缚了,将 CLK50MHZ 绑定到开发板的时钟源管脚即可。

1.2 复位管脚

nuclei-kit 它的 rtl 顶层模块有两个复位信号,别离是 fpga_rstmcu_rst,即 FPGA 开发板本身的复位和为 MCU 设置的复位,这两个复位通过一个与操作生成一个为 SoC 应用的复位信号,即 SoC 复位的条件是这两个复位信号至多有一个失效。因为这两个复位信号都是低电平无效,故别离绑定到达芬奇开发板上的 RESET 和 KEY0 按键即可,其中 RESET 是 FPGA 本身的复位键,而 KEY0 是为 MCU 设置的复位键(达芬奇开发板上的按键都是按上来为 0,松开为 1,满足低电平无效的要求)。

1.3 QSPI 接口

蜂鸟 E203 有三个 qspi 接口,别离为 QSPI0、QSPI1、QSPI2,其中 QSPI0 专门是为内部 FLASH 筹备的,而其余两个都是通过 GPIO 口复用进行应用。所以 rtl 顶层须要绑定的是专为内部 FLASH 筹备的 QSPI 接口,目前因为没有内部 FLASH,所以先绑定到达芬奇开发板上的闲暇 IO 口上。

1.4 PMU 管脚

PMU 用于管制主域电源,能够使主域被置于断电状态以节俭功耗,或者从新唤醒。pmu_paden 用于 MCU 的电源批示,pmu_padrst 批示 MCU 的复位,这两个能够接达芬奇开发板上的 LED,而mcu_wakeup 用于唤醒,低电平无效,能够接达芬奇开发板的按键。

1.5 其余管脚

32 个 GPIO 和 JTAG 管脚绑定到开发板上的闲暇 IO 口上即可,无需更改代码。

1.6 ip_reset_sys 的解决

nuclei-kit 的 RTL 顶层还应用了 Processor System Reset IP 核,所以要把这个 IP 核增加进去(配置放弃默认即可,只需把原代码中的模块名改为 IP 核中默认名 proc_sys_reset_0 即可)

1.7 上电流程管制配置

蜂鸟 E203 MCU SoC 芯片顶层引脚中 io_pads_bootrom_n_i_ival 是用来配置上电地址抉择的,即上电复位后处理器核从哪个地址开始上电执行,此信号为 1 时,处理器核从内部 flash 地址(0x2000_0000)开始执行,这也是默认的上电流程配置;而当此信号为 0 时,处理器核从外部 rom 地址(0x0000_1000)开始执行,而 rom 中寄存的代码执行完后会跳转至 ITCM(0x8000_0000)中继续执行。因为目前达芬奇开发板上没有第二块 flash,所以须要将此信号配置为 0.
在 Nulei 开发板的顶层代码 979 行是对此信号的配置,将此处改为 0 即可。

批改后如下所示:

1.8 管脚束缚编写

至此就能够依照之前的剖析编写管脚束缚了,对应关系在 二、管脚束缚概览 中,代码见 三、DaVinci 束缚文件代码

1.9 综合实现和生成比特流文件

首先须要设置一下 define.v 文件的门路,如下图所示:

有两个门路别离为

e200_opensource-master\rtl\e203\core
e200_opensource-master\rtl\e203\perips

选中工程中这两个文件夹就能够了,如下图所示:

RTL 原理图:

综合实现后果图:

资源利用:

二、管脚束缚概览

三、DaVinci 束缚文件代码

set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]

#####               create clock              #####
set_property -dict {PACKAGE_PIN R4   IOSTANDARD LVCMOS33} [get_ports { CLK50MHZ}]; 
create_clock -add -name sys_clk_pin -period 20.00 -waveform {0 5} [get_ports {CLK50MHZ}];

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets dut_io_pads_jtag_TCK_i_ival]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets IOBUF_jtag_TCK/O]

#####            rst define           #####
set_property -dict {PACKAGE_PIN U2 IOSTANDARD LVCMOS33} [get_ports {fpga_rst}]; 
set_property -dict {PACKAGE_PIN T1 IOSTANDARD LVCMOS33} [get_ports {mcu_rst}]; 

#####                spi define               #####
set_property  PACKAGE_PIN N15 [get_ports  qspi_cs]
set_property  PACKAGE_PIN P19 [get_ports  qspi_sck]
set_property  PACKAGE_PIN R17 [get_ports  {qspi_dq[3]}]
set_property  PACKAGE_PIN J16 [get_ports  {qspi_dq[2]}]
set_property  PACKAGE_PIN M13 [get_ports  {qspi_dq[1]}]
set_property  PACKAGE_PIN K14 [get_ports  {qspi_dq[0]}]

#####        MCU JTAG define           #####
set_property  PACKAGE_PIN Y8   [get_ports mcu_TDO]
set_property  PACKAGE_PIN AA8  [get_ports mcu_TCK]
set_property  PACKAGE_PIN Y7   [get_ports mcu_TDI]
set_property  PACKAGE_PIN AB8  [get_ports mcu_TMS]

#####         PMU define               #####
set_property  PACKAGE_PIN R2 [get_ports pmu_paden]
set_property  PACKAGE_PIN R3 [get_ports pmu_padrst]
set_property  PACKAGE_PIN U1 [get_ports mcu_wakeup]

#####                gpio define              #####
set_property  PACKAGE_PIN L16 [get_ports {gpio[31]}]
set_property  PACKAGE_PIN K16 [get_ports {gpio[30]}]
set_property  PACKAGE_PIN L19 [get_ports {gpio[29]}]
set_property  PACKAGE_PIN L20 [get_ports {gpio[28]}]
set_property  PACKAGE_PIN U20 [get_ports {gpio[27]}]
set_property  PACKAGE_PIN T20 [get_ports {gpio[26]}]
set_property  PACKAGE_PIN N18 [get_ports {gpio[25]}]
set_property  PACKAGE_PIN N19 [get_ports {gpio[24]}]
set_property  PACKAGE_PIN N20 [get_ports {gpio[23]}]
set_property  PACKAGE_PIN M20 [get_ports {gpio[22]}]
set_property  PACKAGE_PIN J20 [get_ports {gpio[21]}]
set_property  PACKAGE_PIN J21 [get_ports {gpio[20]}]
set_property  PACKAGE_PIN H20 [get_ports {gpio[19]}]
set_property  PACKAGE_PIN G20 [get_ports {gpio[18]}]
set_property  PACKAGE_PIN M18 [get_ports {gpio[17]}]
set_property  PACKAGE_PIN L18 [get_ports {gpio[16]}]
set_property  PACKAGE_PIN F18 [get_ports {gpio[15]}]
set_property  PACKAGE_PIN F21 [get_ports {gpio[14]}]
set_property  PACKAGE_PIN D17 [get_ports {gpio[13]}]
set_property  PACKAGE_PIN E17 [get_ports {gpio[12]}]
set_property  PACKAGE_PIN M22 [get_ports {gpio[11]}]
set_property  PACKAGE_PIN N22 [get_ports {gpio[10]}]
set_property  PACKAGE_PIN L21 [get_ports {gpio[9]} ]
set_property  PACKAGE_PIN M21 [get_ports {gpio[8]} ]
set_property  PACKAGE_PIN K21 [get_ports {gpio[7]} ]
set_property  PACKAGE_PIN K22 [get_ports {gpio[6]} ]
set_property  PACKAGE_PIN H22 [get_ports {gpio[5]} ]
set_property  PACKAGE_PIN J22 [get_ports {gpio[4]} ]
set_property  PACKAGE_PIN G21 [get_ports {gpio[3]} ]
set_property  PACKAGE_PIN G22 [get_ports {gpio[2]} ]
set_property  PACKAGE_PIN D19 [get_ports {gpio[1]} ]
set_property  PACKAGE_PIN E19 [get_ports {gpio[0]} ]


#####                spi define               #####
set_property IOSTANDARD LVCMOS33 [get_ports  qspi_cs]
set_property IOSTANDARD LVCMOS33 [get_ports  qspi_sck]
set_property IOSTANDARD LVCMOS33 [get_ports {qspi_dq[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {qspi_dq[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {qspi_dq[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {qspi_dq[0]}]

#####               MCU JTAG define           #####
set_property IOSTANDARD LVCMOS33 [get_ports mcu_TDO]
set_property IOSTANDARD LVCMOS33 [get_ports mcu_TCK]
set_property IOSTANDARD LVCMOS33 [get_ports mcu_TDI]
set_property IOSTANDARD LVCMOS33 [get_ports mcu_TMS]

#####                PMU define               #####
set_property IOSTANDARD LVCMOS33 [get_ports pmu_paden]
set_property IOSTANDARD LVCMOS33 [get_ports pmu_padrst]
set_property IOSTANDARD LVCMOS33 [get_ports mcu_wakeup]

#####                gpio define              #####
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[31]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[30]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[29]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[28]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[27]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[26]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[25]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[24]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[23]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[22]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[21]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[20]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[19]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[18]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[17]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[16]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[14]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[0]}]

#####         SPI Configurate Setting        #######
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] 
set_property CONFIG_MODE SPIx4 [current_design] 
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
  • 更多技术文章和学习材料,请关注我的公众号:【集成电路设计教程】
  • 全平台对立:【雪天鱼】

正文完
 0