数据流描述 assign:
即信号从输入流向输出,并不会在其中存储。 没有reg,只有assign。数据流描述中最基本的语句是assign连续赋值语句。
eg: 4位全加器
// 4位全加器
module Full_Add_4b_1(A, B, Cin, Sum, Cout);
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
assign {Cout, Sum} = A + B + Cin;
endmodule
行为描述 always:
类似数据流的建模方式,但一般是把用 initial块 语句或 always 块 语句描述的归为行为建模方式。
只有寄存器 reg型 的信号才可以在 always 和 initial 语句中进行赋值。从0 时刻开始always 语句是一直重复执行,由敏感表(always 语句括号内的变量)中的变量触发。
eg: 4位全加器
module Full_Add_4b_2(A, B, Cin, Sum, Cout);
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
reg[3:0] Sum; // reg型变量才可以用always
reg Cout;
always @(A or B or Cin)
begin
{Cout, Sum} <= A + B + Cin;
end
endmodule
结构化描述 include:
实例化已有的功能模块,这些功能模块包括门原语、用户自定义原语(UDP)和其他模块(module)。
类似于 “顶层封装” 各个模块,中间如果有连线全是 wire。
eg: 4位全加器
`include "Full_Add_4b_1.v"
module Full_Add_4b_3( A, B, Cin, Sum, Cout);
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
//实例化全加器
Full_Add_4b_1 FA0(A, B, Cin, Sum, Cout); // 同名例化
endmodule
eg: 1位全加器
module Full_Add_1b_3(A, B, Cin, Sum, Cout);
input A;
input B;
input Cin;
output Sum;
output Cout;
wire S1, T1, T2, T3; // 模块间连线
// -- statements -- //
xor x1 (S1, A, B); // 异或门 A⊕B, A、B是输入,S1是输出
xor x2 (Sum, S1, Cin);
and A1 (T3, A, B ); // 与门 , A、B是输入,T3是输出
and A2 (T2, B, Cin);
and A3 (T1, A, Cin);
or O1 (Cout, T1, T2, T3 ); // 或门, T1, T2, T3是输入,Cout是输出
endmodule
eg: 2个1位全加器组成的两位全加器
顶层模块Full_Add_2b_3 调用了两个一位的全加器 Full_Add_1b_3,即顶层模块例化了两个现成的模块
`include "Full_Add_1b_3.v"
module Full_Add_2b_3(FA, FB, FCin, FSum, FCout) ;
parameter SIZE = 2;
input [SIZE:1] FA;
input [SIZE:1] FB;
input FCin;
output [SIZE:1] FSum;
output FCout;
wire FTemp;
Full_Add_1b_3 FA1( .A (FA[1]), .B (FB[1]), .Cin (FCin) , .Sum (FSum[1]), .Cout (FTemp) );
Full_Add_1b_3 FA2( .A (FA[2]), .B (FB[2]), .Cin (FTemp) , .Sum (FSum[2]), .Cout (FCout) ); // .A (FA[2]) ,其中.A 表示调用器件的管脚A,括号中的信号表示接到该管脚A的电路中的具体信号
endmodule
数字系统的设计过程为:
Idea->行为级描述->RTL描述->门级网标->物理版图