github传送门(练习写的代码,约束文件,仿真文件)
文章目录
Vivado
基本流程
- 写代码。在sources里添加文件,把写好的模块粘贴进去并保存。
- [可选] 写仿真文件 (Simulation)(模板代码)。用来在电脑上测试代码的运行结果是否达到预期,如果没问题就可以下到板子上 (写好仿真文件后在最左边Simulation - Run Simulation)(莽的话可以不用仿真直接上板子)。
- 综合 (Synthesis)。先检查代码有没有毛病,然后根据代码机器自动生成最优电路图(可以在最左边Synthesis - Open Synthesized Design - Schematics里看到电路图)。
- 实现 (Implementation)。把综合的结果与现实中的板子具体联系起来(通过约束文件),相当于从软件走到了硬件。
- 生成比特流文件 (Bitstream)。生成的比特流文件就可以上传到板子上了。
- 上传到板子上,通过Hardware Manager操作。
关于封装IP核和使用Block Design
千万千万千万不要把IP核导入到源代码所在的工程文件里,测试的时候debug有你哭的。
Verilog
module / 模块
- module里的内容都是并发执行的。
不在always和initial块里的代码就是单纯调用这个module的时候才会执行。(如果输入改变了会调用这个module)
always块
-
多个always块并发执行,也就是说不同的主循环函数并发执行。
-
always里不能实例化模块
-
一般组合逻辑电路用阻塞赋值(
=
),时序逻辑电路用非阻塞赋值(<=
)。
组合逻辑
always @(触发器变量)
是组合逻辑电路,always @(posedge clk)
是时序逻辑电路。
时序
-
posedge(positive edge) 是上升沿关键字,上升沿指的是变量从0变成1的那个瞬间。对应下降沿(negedge - negative edge)就是变量从1变成0的那一瞬间。因此
@(posedge var)
指的是对var的上升沿敏感,意思就是var达到上升沿的时候就会触发。 -
always @(<敏感信号表达式>)
可以理解成onValueChangeListener,当敏感信号表达式的值发生变化时,就会执行always块。 -
因此
always @(posedge clk)
代表在每次时钟clk到达上升沿的时候会执行一次(因为并发执行,所以时序逻辑电路用非阻塞赋值就可以实现与时钟上升沿同步修改变量),因此这个always块里的代码可以理解成主循环。 -
不论上升沿clk还是下降沿rst,在触发时读取到clk和rst的值都是这两个信号接下来要变成的值。(即clk读取到的值为1,rst读取到的值为0)
Generate块(书上p83)
- 用来在模块中循环实例化其他模块。关键字为
generate
,对应声明循环控制变量的关键字为genvar
示例:
genvar i;
generate
for(i=0; i<n; i=i+1)
begin: tag_name
module_name_1 instance_name_1 (input_1,output_1);
//可以继续实例化别的模块,如:
//module_name_2 instance_name_2 (input_2,output_2);</