3.3 三种建模方式
在HDL的建模中,主要有结构化描述方式、数据流描述方式和行为描述方式,下面分别举例
说明三者之间的区别。
3.3.1 结构化描述方式
结构化的建模方式就是通过对电路结构的描述来建模,即通过对器件的调用(HDL概念称为
例化),并使用线网来连接各器件的描述方式。这里的器件包括Verilog HDL 的内置门如与门and
,异或门xor等,也可以是用户的一个设计。结构化的描述方式反映了一个设计的层次结构。
例[1]:一位全加器
图4 一位全加器的结构图
代码:
module FA_struct (A, B, Cin, Sum, Count);
input A;
input B;
input Cin;
2004-08-16 第12页,共41页
版权所有,侵权必究
绝密
Verilog HDL 入门教程请输入文档编号
output Sum;
output Count;
wire S1, T1, T2, T3;
// -- statements -- //
xor x1 (S1, A, B);
xor x2 (Sum, S1, Cin);
and A1 (T3, A, B );
and A2 (T2, B, Cin);
and A3 (T1, A, Cin);
or O1 (Cout, T1, T2, T3 );
endmodule
该实例显示了一个全加器由两个异或门、三个与门、一个或门构成。S1、T1、T2、T3则是
门与门之间的连线。代码显示了用纯结构的建模方式,其中xor 、and、or 是Verilog HDL 内置的门
器件。以 xor x1 (S1, A, B) 该例化语句为例:
xor 表明调用一个内置的异或门,器件名称xor ,代码实例化名x1(类似原理图输入方式)。
括号内的S1,A,B 表明该器件管脚的实际连接线(信号)的名称,其中 A、B是输入,S1是
输出。其他同。
例[2]:两位的全加器
两位的全加器可通过调用两个一位的全加器来实现。该设计的设计层次示意图和结构图如
下:
Four_bit_FA
FA_struct FA_struct
A
B
Cin
Sum
CountFA
A
B
Cin
Sum
CountFA
Four_bit_FA
FA
_struct
_struct
FCin
FB
FSum
FCount
图5 两位全加器的结构示意图
代码:
module Four_bit_FA (FA, FB, FCin, FSum, FCout ) ;
parameter SIZE = 2;
input [SIZE:1] FA;
2004-08-16 第13页,共41页
版权所有,侵权必究
绝密
Verilog HDL 入门教程请输入文档编号
input [SIZE:1] FB;
input FCin;
output [SIZE:1] FSum;
output FCout;
wire FTemp;
FA_struct FA1(
.A (FA[1]),
.B (FB[1]),
.Cin (FCin) ,
.Sum (FSum[1]),
.Cout (Ftemp)
);
FA_struct FA2(
.A (FA[2]),
.B (FB[2]),
.Cin (FTemp) ,
.Sum (FSum[2]),
.Cout (FCount )
);
endmodule
该实例用结构化建模方式进行一个两位的全加器的设计,顶层模块Four_bit_FA 调用了两个一
位的全加器 FA_struct 。在这里,以前的设计模块FA_struct 对顶层而言是一个现成的器件,顶层模
块只要进行例化就可以了。
注意这里的例化中,端口映射(管脚的连线)采用名字关联,如 .A (FA[2] ) ,其中.A 表示
调用器件的管脚A,括号中的信号表示接到该管脚A的电路中的具体信号。
wire 保留字表明信号Ftemp 是属线网类型(下面有具体描述)。
另外,在设计中,尽量考虑参数化的问题。
器件的端口映射必须采用名字关联。
3.3.2 数据流描述方式
数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模。基本的机制就
是用连续赋值语句。在连续赋值语句中,某个值被赋给某个线网变量(信号),语法如下:
assign [delay] net_name = expression;
如:assign #2 A = B;
2004-08-16 第14页,共41页
版权所有,侵权必究
绝密
Verilog HDL 入门教程请输入文档编号
在数据流描述方式中,还必须借助于HDL提供的一些运算符,如按位逻辑运算符:逻辑与
(&),逻辑或()等。
以上面的全加器为例,可用如下的建模方式:
图6 一位全加器的结构图
`timescale 1ns/100ps
module FA_flow(A,B,Cin,Sum,Count)
input A,B,Cin;
output Sum, Count;
wire S1,T1,T2,T3;
assign # 2 S1 = A ^ B;
assign # 2 Sum = S1 ^ Cin;
assign #2 T3 = A & B;
assign #2 T1 = A & Cin;
assign #2 T2 = B & Cin ;
endmodule
注意在各assign 语句之间,是并行执行的,即各语句的执行与语句之间的顺序无关。如上,当
A有个变化时,S1、T3、T1 将同时变化,S1的变化又会造成Sum的变化。
3.3.3 行为描述方式
行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模。在表示
方面,类似数据流的建模方式,但一般是把用initial 块语句或always 块语句描述的归为行为建模方
式。行为建模方式通常需要借助一些行为级的运算符如加法运算符(+),减法运算符(-)等。
以下举个例子,对initial 和always 语句的具体应用可看相关章节的介绍,这里,先对行为建模
方式有个概念。
例[1] 一位全加器的行为建模
module FA_behav1(A, B, Cin, Sum, Cout );
input A,B,Cin;
output Sum,Cout;
2004-08-16 第15页,共41页
版权所有,侵权必究
绝密
Verilog HDL 入门教程请输入文档编号
reg Sum, Cout;
reg T1,T2,T3;
always@ ( A or B or Cin )
begin
Sum = (A ^ B) ^ Cin ;
T1 = A & Cin;
T2 = B & Cin ;
T3 = A & B;
Cout = (T1 T2) T3;
end
endmodule
需要先建立以下概念:
1、只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实
现。
2、always 语句是一直重复执行,由敏感表(always 语句括号内的变量)中的变量触发。
3、always 语句从0 时刻开始。
4、在begin 和end 之间的语句是顺序执行,属于串行语句。
例[2]:一位全加器的行为建模
module FA_behav2(A, B, Cin, Sum, Cout );
input A,B,Cin;
output Sum,Cout;
reg Sum, Cout;
always@ ( A or B or Cin )
begin
{Count ,Sum} = A + B + Cin ;
end
endmodule
在例2中,采用更加(更趋于行为级)描述方式,即直接采用“+”来描述加法。
{Count,Sum} 表示对位数的扩展,因为两个1bit 相加,和有两位,低位放在Sum 变量中,进位放
在Count 中。
3.3.4 混合设计描述
2004-08-16 第16页,共41页
版权所有,侵权必究
绝密
Verilog HDL 入门教程请输入文档编号
在实际的设计中,往往是多种设计模型的混合。一般地,对顶层设计,采用结构描述方式,
对低层模块,可采用数据流、行为级或两者的结合。如上面的两bit 全加器,对顶层模块
(Four_bit_FA) 采用结构描述方式对低层进行例化,对低层模块(FA)可采用结构描述、数据流描
述或行为级描述。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。