September 13, 2016
作者:dengshuai_super
出处:http://blog.csdn.net/dengshuai_super/article/details/52535925
声明:转载请注明作者及出处。
HDL语言用于建模时,可以根据抽象的层次进行分类:
可以用高级别的的愈发描述需求和概念(系统级)
可以将需求概念用数学形式描述(算法级)
可以用通用寄存器的传输操作来描述(RTL)(我们用语言来描述的代码都可以归结为寄存器的传输操作)
可以将通用寄存器描述的模型转变为逻辑门描述的模型(Gate-level)
可以将逻辑门描述的模型转变为用电路开关描述的模型(Switch-level)
HDL建模时,除了可以用不同层次的抽象进行分类,还可以根据其对信号的描述方式的不同划分为以下三种:
1、数据流建模
2、行为建模
3、结构化建模
在模块中对信号资源分配(或组合逻辑的连接)的描述,成为数据流描述(Data-flow Description),或称为数据流建模(Data-flow Modeling)
在模块中对信号的行为进行的描述,称为行为描述(Behavioral Description),或称为行为建模(Behavioral Modeling)
将诸多模块组织成一个更大的模块,其描述称为结构化描述(Structural Description),或称为结构化建模(Structural Modeling)
//二选一多路器的Verilog数据流建模
module two_to_one_dataflow(a,b,s,f);
input a;
input b;
input s;
output f;
assign f = (a&~s)|(b&s);//等号在这里是一个阻塞赋值
endmodule
`timescale 1ns / 1ns
module two_to_one_dataflow_tb;
reg a,b,s;
wire f;
two_to_one_dataflow u1(.a(a),.b(b),.s(s),.f(f));
initial
begin
a = 0; b = 0; s =0;
forever
begin
#20 a = 0; b = 0; s =0;
#20 a = 1; b = 0; s =0;
#20 a = 0; b = 1; s =0;
#20 a = 1; b = 1; s =0;
#20 a = 0; b = 0; s =1;
#20 a = 1; b = 0; s =1;
#20 a = 0; b = 1; s =1;
#20 a = 1; b = 1; s =1;
end
end
endmodule
//行为建模
module two_to_one_behaviour(a,b,s,f);
input a;
input b;
input s;
output f;
reg f;//什么时候声明为寄存器reg,什么时候声明为线网wire,默认情况之下声明为wire
//行为语句,说明他要做什么事情就行了,always后面跟着一个信号敏感表
always @ (a,b,s) //always语句称为行为描述语句,行为描述语句的驱动的信号一定声明为reg
begin
f <=(a&~s)|(b&s);//非阻塞赋值
end
endmodule
//显式建模和隐式建模的关系
//显式建模(EM):当我们要建立一个模型的时候,我们建立无论是数据流或者是行为,显式建模
//它的模块的名称端口的名称,端口的方向都是显式声明的。
//隐式建模(IM):被引用的信号就是它的输入,被驱动的信号就是它的输出(以上always语句就是IM)
`timescale 1ns / 1ns
module two_to_one_behaviour_tb;
reg a,b,s;
wire f;
two_to_one_behaviour u1(.a(a),.b(b),.s(s),.f(f));
initial
begin
a = 0; b = 0; s =0;
forever
begin
#20 a = 0; b = 0; s =0;
#20 a = 1; b = 0; s =0;
#20 a = 0; b = 1; s =0;
#20 a = 1; b = 1; s =0;
#20 a = 0; b = 0; s =1;
#20 a = 1; b = 0; s =1;
#20 a = 0; b = 1; s =1;
#20 a = 1; b = 1; s =1;
end
end
endmodule
module and_gate_behaviour(a,b,f);
input a;
input b;
output f;
reg f;
always @(a,b)
begin
f <= (a&b);
end
//and (f,a,b);
endmodule
module or_gate_behaviour(a,b,f);
input a;
input b;
output f;
reg f;
always @(a,b)
begin
f <= (a|b);
end
// or (f,a,b);
endmodule
module inverter_behaviour(a,f);
input a;
output f;
reg f;
always @(a)
begin
f <= ~a;
end
endmodule
module two_to_one_structural(a,b,s,f);
input a;
input b;
input s;
output f;
wire x1,x2,x3;
inverter_behaviour u1(.a(s),.f(x1));
and_gate_behaviour u2(.a(a),.b(s),.f(x3));
and_gate_behaviour u3(.a(b),.b(x1),.f(x2));
or_gate_behaviour u4(.a(x3),.b(x2),.f(f));
endmodule
`timescale 1ns / 1ns
module two_to_one_structural_tb;
reg a,b,s;
wire f;
two_to_one_structural u1(.a(a),.b(b),.s(s),.f(f));
initial
begin
a = 0; b = 0; s =0;
forever
begin
#20 a = 0; b = 0; s =0;
#20 a = 1; b = 0; s =0;
#20 a = 0; b = 1; s =0;
#20 a = 1; b = 1; s =0;
#20 a = 0; b = 0; s =1;
#20 a = 1; b = 0; s =1;
#20 a = 0; b = 1; s =1;
#20 a = 1; b = 1; s =1;
end
end
endmodule
来源:
https://ke.qq.com/user/tasks/index.html?cid=117307#tid=100127911&fr=2