Chinapub.com 下载 第6章用户定义的原语 在前一章中,我们介绍了 Verilog HDl提供的内置基本门。本章讲述 Verilog hdl指定用户 定义原语UDP的能力。 UDP的实例语句与基本门的实例语句完全相同,即UDP实例语句的语法与基本门的实例 语句语法一致 6.1UDP的定义 使用具有如下语法的UDP说明定义UDP。 primitive UDP name (OutputName, List of inputs List of input declarations [Reg declaration] [Initial statement] table endtable endprimitive UDP的定义不依赖于模块定义,因此出现在模块定义以外。也可以在单独的文本文件中 定义UDP UDP只能有一个输出和一个或多个输入。第一个端口必须是输出端口。此外,输出可以 取值0、1或x(不允许取z值)。输入中出现值z以x处理。UDP的行为以表的形式描述。 在UDP中可以描述下面两类行为 1)组合电路 2)时序电路(边沿触发和电平触发) 62组合电路UDP 在组合电路UDP中,表规定了不同的输入组合和相对应的输出值。没有指定的任意组合 输出为x。下面以2-1多路选择器为例加以说明 e MUX2x1(2, Hab, Bay, sel input Hab, Bay, set table Hab Bay se1:z注:本行仅作为注释
下载 第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 ;
50 Verilog hdl硬停描述语言 China-pubcoM 下载 endtable endprimitive 符?代表不必关心相应变量的具体值,即它可以 是0、1或x。输入端口的次序必须与表中各项的次序smM以飞Msm 匹配,即表中的第一列对应于原语端口队列的第一个 输入(例子中为Hab),第二列是Bay,第三列是Sel。 在多路选择器的表中没有输入组合01x项(还有其它 MuX2xI/Sel[2] 些项):在这种情况下,输出的缺省值为x(对其它未 定义的项也是如此)。 图6-1使用UDP构造的4-1多路选择器 图6-1为使用2-1多路选择器原语组成的4-1多路选择器的示例 module MUX4x1(2, A, B, C, D, sel input A, B, C, D input [2: 1] parameter tRISE 2, tEALL 3 MUX2x1群( tRISE,tFAD↓ (TL, A, B, Sefl]) (TP, C, D, sell]) (z,T,TP,Se四2]) endmodule 如上例所示,在UDP实例中,总共可以指定2个时延,这是由于UDP的输出可以取值0、1 或x(无截止时延) 63时序电路UDP 在时序电路UDP中,使用1位寄存器描述内部状态。该寄存器的值是时序电路UDP的输出值。 共有两种不同类型的时序电路UDP:一种模拟电平触发行为:另一种模拟边沿触发行为。 时序电路UDP使用寄存器当前值和输入值决定寄存器的下一状态(和后继的输出)。 631初始化状态寄存器 时序电路UDP的状态初始化可以使用带有一条过程赋值语句的初始化语句实现。形式如下 initial reg name =0,l, or x 初始化语句在UDP定义中出现。 632电平触发的时序电路UDP 下面是D锁存器建模的电平触发的时序电路UDP示例。只要时钟为低电平0,数据就从输 入传递到输出:否则输出值被锁存 atch (0, Clk, D utput o; input Clk, D
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多路选择器
第6章用户定义的原语 51 下载 / clk D o(state) o(next) endtable endprimitive ”字符表示值“无变化”。注意UDP的状态存储在寄存器D中。 633边沿触发的时序电路UDP 下例用边沿触发时序电路UDP为D边沿触发触发器建模。初始化语句用于初始化触发器的 状态。 primitive d Edge FF (Q, Cik, Dath output i input Data, Clk initial Q =0; table / CIk Data cstate) o(next) 0x) 1:1 0x) /忽略时钟负边沿: //忽略在稳定时钟上的数据变化 (??) endtable endprimitive 表项(01)表示从0转换到1,表项(0x)表示从0转换到x,表项(?0)表示从任意值(0,1或x)转 换到0,表项(?)表示任意转换。对任意未定义的转换,输出缺省为x。 假定 D Edge FF为UDP定义,它现在就能够象基本门一样在模块中使用,如下面的4位寄 存器所示 input [0: 3] Din: output[0:3]D。ut d Edge FE DLABO (Dout[0], clk, Din[0]) DLABI (Dout[l], clk, Din[1]) DLAB2(Dout[2],Clk, Din[21 DLAB3 (Dout[3],clk, Din[31 634边沿触发和电平触发的混合行为 在同一个表中能够混合电平触发和边沿触发项。在这种情况下,边沿变化在电平触发之
// 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 下载
52 Verilog hdl硬描述语言 Chinapub coM 下载 前处理,即电平触发项覆盖边沿触发项。 下例是带异步清空的D触发器的UDP描述。 primitive D Async FF(O, Clk, CIr, Da ta output o; input Clr, Data, Clk table //C1k Clr ta (State) o(next) 000 /忽略时钟负边沿: ?0)0 endear⊥e mi tive 64另一实例 下面是3位表决电路的UDP描述。如果输入向量中存在2个或更多的1,则输出为1。 primitive Majority3(2, A, B, g table 0 endtable 6.5表项汇总 出于完整性考虑,下表列出了所有能够用于UDP原语中表项的可能值。 逻辑0 (AB) 由A变到B 与(??)相同 未知的值 跳变沿,与(01)相同 0、1或x中的任一个 下跳变沿,与(10)相同 0或1中任选一个 (01)、(0x)和(x1)的任一种
前处理,即电平触发项覆盖边沿触发项。 下例是带异步清空的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 硬件描述语言 下载
Chinaopub.com 第6章用户定义的原语 53 下载 1.组合电路UDP与时序电路UDP如何区别? 2UDP可有一个或多个输出,是否正确 3.初始语句可用于初始化组合电路UDP吗? 4.为图5-12中显示的优先编码器电路编写UD描述。使用测试激励验证描述的模型 5.为T触发器编写UDP描述。在T触发器中,如果数据输入为0,则输出不变化。如果数据输 入是1,那么输出在每个时钟沿翻转。假定触发时钟沿是时钟下跳沿,使用测试激励验证所 描述的模型 6.以UDP方式为上跳边沿触发的JK触发器建模。如果J和K两个输入均为0,则输出不变。如 果J为0,K为1,则输出为0。如果J是1,K是0,则输出是1。如果J和K都是1,则输出翻转 使用测试激励验证描述的模型
习题 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 下载