标题一、Verilog的基本设计单元是模块,模块的基本结构分成三部分:
1.端口说明:
第一种写法:同时说明端口的方向、位宽、数据类型和端口名称
module 模块名
(
IO说明 [端口1的信号位宽-1:0] 端口1名称, /*IO说明为input/output/inout , 位宽为1时 省略不写*/
IO说明 [端口2的信号位宽-1:0] 端口2名称,
........
IO说明 [端口n的信号位宽-1:0] 端口n名称
);
第二种写法:只说明端口名称,端口的方向、位宽在模块内部说明
module 模块名(端口1名称,端口2名称,... ,端口n名称);
/* 此为写在模块内容中的端口IO说明语句
input [端口1的信号位宽-1:0] 端口1名称, (输入口)
output [端口2的信号位宽-1:0] 端口2名称, (输出口)
........
inout [端口n的信号位宽-1:0] 端口n名称 (输入输出口)
*/
2.内部信号说明:
在模块内部用到的wire (信号线型)和reg(寄存器型)变量说明。
reg [信号位宽-1:0] 寄存器变量名
wire [信号位宽-1:0] 变量名
3.功能定义:
模块中最重要的部分是逻辑功能定义,通常由三种方法来说明逻辑功能。
方法一:
用连续赋值语句assign: 描述组合逻辑最常用的方法
e.g. assign a = b & c
方法二:
用实例元件:调用库中的原件或其它模块
e.g. and u1(q,a,b) //and为元件名称,u1为例化标识
方法三:
用过程块“always”、“initial”
e.g.
always (@posedge clk)
Begin
if(clr==1) r_a <=0;
else r_a<=d;
end
标题二、模块的引用:
引用方法1:按照端口顺序建立联系法,在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名。
格式:模块名(连接端口1的信号名,连接端口2的信号名, ...... ,连接端口n的信号名)
e.g.
module AND2_Test(A,B,F);
input A;
input B;
output F;
assign F = A&B;
endmodule
//调用
module T1
(
input X,input Y,output Z
);
AND2_Test U1(X,Y,Z);
endmodule
引用方法2:在引用时用 “.” 符号,表明原模块定义时规定的端口名称和连接信号名。这种表示的好处是可以用端口名与被引用的模块相对应,而不必严格按照端口顺序对应,提高程序的可读性和可移植性,减少出错的可能。
格式:模块名(.端口1名(连接信号1名),.端口2名(连接信号2名), ...... ,.端口n名(连接信号n名))
e.g.
module AND2_Test(
input A;
input B;
output F;
);
assign F = A&B;
endmodule
//调用
module T1
(
input X,input Y,output Z
);
AND2_Test U1(.A(X),.B(Y),.F(Z));
endmodule