欢迎来到EDA中国!
当前位置:网站首页 >资源共享 > FPGA

verilog HDL语言教程第六章--用户定义的原语

  • 400k
  • pdf
  •  
  •  
  • 下载
  • 2013-04-26
  • 软件简介
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_inpu)ts
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 ( SQtate) 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 )的任一种

关键字 : HDL Verilog 语言 
获取帮助