基础知识
1 模块(Module)
Verilog中的module可以看成一个具有输入输出端口的黑盒子,该黑盒子有输入和输出接口(信号),通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数)
图1 模块示意图
1.1 模块描述
图1 所示的顶层模块(top_module)结构用Verilog语言可描述为:
🔹 模块以module 开始,endmodule结束
🔹 top_module 为模块名
🔹 input : 为输入端口
🔹 output: 为输出端口
🔹 所有代码必须处于module模块中!
同理,图1 所示的次级模块(mod_a)结构用Verilog语言可描述为:
注意事项:每个模应单独块处于一个.v文件中,模块名即为文件名(规范代码!)
1.2 模块输入输出信号
🔹 输出:output
🔹 输入:input
模块的输入输出端口都可看出模块的信号,若不写信号类型则默认为wire类型信号!
除了wire型信号,还有reg型信号,具体详见1.4节!
1.3 模块实例化
如图1所示,top_module的两个输入端口连接到次级模块(mod_a)的输入端口,那如何在top_module模块模块中使用mod_a模块的功能呢?这就需要通过模块实例化,可以把top_module看成C语言中的主函数,次级模块mod_a看成普通函数,这样就可以在主函数中调用其他函数来完成相应的功能!
在top_module中实例化mod_a的方式为:
模块实例化语法:模块名 实例名(定义连接port的信号);
🔹 按mod_a定义的端口顺序实例化: mod_a instance1 (a, b, out);
🔹 按mod_a端口名实例化: mod_a instance2 (.in1(a), .in2(b), .out(out)); (推荐此种写法)
2 逻辑块(always、generate)
2.1 always逻辑块
always块可构建 组合逻辑块 和 时序逻辑块,复杂的逻辑操作都需要处于该逻辑块中,如if、case、for等
(1) 组合逻辑块
🔹 always逻辑块中任意信号变化时立即触发,执行begin - end之间的语句
🔹 begin - end用于将多条语句组成一个代码块,只有一条语句时可省略
(1) 时序逻辑电路
🔹 clk 信号的上升沿触发
🔹 posedge: 上升沿
🔹 negedge: 下降沿
2.2 generate逻辑块
generate主要结合for循环使用,主要用途有:
🔹 对向量中的多个位进行重复操作
🔹 对同一个模块进行多次重复实例化(主要用途)
(1) 操作向量