这篇文章主要介绍一下如何在2个FPGA软核上运行 RT-Thread。首先会介绍一下我用的 FPGA,接下来分别介绍在 蜂鸟 E203 和 picorv32 上运行 RT-Thread。

如果大家对如何在 FPGA 上造 CPU 感兴趣的话,Coursera 上有一门课 nand2tetris 挺有意思的,下面是2个链接分别是课程链接和在FPGA上的实现。

  • https://www.coursera.org/learn/build-a-computer

  • https://github.com/wuhanstudio/nand2tetris-iverilog


0. FPGA

首先介绍一下我用的 FPGA 开发板,也就是荔枝糖 (EG4S20),这块开发板性价比应当算是很高了,100RMB有20K逻辑单元(LUT4/LUT5混合架构),130KB SRAM,32bit 位宽 64MBit SDRAM,用来跑 RISC-V 的软核相当合适了。


为了给这块 FPGA 烧录 bitstream 把它变成软核,需要下载对应的IDE,下载链接在这里 http://dl.sipeed.com/。依次进入 Tang -> Premier -> IDE,下载最新的 TD Release 和最新的证书 Anlogic.lic,证书下载下来后替换安装路径 license 下的默认证书就可以正常使用了。

详细的安装步骤在这里也有介绍 http://tang.lichee.pro/


1. 蜂鸟E203

首先我们需要把FPGA变成一块RISC-V的开发板,因此需要烧录蜂鸟E203的bitstream,接下来就是把它当做单片机一样使用,上传固件了。

1.1 下载源码

为了方便,我把fpga的软核源码和RTT的固件源码放在了同一个仓库里。

$ git clone https://github.com/wuhanstudio/hbird_e203_tang
$ cd hbird_e203_tang
$ git submodule init
$ git submodule update

1.2 下载比特流

源码下载下来之后,Tang_E203_Mini 这个目录是软核的 Verilog 代码,hbird-sdk 则是蜂鸟E203的SDK。

接下来用 TD 软件打开源码 Tang_E203_Mini/project/e203egmini_new.al 下的项目,可以直接点 Generate Bitstream 生成比特流上传,当然上传之前也可以在左下角 User Constraints 里面检查一下引脚分配是对的。

Bitstream 上传成功之后,这块 FPGA 开发板就是一个 RISC-V 单片机了,可以对照下面的引脚图把 JTAG 连接好,就可以上传 RT-Thread 固件了。

1.3 上传固件

在编译上传之前,可以去芯来科技官网下载对应的 GCC 编译器和 OpenOCD,https://nucleisys.com/download.php,并且把他们安装在平级的目录下,比如:

nuclei/
--> gcc
--> openocd

详细的说明在蜂鸟 hbird-sdk 的官网也有介绍 https://doc.nucleisys.com/hbirdv2/quick_start/sdk.html。

工具链配置好之后我们就可以一步编译上传固件了:

$ cd hbird-sdk/application/rtthread/msh/
$ export NUCLEI_TOOL_ROOT=/opt/nuclei/             # replace with your path
$ export PATH=$NUCLEI_TOOL_ROOT/gcc/bin:$NUCLEI_TOOL_ROOT/openocd/bin:$PATH
$ make SOC=hbird BOARD=hbird_eval CORE=e203 upload

如果一切正常的话,按照上面的引脚图接好串口(和 FPGA 的引脚分配一致),就可以在控制台看到 RT-Thread 了:

 \ | /
- RT -     Thread Operating System/ | \     3.1.3 build Nov 25 2020
2006 - 2019 Copyright by rt-thread team
Hello RT-Thread!
msh >

这样就成功在蜂鸟E203软核上运行 RT-Thread,具体的移植感兴趣也可以对照仓库代码详细看。


2. Picorv32

首先介绍一下 picorv32,它也是一个 Verilog 实现的开源 RISC-V 软核

https://github.com/cliffordwolf/picorv32

这里流程和蜂鸟E203略有区别,因为 picorv32 原版是没有 JTAG 接口的,所以在 EG4S32 的实现直接就把固件放在了 Verilog 实现的 ROM 里面,因此我们需要先编译固件,然后把固件融合在比特流里一起上传。

2.1 下载源码

同样我们先下载源码,为了方便起见,我依旧把FPGA和固件源码放在了同一个仓库里:

$ git clone https://github.com/wuhanstudio/picorv32_tang
$ cd picorv32_tang
$ git submodule init
$ git submodule update

如果大家不想自己编译工具链、编译固件,仓库里我也放了预编译好的固件,这样大家可以直接跳过 2.2, 2.3,直接去 2.4 最后一步。

2.2 编译固件

在编译固件前,我们需要 GCC 编译器,这里可以去下载编译好的工具链,也可以自己编译,编译大概需要 20min (i7-8665). 详细的编译流程在这篇文章里也有介绍

https://pingu98.wordpress.com/2019/04/08/how-to-build-your-own-cpu-from-scratch-inside-an-fpga/

$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev \libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \gperf libtool patchutils bc zlib1g-dev git libexpat1-dev$ sudo mkdir /opt/riscv32i
$ sudo chown $USER /opt/riscv32i$ git clone https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-rv32i
$ cd riscv-gnu-toolchain-rv32i
$ git checkout 411d134
$ git submodule update --init --recursive$ mkdir build; cd build
$ ../configure --with-arch=rv32i --prefix=/opt/riscv32i
$ make -j$(nproc)

工具链准备好之后,我们就可以编译 RT-Thread 了。

$ cd rtthread-nano/rt-thread/bsp/picorv32_blink/
$ mkdir build & cd build
$ cmake ../
$ make

这里我们会生成 rt-thread.bin,但是这是没法直接被 FPGA 使用的,FPGA 的 ROM 初始化需要用到 Generate Memory Initialization File (MIF) 格式,因此我们下面需要转换一下格式。

2.3 生成 MIF 文件

这里我准备了一个 python 脚本方便直接把 bin 文件转换为 mif,顺便一提,这里的 ROM 大小是 32x8192 bit 也就是 32KB。

# Copy generated rt-thread.bin out.
$ cp rtthread-nano/rt-thread/bsp/picorv32_blink/build/rt-thread.bin bin2mif/
$ cd bin2mif# Generate MIF
$ python3 bin2mif.py rt-thread.bin rt-thread.mif

这样我们就可以把编译生成的 rt-thread.mif 放到 FPGA 的项目里替换了。

$ cp bin2mif/rt-thread.mif picorv32_EG4S20/firmware/

2.4 上传比特流

我们用 TD 打开源码 picorv32_EG4S20/RISC_V/RISC_V.al 下的项目文件,就可以生成比特流了。

这里大家可以看看 User Constraints 下面的引脚分配,接上串口不出意外就可以看到 RT-Thread 了:

 \ | /
- RT -     Thread Operating System/ | \     3.1.3 build Nov 25 20202006 - 2019 Copyright by rt-thread team
Hello RT-Thread!
msh >

3. 项目链接

  • picorv32 软核:

    https://github.com/wuhanstudio/picorv32_tang

  • 蜂鸟 E203 软核:

    https://github.com/wuhanstudio/hbird_e203_tang

最后感谢 stupid_bird 前期做的工作,我也是在他的基础上进行了一些优化总结。

  • https://gitee.com/Stupid_bird/picorv32_EG4S20

  • https://github.com/RT-Thread/rtthread-nano/pull/4

(文中链接请复制至外部浏览器打开)

你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!

???? 点击阅读原文进入官网

在 Picorv32 / 蜂鸟 E203 软核上运行 RT-Thread相关推荐

  1. linux下把进程绑定到特定cpu核上运行

    现在大家使用的基本上都是多核cpu,一般是4核的.平时应用程序在运行时都是由操作系统管理的.操作系统对应用进程进行调度,使其在不同的核上轮番运行. 对于普通的应用,操作系统的默认调度机制是没有问题的. ...

  2. 为什么要把进程/线程绑定到特定cpu核上运行?(cpu core id coreIdx)opdevsdk_sys_bindThreadCoreId()

    看海康hikflow_demo代码,在线程处理函数里调用了绑定函数,把这个线程绑定到某个cpu核上,不知为何要这么做? 原因 答1 现在大家使用的基本上都是多核cpu,一般是4核的.平时应用程序在运行 ...

  3. 关闭windows hello然后尝试再次运行安装程序_蜂鸟E203系列——Windows下运行hello world例程...

    蜂鸟E203系列--Windows下运行hello world例程​mp.weixin.qq.com 创建 hello world 例程 选择file->new->C / C++ Proj ...

  4. Renode应用:在RISC-V核上运行FreeRTOS

    本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况.本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头 ...

  5. 使用 sched_setaffinity 将线程绑到CPU核上运行

    linux 提供CPU调度函数,可以将CPU某一个核和指定的线程绑定到一块运行. 这样能够充分利用CPU,且减少了不同CPU核之间的切换,尤其是在IO密集型压力之下能够提供较为友好的性能. 通过sch ...

  6. 蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程

    创建程序 在 -/hbird-e-sdk-master/software 路径下创建一个"helloworld"中文件夹 在 -/hbird-e-sdk-master/softwa ...

  7. FPGA移植软核的原理

    FPGA设计,规模巨大而且功能复杂,因此设计的每一个部分都从头开始是不切实际的.一种解决的办法是:对于较为通用的部分可以重用现有的功能模块,而把主要的时间和资源用在设计中的那些全新的.独特的部分.这就 ...

  8. PYNQ-Z2调试笔记:在Microblaze软核中编程运行C程序

    本篇主要介绍,通过Jupyter在Microblaze Subsystems上使用C语言编程,实现一些简单的功能. 目录 前言 正文 一.软核PMODA.PMODB.RPI.ARDUINO 二.在软核 ...

  9. 蜂鸟E203学习笔记(二)--蜂鸟E203总体框架

    蜂鸟E203总体框架 蜂鸟E203处理器系统如下图所示 一.蜂鸟E203处理器核设计总览和顶层 1.1 蜂鸟E203处理器核的设计理念 模块化和可重用性:将处理器分成几个主体模块,每个单元之间的接口简 ...

最新文章

  1. [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
  2. OpenFire源码学习之二十五:消息回执与离线消息(下)
  3. WordPress-基础设置之固定链接设置
  4. UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新...
  5. 数据集 | 计算机视觉开源数据集(计算机视觉图像、定位、识别)
  6. Git 之五 通信协议(HTTPS、SSH、Git)、使用远程仓库(GitHub、GitLab、Gitee等)
  7. 计算机硬件的维护知识,计算机硬件维护知识
  8. mysql 当前用户连接数_实战:判断mysql中当前用户的连接数-分组淘选
  9. 数据库四大特性与隔离级别
  10. Bye Bye Embed-再见了Embed,符合web标准的媒体播放器代码
  11. 89. Gray Code - LeetCode
  12. Javascript编程技巧 -- 函数记忆
  13. (13) css浮动补充
  14. 华为HCIA认证考试题库数量有多少?HCIA备考时间多久合适?
  15. git commit提交rebase合并以及patch补丁的使用
  16. 流程图软件Visio的使用笔记
  17. spark GBT算法
  18. 10年程序员私单的经历,送你3个找客户的关键技巧
  19. 1-3 Python基本数据类型
  20. html 加响应头,response发送中文,设置响应头

热门文章

  1. 关于kibana 查询出现 x分片有 x 个失败
  2. Linux内核Thermal框架详解十二、Thermal Governor(2)
  3. Stay教你程序员泡妞攻略
  4. [迭代][DFS]用C++求解传统九宫格数独
  5. 梦幻系统手游服务器等级,梦幻西游手游服务器等级不高 如何在剑会取得好成绩_图文直播_梦幻西游手游游戏百科...
  6. 关于“Espressif IDF build 参数格式不正确”问题
  7. 如何写好技术安全需求TSR?
  8. 【STM32教程】学习STM32必须要知道的知识点-什么是ARM
  9. 从零学光学设计 1 像差 球差 慧差 像散 场曲 畸变
  10. Live2D看板娘学习