下载第 6章 用户定义的原语在前一章中,我们介绍了 Verilog HDL提供的内置基本门。本章讲述 Verilog HDL指定用户定义原语 U D P的能力。
U D P的实例语句与基本门的实例语句完全相同,即 U D P实例语句的语法与基本门的实例语句语法一致。
6.1 UDP的定义使用具有如下语法的 U D P说明定义 U D P。
p r i m i t i v e U D P _ n a m e (OutputName,List_of_inputs)
O u t p u t _ d e c l a r a t i o n
L i s t _ o f _ i n p u t _ d e c l a r a t i o n s
[R e g _ d e c l a r a t i o n]
[I n i t i a l _ s t a t e m e n t]
t a b l e
L i s t _ o f _ t a b e l _ e n t r i e s
e n d t a b l e
e n d p r i m i t i v e
U D P的定义不依赖于模块定义,因此出现在模块定义以外。也可以在单独的文本文件中定义 U D P。
U D P只能有一个输出和一个或多个输入。第一个端口必须是输出端口。此外,输出可以取值 0,1或 x(不允许取 z值 )。输入中出现值 z以 x处理。 U D P的行为以表的形式描述。
在 U D P中可以描述下面两类行为:
1) 组合电路
2) 时序电路 (边沿触发和电平触发 )
6.2 组合电路 UDP
在组合电路 U D P中,表规定了不同的输入组合和相对应的输出值。没有指定的任意组合输出为 x。下面以 2 - 1多路选择器为例加以说明。
p r i m i t i v e MUX2x1 (Z,Hab,Bay,Sel) ;
o u t p u t Z;
i n p u t Hab,Bay,Sel;
t a b l e
// Hab Bay Sel,Z注:本行仅作为注释。
0? 1,0 ;
1? 1,1 ;
0 0,0 ;
1 0,1 ;
0 0 x,0 ;
1 1 x,1 ;
e n d t a b l e
e n d p r i m i t i v e
字符?代表不必关心相应变量的具体值,即它可以是 0,1或 x。输入端口的次序必须与表中各项的次序匹配,即表中的第一列对应于原语端口队列的第一个输入 (例子中为 H a b),第二列是 B a y,第三列是 S e l。
在多路选择器的表中没有输入组合 0 1x项 (还有其它一些项 );在这种情况下,输出的缺省值为 x(对其它未定义的项也是如此 )。
图 6 - 1为使用 2 - 1多路选择器原语组成的 4 - 1多路选择器的示例。
m o d u l e MUX4x1 (Z,A,B,C,D,Sel) ;
i n p u t A,B,C,D;
i n p u t [2:1] S e l ;
o u t p u t Z;
p a r a m e t e r tRISE = 2,tFALL = 3;
MUX2x1 #(tRISE,tFALL)
(TL,A,B,Sel[ 1 ] ),
(TP,C,D,Sel[ 1 ] ),
(Z,TL,TP,Sel[ 2 ] ) ;
e n d m o d u l e
如上例所示,在 U D P实例中,总共可以指定 2个时延,这是由于 U D P的输出可以取值 0,1
或 x(无截止时延 )。
6.3 时序电路 UDP
在时序电路 U D P中,使用 1位寄存器描述内部状态。该寄存器的值是时序电路 U D P的输出值。
共有两种不同类型的时序电路 U D P:一种模拟电平触发行为;另一种模拟边沿触发行为。
时序电路 U D P使用寄存器当前值和输入值决定寄存器的下一状态 (和后继的输出 )。
6.3.1 初始化状态寄存器时序电路 U D P的状态初始化可以使用带有一条过程赋值语句的初始化语句实现。形式如下:
i n i t i a l r e g _ n a m e = 0,1,or x;
初始化语句在 U D P定义中出现。
6.3.2 电平触发的时序电路 UDP
下面是 D锁存器建模的电平触发的时序电路 U D P示例。只要时钟为低电平 0,数据就从输入传递到输出;否则输出值被锁存。
p r i m i t i v e Latch (Q,Clk,D) ;
o u t p u t Q;
r e g Q;
i n p u t Clk,D;
t a b l e
50 Verilog HDL 硬件描述语言 下载图 6-1 使用 U D P构造的 4 - 1多路选择器
// Clk D Q(State) Q( n e x t )
0 1,?,1 ;
0 0,?,0 ;
1?,?,- ;
e n d t a b l e
e n d p r i m i t i v e
,-”字符表示值“无变化” 。注意 U D P的状态存储在寄存器 D中。
6.3.3 边沿触发的时序电路 UDP
下例用边沿触发时序电路 U D P为 D边沿触发触发器建模。初始化语句用于初始化触发器的状态。
p r i m i t i v e D _ E d g e _ F F (Q,Clk,Data) ;
o u t p u t Q ;
r e g Q ;
i n p u t Data,Clk;
i n i t i a l Q = 0;
table
// Clk Data Q(State) Q( n e x t )
(01) 0,?,0 ;
(01) 1,?,1 ;
(0x) 1,1,1 ;
(0x) 0,0,0 ;
// 忽略时钟负边沿,
(?0)?,?,- ;
// 忽略在稳定时钟上的数据变化,
(),?,- ;
e n d t a b l e
e n d p r i m i t i v e
表项 ( 0 1 )表示从 0转换到 1,表项 ( 0 x )表示从 0转换到 x,表项 (? 0 )表示从任意值 ( 0,1或 x)转换到 0,表项 ( )表示任意转换。对任意未定义的转换,输出缺省为 x。
假定 D _ E d g e _ F F为 U D P定义,它现在就能够象基本门一样在模块中使用,如下面的 4位寄存器所示。
m o d u l e R e g 4 (Clk,Din,Dout) ;
input C l k ;
i n p u t [0:3] D i n;
o u t p u t [0:3] D o u t;
D _ E d g e _ F F
D L A B 0 (Dout[0],Clk,Din[0]),
D L A B 1 (Dout[1],Clk,Din[1]),
D L A B 2 (Dout[2],Clk,Din[2]),
D L A B 3 (Dout[3],Clk,Din[3]),
e n d m o d u l e
6.3.4 边沿触发和电平触发的混合行为在同一个表中能够混合电平触发和边沿触发项。在这种情况下,边沿变化在电平触发之第 6章 用户定义的原语 51下载前处理,即电平触发项覆盖边沿触发项。
下例是带异步清空的 D触发器的 U D P描述。
p r i m i t i v e D_Async_FF (Q,Clk,Clr,Data) ;
o u t p u t Q;
r e g Q;
i n p u t Clr,Data,Clk;
t a b l e
// Clk Clr Data Q(State) Q( n e x t )
(01) 0 0,?,0 ;
(01) 0 1,?,1 ;
(0x) 0 1,1,1 ;
(0x) 0 0,0,0 ;
// 忽略时钟负边沿:
(?0) 0?,?,- ;
() 1?,?,0 ;
? 1?,?,0;
e n d t a b l e
e n d p r i m i t i v e
6.4 另一实例下面是 3位表决电路的 U D P描述。如果输入向量中存在 2个或更多的 1,则输出为 1。
p r i m i t i v e M a j o r i t y 3(Z,A,B,C) ;
i n p u t A,B,C;
o u t p u t Z
table
//A B C,Z
0 0?,0 ;
0? 0,0 ;
0 0,0 ;
1 1?,1 ;
1? 1,1 ;
1 1,1 ;
e n d t a b l e
e n d p r i m i t i v e
6.5 表项汇总出于完整性考虑,下表列出了所有能够用于 U D P原语中表项的可能值。
符 号 意 义 符 号 意 义
0 逻辑 0 ( A B ) 由 A变到 B
1 逻辑 1 * 与 ( )相同
x 未知的值 r 上跳变沿,与 ( 0 1 )相同
0,1或 x中的任一个 f 下跳变沿,与 ( 1 0 )相同
b 0或 1中任选一个 p ( 0 1 ),( 0x)和 (x1 )的任一种
- 输出保持 n ( 1 0 ),( 1x)和 (x0 )的任一种
52 Verilog HDL 硬件描述语言 下载习题
1,组合电路 U D P与时序电路 U D P如何区别?
2,UDP可有一个或多个输出,是否正确?
3,初始语句可用于初始化组合电路 U D P吗?
4,为图 5 - 1 2中显示的优先编码器电路编写 U D P描述。使用测试激励验证描述的模型。
5,为 T触发器编写 U D P描述。在 T触发器中,如果数据输入为 0,则输出不变化。如果数据输入是 1,那么输出在每个时钟沿翻转。假定触发时钟沿是时钟下跳沿,使用测试激励验证所描述的模型。
6,以 U D P方式为上跳边沿触发的 J K触发器建模。如果 J和 K两个输入均为 0,则输出不变。如果 J为 0,K为 1,则输出为 0。如果 J是 1,K是 0,则输出是 1。如果 J和 K都是 1,则输出翻转。
使用测试激励验证描述的模型。
第 6章 用户定义的原语 53下载