我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索和数字IC设计。

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

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

文章目录

  • 一、下载源码
  • 二、创建 Vivado 工程
  • 三、修改约束文件
  • 四、综合实现
  • 五、通过 JTAG debug RISCV

一、下载源码

tinyriscv 官方库链接:https://gitee.com/liangkangnan/tinyriscv

这里我选择的是 master v2.4 版本: https://gitee.com/liangkangnan/tinyriscv/tree/v2.4/
用 Git 克隆到本地。(使用的终端软件是 Cygwin,安装教程:https://blog.csdn.net/qq_44447544/article/details/123246995?spm=1001.2014.3001.5501)

二、创建 Vivado 工程

打开 tinyriscv 文件夹,可以看到有很多目录:

这里 rtl 为tinyriscv Verilog源码。

用 Vivado 创建工程,并把源码和约束添加进去,具体步骤可见 tinyriscv\fpga\README.md 文件,写的很详细。

三、修改约束文件

所谓的移植其实就是根据自己所用的板卡编写正确的管脚约束文件,并且根据需求修改源码。
基本步骤如下:

  1. 先修改约束文件中的时钟和复位引脚绑定
  2. 修改状态指示信号引脚绑定
    在源码中,over、succ、halted_ind都是状态指示信号,应该绑定到开发板上的 LED上,而不同的开发板LED的电路连接方式也不同,有的是给高电平亮,有的是给低电平亮。而 tinyriscv 源码中是给低电平,即状态指示信号有效时为低电平,而达芬奇开发板LED是要给高电平亮,所以要修改源码,取反下就行。

3.修改串口 tx 和 rx 信号引脚绑定

注:这个是绑开发板中未使用的任意管脚,而不是绑开发板上已有的串口。

4.修改GPIO外设所用的引脚约束

5.修改JTAG所用的引脚约束

注:这个是绑开发板中未使用的任意管脚,而不是绑FPGA自己的JTAG,FPGA自己的JTAG已经和开发板上的Flash绑定好了,无法使用,就像按键,led灯所绑定的管脚一样,都已经被使用了,无法被复用。

6.修改SPI所用的引脚约束

7.添加时钟约束

由于 jtag_TCK 信号在设计中是作为同步时钟的,而敏感列表中无晶振时钟所对应的信号。所以要添加下面语句;

create_clock -name jtag_clk_pin -period 300 [get_ports {jtag_TCK}];
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets jtag_TCK]

完整的约束文件:

# 时钟约束50MHz,占空比50%
create_clock -add -name sys_clk_pin -period 20.00 -waveform {0 10} [get_ports {clk}];# 时钟引脚
set_property -dict { PACKAGE_PIN R4 IOSTANDARD LVCMOS33 } [get_ports {clk}]; # 复位引脚
set_property -dict { PACKAGE_PIN U2 IOSTANDARD LVCMOS33 } [get_ports {rst}]; # 程序执行完毕指示引脚,over 为1时有效,点亮led0
set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {over}]; # 程序执行成功指示引脚,succ 为1时有效,点亮led1
set_property -dict { PACKAGE_PIN R3 IOSTANDARD LVCMOS33 } [get_ports {succ}]; # CPU停住指示引脚,halted_ind 为1时有效,点亮led2
set_property -dict { PACKAGE_PIN V2 IOSTANDARD LVCMOS33 } [get_ports {halted_ind}]; # 串口下载使能引脚,由于没有拨码开关和自锁开关,所以绑定到key0上,key0按住不放时才使能串口下载
set_property -dict { PACKAGE_PIN T1 IOSTANDARD LVCMOS33 } [get_ports {uart_debug_pin}]; # 串口发送引脚
set_property -dict { PACKAGE_PIN AB6 IOSTANDARD LVCMOS33 } [get_ports {uart_tx_pin}]; # 串口接收引脚
set_property -dict { PACKAGE_PIN V7 IOSTANDARD LVCMOS33 } [get_ports {uart_rx_pin}]; # GPIO0引脚
set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports {gpio[0]}]; # GPIO1引脚
set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports {gpio[1]}]; # JTAG TCK引脚  PortA 0
set_property -dict { PACKAGE_PIN AA8 IOSTANDARD LVCMOS33 } [get_ports {jtag_TCK}]; create_clock -name jtag_clk_pin -period 300 [get_ports {jtag_TCK}];
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets jtag_TCK]# JTAG TMS引脚 PortA 3
set_property -dict { PACKAGE_PIN AB8 IOSTANDARD LVCMOS33 } [get_ports jtag_TMS]; # JTAG TDI引脚 PortA 1
set_property -dict { PACKAGE_PIN Y7 IOSTANDARD LVCMOS33 } [get_ports {jtag_TDI}]; # JTAG TDO引脚 PortA 2
set_property -dict { PACKAGE_PIN Y8 IOSTANDARD LVCMOS33 } [get_ports jtag_TDO]; # SPI MISO引脚
set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports {spi_miso}]; # SPI MOSI引脚
set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports {spi_mosi}]; # SPI SS引脚
set_property -dict { PACKAGE_PIN E13 IOSTANDARD LVCMOS33 } [get_ports {spi_ss}]; # SPI CLK引脚
set_property -dict { PACKAGE_PIN E14 IOSTANDARD LVCMOS33 } [get_ports {spi_clk}]; #SPI 相关设置
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.CONFIG.UNUSEDPIN PULLUP [current_design]

四、综合实现

Layout:

资源消耗;

所以只要板卡上的资源足够,都可以成功移植 tinyriscv。

五、通过 JTAG debug RISCV

调试器芯片:ftdi4232HL
配置文件:
ft4232h.cfg:

adapter driver ftdi
# VID and PID
ftdi vid_pid 0x0403 0x6011
transport select jtag
# TCK frequency
adapter speed 100# ftdi_layout_init [data] [direction]
# 指定FTDI GPIO的初始数据和方向,16bit数据宽度。
# 参数data中1表示高电平,0表示低电平,而参数direction中1表示输出,0表示输入(注意与常规的设定不同)
ftdi layout_init 0x0018 0x05fb# ftdi_layout_signal name [-data|-ndata data_mask] [-input|-ninput input_mask] [-oe|-noe oe_mask] [-alias|-nalias name]
# 创建一个名字为name的信号。
# [-data|-ndata data_mask]
# data_mask:pin mask ndata:invert -data:normal bit
# data_mask是对应pin脚的掩码,-ndata表示输入数据反向,-data则不反向。ftdi layout_signal nSRST -data 0x0010 -noe 0x0400

tinyriscv.cfg:

set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1e200a6fset _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAMEriscv set_reset_timeout_sec 1init
halt

打开 cmd 执行命令:openocd -f ft4232h.cfg -f tinyriscv.cfg

成功检测到 RISCV CPU。

目前在学习 RISCV 的 debug 架构,后续将借助 tinyriscv 进行学习。

手把手教你移植 tinyriscv 到FPGA上相关推荐

  1. 手把手教你移植RT-Thread系统

    学习RT-Thread系统有一段时间了,感觉RT-Thread系统使用起来很简单,也很方便.但是在最开始移植的时候网上的教程很多,也很杂乱.比如可以使用官方的软件RT-Thread Studio 直接 ...

  2. 《手把手教你移植InfoNES(到HANKER-LM4F232)》

    应各路童鞋的围观,"写一个 <手把手教你移植XXX>神马的教程哎~" 实在太忙了,也没有什么好题材的移植,也就是这个InfoNES吧.因为我之前帖子里用的都是我原来学习 ...

  3. 手把手教你制作AppPreview视频并上传到appStore进行审核

    手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...

  4. 微商城搭建教程,手把手教你开通自己的线上/定制微商城!

    微商城应该如何开通和搭建?这个问题一直困扰着很多商家,今天就为大家整理一份关于微商城从开通到搭建的具体教程,手把手教商家搭建自己的线上微商城. 微商城搭建教程,手把手教你开通自己的线上微商城! (一) ...

  5. 手把手教你在阿里云ECS上搭建惊艳的博客

    手把手教你在阿里云ECS上搭建惊艳的博客 相信大多数人都有自己搭建博客网站的想法,本文就手把手一步一步的进行,最终结果类似如下样式: 网站软件的选择 软件选择成熟而免费的WordPress,WordP ...

  6. 「云原生 | Docker」手把手教你搭建镜像仓库并上传/下载镜像

    手把手教你搭建镜像仓库 一.选择镜像仓库 二.使用 Docker 官方仓库 1. 注册账号并登录 2. 创建私有仓库 3. 设置私有秘钥 3. 登录 Docker 仓库 4. 上传镜像到 Docker ...

  7. 手把手教你在夜神、雷电上搭frida+Xposed

    一.目标 李老板: 奋飞呀,你天天手把手教这样不好吧? 奋飞:老板你想多了,就咱们行业这种男女比例,有啥不好的? 二.步骤 夜神Frida 先adb连上夜神,看看它是嘛系统 fenfeiMac:Des ...

  8. 个人建设网站流程解说,手把手教你如何在阿里云上搭建自己的网站

    现如今信息化时代,很多企业甚至是个人都有自己搭建网站的需求,目前建站有两方式,第一:找网络公司全程负责搭建:第二:自己建设:找网络公司建设网站市场价格不一,网络公司的实力技术也不一样,所以会有很多的建 ...

  9. 阿里云——手把手教你搭建个人网站(上云良心品,细致到想哭)

    时间过得真快,备案快要通过下来了,自己也马上要成为一个真正的站长了,今天就来说一下我如何使用"云平台方案调研/技术选型"."云上建站/开发过程"."架 ...

最新文章

  1. C语言语句单选题,C语言练习题
  2. 关于bhuman文件结构
  3. Oracle数据库的数据统计(Analyze)
  4. Angular routerLink指令的href属性生成逻辑
  5. Apple Watch,其实是个老司“机”
  6. nginx解析漏洞简单复现及修复
  7. 测试能用的上的录屏软件 不喜勿喷
  8. java开源商城 java搭建直播商城 微服务商城 百万千万级商城 分布式商城 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 商家入驻商城
  9. 最近非常火的AI绘图(附操作方法)
  10. 牛牛的跳跳棋(贪心)
  11. Java美元符号取值_java:我如何使用printf打印美元符号和带2位小数的双精度值?...
  12. JavaScript设计模式都有哪些?
  13. Tita 绩效宝:经理一对一会议简介
  14. os-level版本控制工具
  15. 四步学习Meta标签
  16. Algebra:Chapter 0 - 引言
  17. (2016)最新最好的Unity3D Github项目收集
  18. Ebook管理工具(持续更新)
  19. 实验二 倒计时页面的实现 淘宝秒杀页面
  20. Github上的iOS资料-个人记录

热门文章

  1. Titan框架入门指南:Titan如何工作
  2. VINS-mono之IMU预积分(IMU预积分引出)
  3. 5、6月程序员“薪资被应届生倒挂“现象明显,跳槽还是等待?
  4. 2008-2020年各省地方债务余额数据(wind)
  5. python string转float原来如此简单,集合set的操作,对于动态变化的训练集操作
  6. 关节空间阻抗控制器设计的个人理解
  7. 电子仪表系统显示管理计算机,综合电子仪表系统.ppt
  8. OA系统资产管理借力工作流,覆盖从采购申请-报废的全过程
  9. Excel日期按秒自增公式
  10. (转)使用jsonp帮助你知道关注的他或她QQ音乐中搜藏了什么歌曲