学习板:ZYNQ7020
Verilog语法入门(二)
一、模块
1、简述
Verilog的模块相当与面向对象语言中的类,它定义了具有公有和私有属性的逻辑集合,在设计中可以多次实例化。
Verilog中可以将模块将模块看作项目的子组件,并且该组件定义了与其它模块或IC的连接关系。
先举例说明:
上图中A为与门、B为与非门、C为或非门,输入a、b、c、d,输出f,则这个逻辑电路可以当做一个模块,模块代码:
module aoi(a,b,c,d,f); //模块名aoi、端口列表 a、b、c、d、f
input a,b,c,d; //输入端口为a、b、c、d
output f; //输出端口为f
wire a,b,c,d,f; //定义信号的数据类型
assign f=~((a&b)|(~(c&d))); //逻辑功能描述
endmodule
从上面代码中可以看到,模块由两部分组成,一部分是接口描述,描述输入输出端口、信号的数据类型等;另一部分就是描述逻辑功能。
从书写形式上来看,具有以下特点:
① Verilog程序由模块组成,每个模块有关键字module开始、endmodule结束。
②每个模块首先要进行端口定义,并说明输入、输出口(input、output、inout),之后再进行逻辑功能描述。
③endmodule 后面没有分号“;”
每个verilog程序包括:模块声明、端口定义、信号类型声明、逻辑功能描述
整体框架:
moudle 端口名(端口列表);
input 输入端口列表;
output 输出端口列表;
inout 双向端口列表;
wire 线型数据类型列表;
reg 寄存器型数据类型列表;
parameter 参数型数据类型列表;
assign …(逻辑功能描述)…;
always …(逻辑功能描述)…;
function…(逻辑功能描述)…;
task…(逻辑功能描述)…;
… …(逻辑功能描述)…;
endmoudle
上面代码通过vivado软件综合后的电路:
可以看到与我们之前画的原理图是一致的。
当然我们可以把端口列表、定义合在一起:
module aoi(
input wire a,
input wire b,
input wire c,
input wire d,
output wire f
);
assign f=~((a&b)|(~(c&d)));
endmodule
2、模块声明
模式声明格式:
module 模块名(端口1、端口2…端口n);
模块结束时用关键字:endmodule
结合起来,一个模块:
module 模块名(端口1、端口2...端口n);
...
...
endmodule
3、端口定义
端口定义格式:
input 端口1,端口2…端口n;
output 端口1,端口2…端口n;
inout 端口1、端口2…端口n;
定义端口的注意事项:
①输入、双向端口不能定义为寄存器型
②测试模块中不需要定义端口
4、信号类型声明
对模块中所用的的所有信号,如端口信号(输入、输出)、节点信号的数据类型进行定义。
如:
reg aout; //定义信号aout为reg型
reg[7:0] bout; //信号bout为8位reg型
wire a,b,c,d; //信号a、b、c、d为wire型
如果信号的类型没有被定义,综合时,综合器默认该信号为wire型。
可以将端口声明和信号类型声明放在同一条语句中:
output wire a; //定义a为输出端口、数据类型为wire型
output reg[7:0] out; //定义out为输出端口、数据类型为reg型
input wire b; //定义b为输入信号,数据类型为wire型
可以将端口声明和信号类型声明放在模块端口列表中: