赞
踩
本次的学习内容是verilog的基本设计单元:模块(module)
模块(module)是verilog设计基本单元。一共由两部分组成:一部分是描述接口,另一部分描述逻辑功能。下面将举个例子说明模块的基本构成:
- module mux2_1(a,b,sel,mux_out);
- input a,b; //****************//
- input sel; //****端口描述****//
- output mux_out; //***************//
-
- assign mux_out = (sel==1)?a:b; //**逻辑功能描述**//
- endmodule
这段代码实现的功能是二选一多路选择器,其中
●a,b,sel作为输入端口,mux_out作为输出端口,第2-4行的代码就完成了端口的描述。
●通过三目运算符的操作,第5行代码完成逻辑功能的描述。
●mux2_1为用户自定义模块名,整个模块以module开头endmodule结尾
module 模块名(端口名1,...,端口名m+n+k);
input [信号位宽-1:0] 端口名1;
.
. //**i个输入**//
.
input [信号位宽-1:0] 端口名m;
output [信号位宽-1:0] 端口名m+1;
.
. //**n个输出**//
.
output [信号位宽-1:0] 端口名m+n;
inout [信号位宽-1:0] 端口名m+n+1;
.
. //**k个双向口**//
.
inout [信号位宽-1:0] 端口名m+n+k;
也可以定义成如下格式:
module 模块名(
input [信号位宽-1:0] 端口名1,
.
. //**i个输入**//
.
input [信号位宽-1:0] 端口名m,
output [信号位宽-1:0] 端口名1,
.
. //**n个输出**//
.
output [信号位宽-1:0] 端口名n,
inout [信号位宽-1:0] 端口名,
.
. //**k个双向口**//
.
inout [信号位宽-1:0] 端口名k
);
注意两种定义的区别:
第一种是在括号结束后进行定义,因此每个语句用分号 ; 结束。
第二种是在括号内部进行的定义,因此每个语句用逗号 , 连接。
当某些信号不是作为输入或输出信号,而是作为中间信号被我们所用到,那么就需要声明。
格式如下:
wire [信号位宽-1:0] W变量1;
reg [信号位宽-1:0] R变量1;
.
.
.
这里的wire与reg是数据类型,下一节展开讲。
模块中最重要的部分就是逻辑功能定义部分,由以下三种方法来产生逻辑:
(1)用assign语句,如例1.1中:assign mux_out = (sel==1)?a:b;
assign只适用于组合逻辑,且描述只需assign后面接一个方程式即可。
(2)用实例元件,如:and U0(out, a, b);
该方法就是调用库原件,键入元件名和相应的引脚即可。其中and就是元件名与门,U1是用户定义模块名,a,b为输入,out为输出。
注:要求模块名必须是唯一的,目的是区分调用的多个相同元件
(3)用always块,如:
- always@(posedge clk or posedge rst)
-
- begin
-
- if(rst)
-
- out <= 0;
-
- else
-
- out <= out + 1;
-
- end
always块既可描述组合逻辑,又可描述时序逻辑。
模块调用语句格式如下:
module_name instance_name(port_associations);
其中module_name是被调用模块的模块名,instance_name是用户定义的引用名,port_associations是现模块与原模块之间信号端口的关联方式。而关联方式的格式有如下两种:
(1)在引用时用“.”符号表明是原模块定义的端口名,()里表示的是现模块的端口,如:
mux2_1 M0(
.a(A),
.b(B),
.sel(Sel),
.out(Out),
);
相当于把这2选1多路选择器调用到现在这个模块,现在这个模块有A,B,Sel,Out这些信号端口,将A与原模块中的a对应,B与原模块中的b对应,Sel与原模块中的sel对应,Out与原模块中的out对应。意义就是把现模块的A,B,Sel分接入到二选一多路选择器的输入端,那么Out输出的就是Sel选择A,B的结果。
(2)引用时,严格按照原模块端口顺序连接,无需标注原模块端口名称,如:
mux2_1 M0(A,B,Sel,Out);
表3.1 端口关联关系
模块调用注意事项:
(1)两种关联格式不能混用,即不可这样写:mux2_1 M0(A,.b(B),Sel,Out);
(2)不能以循环方式嵌套模块,即不能在always语句里调用模块。
1. 如果assign、例化元件、always三者在同一模块中,这三种逻辑功能描述是同时进行的。也就是说,无论这三个描述代码先后顺序如何,他们都是并行的。
2.但是对于always块来说,逻辑是按照指定顺序执行的,因此always也称为过程块。
总的来说,verilog中的所有过程块、连续赋值语句(assign)、实例引用都是并行的.
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。