资源描述
第十一章 开关级建模
-----------------------------------------------------------------------------
在本书第一部分中,我们在逻辑门级、数据流级和行为级等较高抽象层次上解释了数字逻辑的设计和仿真。然而在少数情况下,设计者可能会选择用晶体管作为设计的底层模块,即叶级(leaf-level)模块。Verilog语言具有对MOS晶体管级进行设计的能力。随着电路复杂性的增加(上百万的晶体管)及先进CAD工具的出现,以开关级为基础进行的设计正在逐渐萎缩。Verilog HDL目前仅提供用逻辑值0、1、x、z和与它们相关的驱动强度进行数字设计的能力,没有模拟设计能力。因此在Verilog HDL中,晶体管也仅被当作导通或者截止的开关。在本章中,我们讨论开关级建模的基本原理。大多数设计者只需知道基本知识就足够了。附录A,即强度建模和高级线网类型定义,给出了信号强度和高级线网类型定义的详细内容。关于开关级建模的全部详细内容请参考有关IEEE Verilog硬件描述语言标准 的文档。
学习目标
l 能够描述基本MOS开关:nmos、pmos和cmos。
l 理解双向传输开关,电源 和地 的建模方法。
l 识别阻抗MOS开关。
l 解释在基本MOS开关 和双向传输开关上说明延迟的方法。
l 在Verilog中,用所提供的开关建立基本开关级电路。
11.1 开关级建模元件
Verilog提供了各种语言结构可以为开关级电路建立模型,MOS晶体管级数字电路可以用这些最基本的电路模型元件(elements)[注1] 来描述。
------------------------------------------------------------------------------------------------------------------
[注1]: 可以用实例组(即多个并列的实例引用)来定义开关组。在5.1.3中对实例组进行了描述。
-----------------------------------------------------------------------------------------------------------------
11.1.1 MOS开关
可以用关键字nmos和pmos定义两种类型的MOS开关。
//定义MOS开关的关键字
nmos pmos
关键字nmos用于NMOS晶体管建模;关键字pmos用于PMOS晶体管建模。NMOS和PMOS开关符号如图11-1所示。
data
out
control
NMOS
data
out
control
PMOS
图11-1 NMOS和PMOS开关
在Verilog语言里,调用(实例引用)nmos和pmos开关,见例11-1所示。
[例11-1] nmos和pmos开关的实例引用
nmos n1 (out, data, ncontrol ); //调用(实例引用)一个nmos开关;
pmos p1 (out, data, ncontrol ); //调用(实例引用)一个pmos开关;
因为开关是用Verilog原语定义的,类似于逻辑门,实例名称是可选项,所以调用(实例引用)开关时可以不给实例命名。
nmos (out, data, ncontrol ) ; //调用一个nmos开关;无实例名称
pmos (out, data, ncontrol ) ; //调用一个pmos开关;无实例名称
信号out的值由信号data和control的值确定。 out的逻辑值如表11-1所示。信号data和control不同的组合导致这两个开关输出1、0 或者z、x 逻辑值 (如果不能确定输出为1或0,就有可能输出z、x值)。符号L代表0或者z,H代表1或者z。
表11-1 NMOS和PMOS逻辑表
pmos
control
0
1
x
z
data
0
0
z
L
L
1
1
z
H
H
x
x
z
x
x
z
z
z
z
z
nmos
control
0
1
x
z
data
0
z
0
L
L
1
z
1
H
H
x
z
x
x
x
z
z
z
z
z
因此,nmos开关在control信号为1时导通。如果control信号是0,则输出为高阻态值。与此类似,如果control信号是0则pmos开关导通。
11.1.2 CMOS开关
CMOS开关用关键字cmos声明。
可以用nmos和pmos器件来建立cmos器件的模型。cmos开关的符号如图11-2所示。
data
out
pcontrol
ncontrol
CMOS
图11-2 CMOS开关
cmos开关的应用如例11-2所示
[例11-2] cmos开关的实例引用
cmos c1 (out, data, ncontrol, pcontrol); // 调用(实例引用)一个cmos开关
cmos (out, data, ncontrol, pcontrol); // 没有指定实例名
信号ncontrol和pcontrol通常是互补的。当信号ncontrol为1且pcontrol信号为0时,开关导通。如果信号ncontrol为0且pcontrol为1,则开关的输出为高阻值。cmos门本质上是两个开关:nmos和pmos的组合体。因此上述cmos的实例等价于:
nmos (out, data, ncontrol); // 调用(实例引用)一个nmos开关
pmos (out, data, ncontrol); // 调用(实例引用)一个pmos开关
因为cmos开关由nmos和pmos开关派生出来,所以给定data、ncontrol和pcontrol的信号值就可以根据表11-1推断出cmos的输出值。
11.1.3 双向开关
NMOS、PMOS和CMOS门都是从漏极向源极导通,是单向的。在数字电路中,双向导通的器件很重要。对双向导通的器件而言,其两边的信号都可以是驱动信号。通过设计双向开关就可以实现双向导通的器件。三个关键字用来定义双向开关:tran、tranif0和tranif1。
tran tranif0 tranif1
这些开关符号如下图11-3所示。
inout1
inout2
inout1
inout2
inout1
inout2
control
control
tran
tranif0
tranif1
图11-3 双向开关
tran开关作为两个信号inout1和inout2之间的缓存。inout1或inout2都可以是驱动信号。仅当control信号是逻辑0时tranif0开关连接inout1和inout2两个信号。如果control信号是逻辑1,则没有驱动源的信号取高阻态值z。有驱动源的信号仍然从驱动源取值。如果control信号是逻辑1则tranif1开关导通。
这些开关的使用如例11-3所示。
[例11-3] 双向开关的实例引用
tran t1 ( inout1, inout2 ); //实例名t1 是可选项
tranif0 ( inout1, inout2, control ); //没有指定实例名
tranif1 ( inout1, inout2, control ); //没有指定实例名
双向开关经常用来在总线或信号之间提供隔离。
11.1.4 电源和地
设计晶体管级电路时需要电源(Vdd,逻辑1)和地(Vss,逻辑0)两极。电源和地极用关键字supply1和supply0来定义。
源极类型supply1相当于电路中的Vdd且把逻辑1放在网表中。源极类型supply0相当于ground或Vss并将逻辑0放在网表中。在整个模拟过程中,supply1和supply0始终为网表提供逻辑1值和逻辑0值。
源supply1和supply0如下所示。
supply1 vdd;
supply0 gnd;
assign a = vdd ; // 连接到电源电压vdd
assign b = gnd ; // 连接到地
11.1.5 阻抗开关
前面所讨论的MOS、CMOS和双向开关可以用相应的阻抗器件建模。阻抗开关比一般的开关具有更高的源极到漏极的阻抗,且在通过它们传输时减少了信号强度。在相应的一般开关关键字前加带r前缀的关键字声明阻抗开关。阻抗开关与一般开关语法类似。
rnmos rpmos // 阻抗性nmos 和pmos 开关
rcmos // 阻抗性cmos 开关
rtran rtranif0 rtranif1 // 阻抗性双向开关
在一般开关和阻抗开关之间有两个主要区别:源极到漏极的阻抗和传输信号强度的方式。关于Verilog中强度级别参看附录A,强度建模和高级线网类型定义。
l 阻抗器件具有较高的源极到漏极阻抗。一般开关源极到漏极阻抗较低。
l 阻抗开关在传递信号时减少了它们的强度。变化如下所示。一般开关从输入到输出一直保持强度级别不变。有一点例外,如果输入supply强度,则输出strong强度。表11-2显示出由于阻抗开关导致的强度缩减。
表11-2 阻抗开关的强度缩减
输入强度
输出强度
supply
strong [译者注]
strong
pull
pull
weak
weak
medium
large
medium
medium
small
small
small
high
high
---------------------------------------------------------------------------------------------------------------------
[译者注]: 原文中此处输出强度为pull,与上文中解释不符合,翻译者认为改为strong比较合适。上文中好像讲的是一般开关通常不改变强度级别,只是在输入为supply时,输出慰strong。并不是针对阻抗开关讲的。
------------------------------------------------------------------------------------------------------------------------------------------
11.1.6 开关中的延迟说明
MOS和CMOS开关
可以为通过这些开关级元件的信号指定延迟。延迟是可选项,它只能紧跟在开关关键字之后。延迟说明类似于5.2.1节中讨论的Rise、Fall和Turn-off 延迟。可以为开关指定零个、一个、两个或者三个延迟,参考表11-3。
表11-3 MOS和CMOS开关的延迟说明
开关元件
延迟说明
举例
pmos, nmos, rpmos
rnmos
0个说明
(没有延迟)
pmos p1(out,data,control);
1个说明
(所有暂态过程相同)
pmos # (1 ) p1(out,data,control);
2个说明
(上升、下降)
nmos # (1,2 ) p2(out,data,control);
3个说明
(上升、下降、关断)
nmos # (1,2,3 ) p2 (out,data,control);
cmos, rcmos
0、1、2、3个延迟说明与上面相同
cmos # (5 ) c2 ( out,data,nctrl,pctrl );
cmos # (1,2 ) c1 (out,data,nctrl, pctrl );
双向传输开关
双向传输开关的延迟说明需要稍作区别解释。这种开关在传输信号时没有延迟。但是,当开关值切换时有开(turn-on)和关(turn-off)延迟。可以给双向开关指定零个、一个或者两个延迟,如表11-4所示。
表11-4 双向开关的延迟说明
开关元件
延迟说明
举例
tran , rtran
不允许指定延迟说明
tranif1, rtranif1
tranif0, rtranif0
0个延迟说明
rtranif0 rt1( inout1, inout2, control );
1个延迟说明
tranif0 # (3) T (inout1, inout2, control );
2个延迟说明
tranif0 # (1,2 ) t1 (inout1, inout2, control );
Specify块
也可以给用开关设计的模块指定路径延迟(引脚到引脚延迟)及时序检查。用specify块描述路径延迟。在第10章时序和延迟中详细讨论了路径延迟说明,它在开关级模型中也完全适用。
11.2 举例
本节我们讨论如何用开关级建模元件建立实际的数字电路。
11.2.1 CMOS或非门(nor)
虽然Verilog有nor门原语,我们在这里尝试用CMOS开关设计自己的或非门。或非门和或非门的开关级电路图如图11-4所示。
a
b
out
Vdd
pwr
out
gnd
a
b
c
my_nor
my_nor
图11-4 或非门门级 / 开关级的电路图表示
使用11.1节中讨论的开关原语,开关建模元件,电路的Verilog描述如下例11-4所示。
[例11-4] 或非门的开关级Verilog描述
//定义自己的或非们,my_nor
module my_nor(out, a, b);
output out;
input a, b;
wire c;
//定义电源和地
supply1 pwr; //pwr连接到Vdd
supply0 gnd; //gnd连接到Vss(地)
//实例引用pmos开关
pmos (c, pwr, b);
pmos (out, c, a);
//实例引用nmos开关
nmos (out, gnd, a);
nmos (out, gnd, b);
endmodule
我们可以用下列激励来测试我们的或非门
//测试该或非门的激励
module stimulus;
reg A, B;
wire OUT;
//实例引用模块my_nor
my_nor n1(OUT, A, B);
//产生激励
initial
begin
//测试所有可能的输入信号组合
A = 1'b0; B = 1'b0;
#5 A = 1'b0; B = 1'b1;
#5 A = 1'b1; B = 1'b0;
#5 A = 1'b1; B = 1'b1;
end
//检查测试结果
initial
$monitor($time, " OUT = %b, A = %b, B = %b", OUT, A, B);
endmodule
仿真输出如下所示。
0 out = 1, A = 0, B = 0
5 out = 0, A = 0, B = 1
10 out = 0, A = 1, B = 0
15 out = 0, A = 1, B = 1
这样我们就设计出了自己的或非门。如果设计者要定制某个库模块,可以采用开关级建模。
11.2.2 二选一多路选择器
可以用CMOS开关定义二选一多路选择器。我们将用11.2.1节中声明的my_nor门,一个CMOS或非门来实现非(not)逻辑功能。多路选择器电路图如下图11-5所示。
图11-5 用开关表示的二选一多路器
Sbar
OUT
二选一多路器
S
i0
i1
二选一
多路器
S
i0
i1
OUT
二选一多路选择器在S=0时将输入I0传到输出OUT,在S=0时把I1传到OUT。二选一多路选择器的开关级描述如例11-5所示。
[例11-5] 二选一多路选择器的开关级Verilog描述
//用开关定义二选一多路选择器
module my_mux (out, s, i0, i1);
output out;
input s, i0, i1;
//内部连线
wire sbar; // s的反
// 生成s的反
my_nor nt(sbar, s, s); //相当于1个非门
// 调用(实例引用)cmos 开关
cmos (out, i0, sbar, s);
cmos (out, i1, s, sbar);
endmodule
二选一多路选择器可以用一个小激励进行测试。激励留作读者练习。
11.2.3 简单的CMOS锁存器
我们在前面的例子中设计了组合逻辑器件。现在我们来定义一种可以存储值的存储元件。电平敏感CMOS锁存器电路图如图11-6所示。
FF
q
qbar
d
clock
C1
C2
d
clk
qbar
q
图11-6 CMOS锁存器
e
开关C1和C2是11.1.2节,CMOS开关中讨论的CMOS开关。如果clk=1则C1开关关闭,如果clk=0则C2开关关闭。clk的相反值被送给C2的ncontrol输入端。可以用MOS开关定义CMOS反相器,如图11-7所示。
in
out
my_not
Vdd
pwr
out
gnd
in
my_not
图11-7 CMOS反向器
现在已经准备好给CMOS锁存器写Verilog描述。首先要用开关设计自己的反相器my_not。可以根据图11-7的开关级电路图来写CMOS反相器的Verilog模块描述。反相器的Verilog描述如例11-6所示。
[例11-6] CMOS反相器
// 用 MOS 开关定义反相器
module my_not (out, in);
output out;
input in;
//定义电源和地
supply1 pwr;
supply0 gnd;
//调用(实例引用)nmos 和 pmos 开关
pmos (out, pwr, in);
nmos (out, gnd, in);
endmodule
现在,CMOS锁存器可以用CMOS开关和my_not反相器来定义。CMOS锁存器的Verilog描述如例11-7所示。
[例11-7] CMOS触发器
//定义CMOS 触发器
module cff ( q, qbar, d, clk);
output q, qbar;
input d, clk;
//内部连线
wire e;
wire nclk; // 时钟信号 clock的反相
// 调用(实例引用)反相器
my_not nt(nclk, clk);
//调用(实例引用) CMOS 开关
cmos (e, d, clk, nclk); //switch C1; e = d when clk = 1.
cmos (e, q, nclk, clk); //switch C2; e = q when clk = 0.
//调用(实例引用)反相器
my_not nt1(qbar, e);
my_not nt2(q, qbar);
endmodule
这里给读者留一个练习,写一个小激励模块来测试这个设计,验证这个锁存器的存取特性。
11.3 总结
本章讨论了Verilog的下面几方面内容:
l 开关级建模处于很低的设计抽象层次。只在很少的情况下,比如在设计者需要定制自己的叶级元件(即最基本的元件)时,才使用开关级建模。随着电路复杂度的增加,这个级别的Verilog设计越来越少见;
l MOS、CMOS、双向开关和supply1、supply0源可用于设计任意的开关级电路。CMOS开关是MOS开关的一种组合;
l 延迟对开关元件来说是可选的。对不同的双向器件,有不同的延迟解释。
11.4 练习
1. 使用nmos和pmos开关为异或门(xor)画电路图。写出它的Verilog描述。使用激励测试这个设计。
2. 使用nmos和pmos开关为与门(and)和或门(or)画电路图。写出它们的Verilog描述。使用激励测试这两个设计。
3. 使用1和2中设计的异或门(xor)、与门(and)和或门(or)设计下图所示的一位全加器。使用激励测试这个设计。
a
sum
c_in
b
c_out
s1
c1
s2
练习3图 一位全加器
4. 设计一个四位的双向总线开关,其中一侧有两个总线BusA和BusB,另一侧有一个总线BUS。一个一位的control信号用作开关。当control=1时,BusA和BUS连接在一起。当control=0时,BusB和BUS连接在一起。(提示:使用开关tranif0和tranif1。)使用激励测试这个设计。
总线开关
BusA
BusB
BUS
control
5. 以下面的延迟值调用开关。使用自己的输入和输出端口名称。
a. rise = 2、fall = 3的pmos开关
b. rise = 4、fall = 6、turn-off = 5的nmos开关
c. delay = 6的cmos开关
d. turn-on = 5、turn-off = 6的tranif1开关
e. delay = 3的tranif0开关
展开阅读全文