前言
一些小笔记,让人快速搭建起FPGA开发工具链,提高开发效率的方法。
工具链搭建
QuestaSim联合Vivado进行仿真
由于VIVADO自带的仿真有一定的局限性,比如速度比较慢以及视图内容不够全面,所以大家一般会用其他的专业仿真工具来承担仿真的任务。
1.安装并破解QuestaSim,这个网络上有很多教程
QuestaSim24.1链接: https://pan.baidu.com/s/1XckFnuW6j5c2oipXrjhuAQ 提取码: 96xp
2.把Vivado自带的库模型编译一下
3.VIVADO中的settings有关仿真的部分改到questasim
指定库模型路径,最好勾选log_all_signals来保证可以随时查看所有的信号,否则的话没有一开始添加到窗口中的信号是不会被记录的。
4.然后就可以直接通过点击VIVADO的Run Simulation来启动QuestaSim了
QuestaSim小技巧快捷键
在波形上Tab: 跳转到下一个变化点
Shift+Tab:向左查找上一个跳变沿
Ctrl+鼠标左键拖动: 放大所选区域
F: 波形正好铺满屏幕
C:放大波形
X:缩小波形 (这个需要自己设置一下)
Ctrl +鼠标滚轮:波形的放大缩小
L:缩放至上次
R: 按照范围缩放
方向键:上下左右滚动(以行为单位)
翻页键:上下滚动(以页为单位)
Ctrl+左右方向键:左右滚动(以页为单位)
使用VSCode开发Verilog,包含语法检查,自动格式化,定义速览
没人乐意使用VIVADO自带的代码编辑器,稀烂的字体和瞎眼的白屏以及几乎没有的语法检查,所以大家一般都是用sublime或者vscode。而由于vscode插件众多和便于多电脑之间的配置同步,那必然还是使用VSCode。
- 安装VSCode,在Vivado工程设置中把Text editor设置为VSCode,使用如下参数,这样就可以直接从Vivado中调出VSCode
1 | cmd /S /k "code -g [file name]:[line number]" |
- 把Vivado的语法检查器加入系统路径,在Verilog插件的设置中把linter设置成xvlog,然后每一次保存后如果有错误就能看到语法检查的提醒
- 安装SystemVerilog and Verilog Formatter格式化工具插件,在扩展设置里输入如下参数,第二栏使用win64的版本
1 | --indentation_spaces=4 --named_port_alignment=align --port_declarations_alignment=align --module_net_variable_alignment=align |
然后就可以右键,格式化文档,用这个插件,对代码进行格式化
- 安装Ctags以支持变量定义快捷查看和跳转
先下载Ctags的https://github.com/universal-ctags/ctags-win32/tree/2020-09-15/23d50b5d
放到系统路径中,在VSCODE中的Ctags Path添加’ctags’
安装CTags Support插件
然后在工程文件夹下使用CMD终端输入ctags -R -f .tags
重启VSCode,现在把鼠标放在信号上就能看到定义了
按Ctrl然后点击信号就能跳转到定义
右键快速查看,速览定义就能直接对信号定义做出修改
调试技巧
在Vivado 综合为 Verilog “include” 文件定义正确的路径
有些时候我们的一些define需要在工程的各处被引用,所以需要进行全局的include来保证仿真器了解全局定义,否则的话编辑器只会检查同文件夹下的定义。
1.文件属性里设置成Global include
2.在Setting里搜索include可以找到工程Setting下的编译文件的位置
使用markdebug的方法将信号添加到ILA中
一种相对方便快捷的将要查看的信号添加到ILA中的方法,不用调用ILA IP核,每次都要修改。也更容易修改每个信号所对应ILA时钟域,一键产生多个对应的ILA。
1.先将要观测的信号前方添加上(mark_debug = “true”)
2.在综合中打开点击setup debug
3.如果是在之前的基础上再添加新的观测信号,选第一个,如果是从零开始,选第二个
这里一般不选,如果选了的就会把所有的信号都进行分析,我们这里只需要我们标记过的信号
4.在接下来的页面点击Find nets to add,在弹出的界面中输入信号的名称,并且与上一个markdebug为true的条件,这样就能精确搜索到我们需要的信号。然后点击OK将搜索结果添加到待调试的信号列表中。
5.然后点下一步,选择采样深度,一般1024足矣。Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。然后就可以点击完成,此时VIVADO会执行一段时间的分析,将信号添加进来。此时执行比特流生成,就能有新抓的信号。
固化FPGA的比特到FLASH上
这里指的是非ZYNQ的普通FPGA的固化,ZYNQ的FSBL要更复杂一点。
让板卡上电后自动加载固化好的比特,无需JTAG烧录。
注意:要想让板卡上电加载固化比特,必须拔掉JTAG,否则的话会导致无法加载。
生成固化用的bin文件
首先需要确定FPGA板子上的FLASH型号,即4个关键参数,生产商,大小,接口,位宽
例如我这颗,接口类型是spi,宽度支持x1,x2,x4,容量大小是256Mb即32MB
在Tools中选择Generate Memory Configuration File
这个界面,第一行Format可以选择mcs或者bin,这两个的区别在于,bin有个优点是文件大小相比mcs会小一些,带来的效果就是会烧录的更快以及上电后加载的更快(存疑?)。而mcs会携带头文件信息和校验,很适合于multiboot的操作(参见可重构那一篇文),如果仅仅是固化的话,bin就够了。
Memory Part:选择好FLASH器件,这里需要查阅板卡的手册
Filename:起一个名字
Interface:选择SPI的位宽,这个需要查阅FPGA板卡的原理图,找出位宽是多少,并在工程中通过下面这条约束来控制
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
Load bitstream files:需要打上勾,其他的不用动,在Bitfile中选择所需要固化的bit
下面的不需要勾选,直接点击OK完成bin文件的生成。
固化到FPGA上
打开硬件管理器,自动连接到板卡
右键FPGA芯片型号,选择add configuration memory device
在弹出的界面选择好memory型号,保持和前面是一样的,再选择好之前生成的bin文件,直接点击OK,就可以完成比特的固化了。
这里解释一下这个过程,Vivado通过JTAG将一个小型烧录程序加载到FPGA的RAM中。这个程序会通过JTAG读取来自电脑的bin文件数据,并通过SPI接口将bin文件写入FLASH存储器。所以我们一开始就需要规定好SPI的宽度,并且定好FLASH的类型,否则参数不对是无法正常工作的。
在线画时序图的网页:https://wavedrom.com/tutorial.html