使用 Vivado
开始之前
- 实验工程的路径不应有中文和空格。
- 默认掌握了 Verilog 基础并知道如何进行测试。
- 如果你的数逻课程一路摸鱼,可以参考:菜鸟Verilog教程、HDLBits、数逻助教的时候摸出来的slides。
- Slides 中所有使用
bd
文件(类似于数逻画的原理图)的部分,都改为使用 Verilog 完成,避免 Vivado 的奇怪 bug 影响你的实验。 - 可以调整最多线程数,加快综合,具体设置可参考 vivado 多线程编译设置(之后的文档中,参考博客我会尽量选择墙内可查看的)。
- 对于使用 Windows 系统的同学。工程和 IP 文件命名尽量简短干练且位于硬盘根目录等浅层目录。否则后续实验会出现路径超出 Windows 系统支持的最大长度,一旦出现就需要将之前所有的 IP一一打开全部重新生成重新归置。
- 将整学期实验的所有 IP 核组织到统一的浅目录中,后续所有实验的 IP Catalog 都引用该目录下的 IP。
- 在修改某些 IP 时,采用右键 IP,选择
Edit in IP Packager
进入自动生成的子工程中修改,修改完成后Repackage IP
,然后回到父工程中Upgrade IP
即可。可以避免自认为IP更新了,实际上工程并没识别到。 - 在进行
Generate Output Product
时,尽量从头到尾均选择Out of Context
模式。可以便于仿真。 - Slides 中存在一定的错误,请认真阅读,结合理论课程知识分析,只要理论课认真学习,完全可以辨识和解决。
Tools → Setting
中可以开启一些设置方便实验。Source File → File Saving
中可以开启自动保存源文件,减少弹窗询问是否保存。Dispaly → Spacing → Density
调整为Compact
可以在小屏幕上显示更多内容。Text Editor
中可以调整编辑器为其他第三方编辑器 如 VS Code。Text Editor → Fonts and Colors
可以调整 Fonts family 和 size,原始的太费眼睛了。
⬆️开始实验之前,请认真阅读以上建议。
使用 Vivado
这一节你将尝试使用 Vivado 完成小项目,体验 Vivado 的工作流程。
这里我们将列出 Vivado 常见的用法,其中部分内容并不需要实际操作,也不用在报告中给出。写出来的目的是用作参考,以便你在实际操作时能够快速找到对应的步骤。不要求在报告给出的部分可以跳过,之后实验用到时会用即可。
Vivado 的基本操作
创建 Vivado 工程
- 启动 Vivado 之后,选择顶部快捷栏中的
File -> Project -> New
。 - 在 Project Name 界面中修改工程名称及路径,请注意,路径和名称中不要有中文,以避免一些问题。
- 在 Project Type 界面,选择
RTL Project
,子选项保持默认即可(把Do not specify at this time
勾上,表示在新建工程时不去指定源文件)。 - 在 Default Part 界面,进入
Parts
并在其中找到并选择xc7a100tcsg324-1
。
添加源文件
-
工程创建后,可以在
Flow Navigator
界面(工作流窗口)下点击Add Sources
,选择Add or create design sources
添加源文件。Info
- 选择
Add or create constrains
,添加约束文件,主要有引脚约束、时序约束和物理约束等。 - 选择
Add or create design sources
,添加 Verilog 源文件,用于综合。 - 选择
Add or create simulation sources
,添加仿真测试文件,用于仿真。
- 选择
-
点击
Next
后,可以通过新建源文件或者从其他地方导入源文件。Create File
创建文件,并选择文件类型为Verilog
,输入文件名,文件保存路径选择<Local to Project>
,点击 OK。- 选择
Add Files
,在弹出的对话框中找到想要添加的源文件,并点击OK
。当前对话框左下角有一个选项是Copy sources into project
,可选择是否将源文件复制到工程目录下。本节实验中,是否勾选Copy sources into project
选项对实验过程影响不大。 如果勾选,它会将你添加的文件拷贝到工程目录下xxx.srcs/
(xxx
是工程名) 对应的目录下。 - 选择
Add Directories
,与Add Files
类似,区别在于它会将目录下的所有文件添加到工程中。
-
添加源文件后点击
Finish
,继续弹出的对话空中,可以设置一些端口,但是我们现在直接单击OK
。 - 创建完成后可以在
Sources -> Design Sources
(源文件窗口)中看到刚刚创建的文件,这个文件就是我们可以编写 verilog 程序的文件。双击后即可显示文件代码,我们可以在里面书写代码。 - 添加用于仿真的代码、添加约束文件的步骤与添加源文件类似,这里不再重复。
仿真
- 点击
Add Sources
,通过上面的过程添加仿真测试文件。 - 创建完成后在源文件窗口找到
Simulaion Sources
下双击刚刚创建的仿真文件,这是一个空文件,我们需要添加代码。 -
在进行仿真前,请检查仿真文件
Simulation Sources
中的顶层模块是否选择正确。一个工程中可以有多个仿真文件,但只有一个仿真顶层模块,如果你需要使用其他的仿真文件,可以通过右键点击要设为顶层模块的文件,并选择Set as top
进行切换。 -
确认无误后,点击左边工作流窗口栏
SIMULATION -> Run Simulation
,进行仿真。
仿真的相关按钮
首先认识一下界面,上栏图中按钮从左到右依次为:
- Restart:清空当前波形,准备进行下次仿真(Windows 下某些版本极易造成闪退)。
- Run All:进行一遍仿真,直到遇到停止信号(如
$finish()
或在 GUI 中设置的断点)或某一时间上限。 - Run for xxx:与右侧两栏配合,表示从当前仿真位置开始,继续仿真一段时间(时间由按钮右方的数字和单位决定)。
- Step:笔者并不清楚此功能,推测是多个断点间步进。
- Relaunch Simulation:如果修改了仿真文件或用于综合的代码,需要重新加载。
在波形界面栏中也有几个较为实用的按钮:
- Search:选中波形后,可以根据想要的值(完全匹配、高位匹配或低位匹配)搜索,找到该值所在的位置。
-
Save Waveform Congfiguration:如果对波形设置有修改(如添加或删除了信号,修改了信号的数制,信号线颜色等)可以通过保存得到配置文件,方便之后仿真时直接使用修改后的配置文件。
- 在仿真界面中,通过
File > Simulation Waveform > Open Configuration
可以打开之前保存的配置文件,打开后点击Relaunch Simulation
即可生成对应波形。
- 在仿真界面中,通过
-
Zoom Fit:可以将当前缩放自动调整为较合适的大小。
- 其他按钮的功能可以自行尝试,部分按钮需要先选中信号才能使用,没有特别需要注意的点。除此之外,在波形界面里,可以右键点击波形,选择
Radix
来修改数制,选择Color
来修改波形颜色。
生成 bitstream 并烧录
Bitstream 文件是一种由比特流组成的文件,用于存储和传输数据。在我们的实验中,它用来存储 FPGA 的配置信息,可以通过烧录对 FPGA 进行重新编程。
生成 bitstream 的流程是 Synthesis -> Implementation -> Generate Bitstream
,均可在左边的工作流窗口中找到。如果你直接点击 Generate Bitstream
,Vivado 会自动帮你完成前两步。
约束文件
在生成 bitstream 之前,我们需要检查并修改约束文件。
引脚约束有两种方式:
- 工具直接约束:先进行综合,综合后打开设计图。点击
I/O Ports
,在脚本流程窗口找到Find Results
中进行管脚配置。其中Package Pin
对应 FPGA 中的管脚,I/O Std
对应电平标准。约束完成后,在左上角的菜单栏和快捷键窗口找到保存按钮并命名,点击OK
。 - 脚本约束法:在综合前,点击
Add Sources
添加约束文件,之后点击Next
,Finish
。- 综合的方法:点击工作流窗口
SYNTHISIS
下Run Synthesis
,弹出综合对象路径及运行线程数设置窗口,采用默认设置,直接点击OK
,综合完成后弹出成功窗口,可以继续进行实现步骤,或者打开综合后的原理图设计以及查看综合报告。
- 综合的方法:点击工作流窗口
一般来说,我们都使用脚本约束法进行引脚约束,下面给出脚本约束文件的例子。
Example
以 I1
的约束进行举例:
I0
分配了引脚 J15
,这是板上最右侧的开关,你可以在 A7 板对应开关上方看到 J15
的标记;同时,它规定了引脚的输入/输出标准为 LVCMOS33
,此处不需要深究,感兴趣的同学可以自行搜索。
在本次或者后续实验中,我们会给出部分引脚约束文件,你可能需要进行修改。我们规定你只需要修改以下划线 _
开头的内容(即 _SOME_PIN
以及 _which_signal
),其他部分的内容请保持不变,之后的实验中也以下划线开头为“需要修改部分”的提示。
这里给出一个修改的例子,你可以尝试修改下边这个约束,使端口 I2
分配到引脚 M13
上,输入/输出标准为 LVCMOS33
。
生成 bitstream
- 修改约束文件后,你可以点击工作流窗口的
PROGRAM AND DEBUG > Generate Bitstream
生成比特流。 - 生成比特流的结果将通过弹窗方式提示,如果生成失败请查看日志文件确定失败的原因。
- 得到 bitstream 后,我们需要将下载器连接到电脑上,点击
PROGRAM AND DEBUG > Open Hardware Manager > Open Target > Auto Connect
进行识别和连接,成功连接后,点击Program Device
选择xc7a100t
设备,在下载程序界面选择我们刚刚生成的比特流文件,将其下载到板上。这一步可能会出现驱动未安装的问题,请自行尝试解决,如果无法解决问题请及时联系助教。
IP 核
Vivado 的强大之处在于 IP 模块的可重用性。以上是设计者自己设计包含源文件的流程,接下来介绍使用并创建 IP 核的流程。
注意到在真正的工业流程中,我们需要在仿真通过,确认模块功能准确之后,才进行模块的封装。
这里我们以生成一个 5 位的二选一的多路选择器 MUX2T1_5
的 IP 核为例。
含源代码的 IP 核封装
- 在上方菜单栏和快捷键窗口单击
Tools -> Create and Package New IP -> Next
。 - 选择
Package your current project
,点击Next
,选择 IP 的保存路径,点击Next
,点击Finish
。 - 随后会出现
Package IP - MUX2T1_5
的界面,选择Review and Package
,点击Package IP
。 - 这样,
MUX2T1_5
的 IP 模块就封装完成。
不含源代码的 IP 核封装
-
网表文件
.edf
的生成。- 工程的创建,源文件添加,步骤与上述相同。
- 在工作流窗口中找到
Settings
打开设置后找到Synthesis
选项并点击,在Options
部分划到最下面,在More Options
一栏输入-mode out_of_context
属性,表示在该级不插入任何 I/O BUFFERs。设置后,点击OK
。 - 随后在工作流窗口点击
Run Synthesis
开始综合。 - 综合结束后弹出
Synthesis Completed
的对话框,在该对话框中,选择Open Synthesized Design
前面的复选框并点击OK
。 - 在 Vivado 当前设计界面底部的
Tcl Console
窗口中依次输入下面的命令:write_verilog -mode synth_stub E:/FPGA/ip/MUX2T1_5.v
导出空端口文件。write_edif E:/FPGA/ip/MUX2T1_5.edf
将MUX2T1_T.edf
文件写到选择的目录下。(目录按实际需求即可)若当前源文件里 含有 Xilinx IP 则需通过如下命令生成.edf
文件:write_edif -security_mode all E:/FPGA/ip/MUX2T1_5.edf
。
-
根据
.edf
文件进行 IP 封装。- 工程的创建,步骤与上述相同。
- 在添加源文件时,单击
Add Files
按钮,弹出Add Source Files
对话框。在该对话框中,找到MUX2T1_5.edf
,MUX2T1_5.v
文件。并勾选Copy sources into project
,点击finish
直接结束。 - 接下来的封装步骤与之前类似,在 Vivado 当前工程主界面的主菜单下,执行菜单命令
Tools -> Createand IP Package...
,请参考带源文件的方法。封装完成,可在对应目录下查看结果文件。
IP 核的调用
- 含源文件版的 IP 核的调用
- 拷贝模块的 IP 核文件夹到当前工程根目录,可以看到每个模块的 IP 核文件夹都包含
xgui
核componet
以及其对应的源文件。 - 打开 IP 添加窗口:
PROJECT MANAGER -> Settings -> Project Settings -> IP -> Repository
。 - 添加自定义 IP:点击
+
,添加自定义 IP 路径,点击 OK 添加完成会弹出成功添加信息提示框,点击 OK。- 若依照步骤先将所有的模块拷贝到当前根目录下,则此处直接将根目录添加进来,可以一次性添加所有模块。
- 单击
IP Catalog
,出现 IP 模块搜索栏。 - 搜索刚才加入的 IP 核的名称,双击添加 IP,下一步点击 OK,综合输出选项选择
Global
,点击 Finish,即可看到添加成功。 - 点击 Sources 栏下方的 IP Sources,在对应 IP 名称下双击
Instantiation Template
下方的.veo
文件,出现调用 IP 的模板文件,可用作参考。
- 拷贝模块的 IP 核文件夹到当前工程根目录,可以看到每个模块的 IP 核文件夹都包含
- 不含源文件版的 IP 核的调用
- 拷贝模块的 IP 核文件夹到当前工程根目录,可以看到每个模块的 IP 核文件夹都包含
xgui
核componet
以及其对应的.edf
文件和.v
端口文件。 - 后续流程同上。
- 拷贝模块的 IP 核文件夹到当前工程根目录,可以看到每个模块的 IP 核文件夹都包含
存储器 ROM、RAM
ROM、RAM 是 FPGA 中常见的存储器,我们可以通过 IP 核生成这两种存储器。
ROM
下面我们以用 IP 核生成一个 1024\(\times\)32bit 的 ROM 核为例。
- 在工作流窗口选择
IP Catalog
,将在工作区弹出IP Catalog
的窗口。 - 点击搜索栏,输入
memory generator
,选择Distributed Memory Generator
(异步访问) 或Block Memory Generator
(同步访问)。 -
双击
Distributed Memory Generator
弹出窗口第 1 页,进行核参数设置:我们填入存储单元数 1024 和字长 32,存储类型选择 ROM(不要点击
OK
)。 -
点击
RST & Initialization
,点击Browse...
选择初始化关联文件(ROM.coe
),其余选项不用修改,随后点击OK
即可生成 IP 核。 - 生成后调用:核生成后在源文件窗口出现
ROM_D.xci
模块。我们可以直接在 verilog 代码里实例化这个模块,例子如下:
RAM
RAM 的生成与 ROM 类似,区别如下:
memory generator
只能选择Block Memory Generator
(有时钟)。- 核参数设置时,在
Basic
栏下面的Memory Type
里,下拉选择Single Port RAM
;在Port A Option
设置Write Width
和Read Width
为 32,Write Depth
和Read Depth
为 1024。Enable Port Type
选择Always Enabled
;Port A Optional Output Registers
处不要勾选Primitive Output Register
(若勾选,输出会慢一个周期)。 - 生成成功后即可实例化这个模块,例子如下:
FAQ
synthesis failed with NO Warnings/Errors
请查看“计算机名称”,如果为中文,请参照 Windows 10 修改电脑名称将计算机名称修改为英文。Windows 11 用户可以在设置-系统-系统信息-重命名这台电脑
进行修改,也可以直接搜索“重命名你的电脑”。感谢吴cy同学发现的解决方法。