手把手教你移植 tinyriscv 到FPGA上

这篇具有很好参考价值的文章主要介绍了手把手教你移植 tinyriscv 到FPGA上。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

一、下载源码

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

手把手教你移植 tinyriscv 到FPGA上

这里我选择的是 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)

手把手教你移植 tinyriscv 到FPGA上

二、创建 Vivado 工程

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

手把手教你移植 tinyriscv 到FPGA上

这里 rtl 为tinyriscv Verilog源码。

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

手把手教你移植 tinyriscv 到FPGA上

三、修改约束文件

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

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

手把手教你移植 tinyriscv 到FPGA上

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

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

手把手教你移植 tinyriscv 到FPGA上

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

手把手教你移植 tinyriscv 到FPGA上

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

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

手把手教你移植 tinyriscv 到FPGA上

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

手把手教你移植 tinyriscv 到FPGA上

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 到FPGA上

资源消耗;

手把手教你移植 tinyriscv 到FPGA上

所以只要板卡上的资源足够,都可以成功移植 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 0x1e200a6f

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME

riscv set_reset_timeout_sec 1

init
halt

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

手把手教你移植 tinyriscv 到FPGA上

成功检测到 RISCV CPU。

手把手教你移植 tinyriscv 到FPGA上

目前在学习 RISCV 的 debug 架构,后续将借助 tinyriscv 进行学习。文章来源地址https://www.toymoban.com/news/detail-416739.html

到了这里,关于手把手教你移植 tinyriscv 到FPGA上的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (一)手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核

    1.1 如何下载ARM DesignStart Cortex-M3相关文件 ​ 关于ARM DesignStart计划的介绍:ARM DesignStart计划——私人定制一颗ARM处理器 - 知乎 (zhihu.com)。 ​ 在arm Developer官网[Arm Developer](https://developer.arm.com/downloads)右上方的Downloads中搜索ARM DesignStart Cortex-M3第一个即是FPGA上定制的Cortex-M3软核IP。

    2024年02月04日
    浏览(42)
  • 手把手教你SHA-256

    SHA-256是SHA-2协议簇的一部分,也是当前最流行的协议算法之一。在本篇文章中,我们会了解这个密码学算法的每一个步骤,并且通过实例演示。SHA-2因它的安全性(比SHA-1强很多)和速度为人所知。在没有键(keys)生成的情况下,例如挖掘比特币,像SHA-2这样的快速哈希算法很

    2024年02月13日
    浏览(77)
  • 手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

    2024年02月07日
    浏览(59)
  • 零基础快速上手STM32开发(手把手保姆级教程)

    作为一名嵌入式工程师,STM32 是必须要学习的一款单片机,同时这款单片机资料足够多,而且比较简单,非常适合初学者入门。 STM32 是一款由 STMicroelectronics 公司开发的 32 位微控制器,由于其强大的处理能力和广泛的应用领域,如嵌入式系统、物联网设备、机器人等,而受到

    2024年02月05日
    浏览(51)
  • 手把手教你做主成分分析

    主成分分析是一种降维处理的统计方法,实践中有三个应用场景: 信息浓缩:将多个分析项浓缩成几个关键概括性指标; 权重计算:利用方差解释率值计算各概括性指标的权重; 综合评价:基于主成分得分构造综合得分数据,用于综合评价。 接下来,以一个具体案例来学习

    2024年02月01日
    浏览(59)
  • 手把手教你实战TDD

    领域驱动设计,测试驱动开发。 我们在《手把手教你落地DDD》一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解、TDD常见误区、TDD技术选型,以及案例实战。希望通过本文,读者能够理解掌握TDD并将其应用于实际

    2024年02月08日
    浏览(47)
  • 手把手教你落地DDD

    一、前言 常见的DDD实现架构有很多种,如经典四层架构、六边形(适配器端口)架构、整洁架构(Clean Architecture)、CQRS架构等。架构无优劣高下之分,只要熟练掌握就都是合适的架构。本文不会逐个去讲解这些架构,感兴趣的读者可以自行去了解。 本文将带领大家从日常的

    2024年02月16日
    浏览(51)
  • 手把手教你反编译小程序

    操作系统: win10 10.0.19042 node: v14.17.0 微信开发者工具: Stable 1.05.2110290 在电脑端安装模拟器工具,这里以夜神模拟器为例, 在模拟器中安装微信:用于微信打开小程序时加载小程序包。 在模拟器中文件管理器:用于查看小程序包,这里使用模拟器自带的Amaze。 文件共享路径:可

    2024年02月08日
    浏览(42)
  • 手把手教你彻底卸载MySQL

    ❤写在前面 ❤博客主页: 努力的小鳴人 ❤系列专栏: MySQL8.0基础学习 ❤欢迎小伙伴们, 点赞👍关注🔎收藏🍔 一起学习! ❤如有错误的地方,还请小伙伴们指正!🌹 ​ 目录 步骤1:停止MySQL服务 步骤2:软件的卸载 步骤3:残余文件的清理 步骤4:清理注册表 步骤5:删除

    2024年02月05日
    浏览(42)
  • 手把手教你怎么写顺序表

    目录 一、顺序表有什么功能? 二、实现顺序表的各个功能 1.前置准备 2.初始化顺序表 3.顺序表扩容 4.打印顺序表 5.增加顺序表成员 5.1尾增 5.2头增  6.删除顺序表中成员的内容 6.1尾删 6.2头删  7.查找成员  8.修改(替换) 9.插入(在目标位置插入成员) 10.定向删除(将目标位置的成

    2024年02月15日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包