eda设计技术教学课件-第8章-用户定义原语

上传人:F****n 文档编号:107210306 上传时间:2019-10-18 格式:PPT 页数:32 大小:878KB
返回 下载 相关 举报
eda设计技术教学课件-第8章-用户定义原语_第1页
第1页 / 共32页
eda设计技术教学课件-第8章-用户定义原语_第2页
第2页 / 共32页
eda设计技术教学课件-第8章-用户定义原语_第3页
第3页 / 共32页
eda设计技术教学课件-第8章-用户定义原语_第4页
第4页 / 共32页
eda设计技术教学课件-第8章-用户定义原语_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《eda设计技术教学课件-第8章-用户定义原语》由会员分享,可在线阅读,更多相关《eda设计技术教学课件-第8章-用户定义原语(32页珍藏版)》请在金锄头文库上搜索。

1、第8章 用户定义原语,用户定义原语,设计并定义新的原语单元的集合称为用户定义原语(User-Defined Primitives,UDP) 两种类型:组合用户定义原语和时序用户定义原语 组合用户定义原语的输入决定输出,常用于组合逻辑电路的建模; 用户定义原语的输出由当前的输出和输入决定,常用于触发器、锁存器等时序电路的建模。,UDP的基本形式,attribute_instance primitive udp_identifier ( udp_port_list ) ; udp_port_declaration; /端口申明 initial statements; /初始化语句 table /状

2、态表 table_entity; endtable endprimitive,确认符,前缀,端口列表,UDP的结构形式,前缀attribute_instance是对该UDP的属性进行例化的可选项,UDP的属性是由用户定义原语自身特性决定的。例如,指定输入端口的总线宽度参数属性*Size = 8*。 udp_identifier是确认符,每个用户定义原语必须指定唯一的确认符。例如定义一个确认符为DFF的D触发器: primitive DFF( Q,D,clk,rst ) ; endprimitive,UDP的端口列表,udp_port_list是端口列表 Verilog HDL规定UDP只能有一

3、个确定的输出端口 输出端口的逻辑取值可以是0、1或x,不允许z;允许一个或多个输入端口,输入端口接受0、1或x 逻辑值,z值当作x处理。 括号内的端口列表,第一个端口必须是输出端口,之后以逗号分隔各输入端口,例如: DFF( Q,D,clk,rst ) ;,UDP的端口列表,输入端口和输出端口分别以关键词input和output申明 紧随其后是端口数据类型申明和端口名 时序逻辑的UDP应申明输出端口的数据类型为寄存器类型 组合逻辑UDP不允许寄存器类型的端口类型申明。 不允许申明双向端口。,例:D触发器的用户定义原语,primitive DFF( Q,D,clk,rst ) ; input D

4、,clk,rst; output Q; reg Q; endprimitive,UDP的语句体,由初始化语句和状态表组成。 initial和table/endtable语句是用户定义原语的语句体,是对模块的功能进行描述的主体。,primitive DFF(Q,D,clk); input D,clk; output Q; reg Q; initial Q = 1b0; table /clk D Qn Qn+1 r 0 : ? : 0; r 1 : ? : 1; f ? : ? : -; ? * : ? : -; endtable endprimitive,用户定义原语的表符号,Verilog H

5、DL规定了丰富的表符号,UDP的状态表描述语句和表达式需遵循表中的符号规定。,UDP的状态表,状态表介于关键词table和endtable之间 由规定的符号组成多行描述语句 每一行输入端口与输出端口之间的表符号,以冒号分隔 每一行语句以分号结尾。,组合逻辑UDP,每一行表示不同的输入和组合输出,输入端口的表达顺序与端口列表的顺序必须保持一致 可以与端口申明的顺序不同,primitive UDP_or(Z,A,B); input A,B; output Z; table /A B : Z 0 0 : 0; ? 1 : 1; 1 ? : 1; 1 1 : 1; endtable endprimit

6、ive,例:或门用户定义原语,例1本例定义的UDP是一个2选1多路选择器。,primitive MUX2x1 (Z, Hab, Bay, Sel) ; /Z是输出端,其余为输入端,注意输入端的排列顺序 output Z; input Hab,Bay, Sel; table /* 表中每一行的值是按照Hab Bay Sel : Z的顺序排列的,前3个输入端的排列顺序应与端口列表中的顺序相同 */ 0 ? 1 : 0 ; /Hab Bay Sel : Z 1 ? 1 : 1 ; /Hab Bay Sel : Z ? 0 0 : 0 ; /Hab Bay Sel : Z ? 1 0 : 1 ; /H

7、ab Bay Sel : Z 0 0 x : 0 ; /Hab Bay Sel : Z 1 1 x : 1 ; /Hab Bay Sel : Z endtable endprimitive,UDP的使用方法和内置基元的完全相同。 【例2】调用例1定义好的2选1多路选择器,用3个这样的UDP可以组合成4选1多路选择器,如图所示。,A,B,C,D,程序如下: module MUX4x1 (Z, A, B, C, D, Sel ) ; input A, B, C, D; input 2:1 Sel ; output Z; MUX2x1 (TL, A, B, Sel1 ) , (TP, C, D, S

8、el1 ) , (Z,TL,TP, Sel2 ) ; /3个UDP endmodule,可见,UDP的使用方法和内置基元的使用方法完全相同,本例是通过6个输入端A、B、C、D、Sel1、Sel2和1个输出端Z以及2个线网TL、TP实现3个UDP连接的。,时序逻辑UDP,时序逻辑UDP分为 电平敏感型UDP 边沿敏感型UDP 电平敏感型UDP的时序行为与组合逻辑UDP类似。 区别在于电平敏感型UDP的输出端口为寄存器类型,而且状态表的每一行多出一列,即在输入和下一个输出Qn+1之间增加一列表符号,用于表达UDP的当前输出值Qn。,primitive DLatch(Q,En,D); input E

9、n,D; output Q; reg Q; table /En D : Qn : Q n+1 0 1 : ? : 1; 0 0 : ? : 0; 1 ? : ? : -; endtable endprimitive,例:D锁存器用户定义原语。当锁存控制端En为高电平时,下一状态输出为保持状态;反之,下一状态为数据接收状态,即Q n+1=D。,“?”表示Q n+1的值仅与En和D有关。,上述状态表中,在输入口En和D、输出口Q n+1之间,插入一列当前Q n输出,以“?”表示Q n+1的值仅与En和D有关。如下语句: ? : ? : -;,可解释为:当锁存控制端En为逻辑1,则无论输入口D和当前

10、输出Qn的值为何值,下一个状态的输出为数据锁存状态。在本例状态表中,Qn一直取任意值,属多余项。,边沿敏感型UDP,边沿敏感型UDP的每一行只能指定一个输入口的上升沿(01)、下降沿(10)等变化对,或按表符号r、f、p或n等表达变化对。,状态表每一行的变化说明语句中,不能出现两个或两个以上的变化对。,(01) 0 0 : ? : 0; /(1),合法的变化说明 r 0 0 : ? : 0; /(2),与语句(1)等效 (01) (01) 0 : ? : 0; /(3),两个端口的变化对说明,非法表达 r r 0 : ? :0; /(4),两个端口的变化对说明,非法表达,表符号的顺序,状态表中

11、,表符号的安排顺序分别是输入端口、输出端口的当前状态、输出端口的下一个状态,输入端口与端口列表的顺序一致。 用户定义原语允许在状态表内混合使用电平敏感和边沿敏感的多分支变化说明,当输入变化时,先执行边沿敏感分支,之后再执行电平敏感分支。 当两种类型的分支指定不同的输出值,结果由电平敏感分支决定。,例:边沿触发JK触发器UDP,电平敏感和边沿敏感混合描述的边沿触发JK触发器。如表所示,边沿触发JK触发器定义如下具有四种类型的功能: 置1功能:Qn+1=1,当且仅当变化说明序号(1)、(2)或(8); 置0功能:Qn+1=0,当且仅当变化说明序号(3)、(4)或(7); 反向保持功能:Qn+1=

12、Qn,当且仅当变化说明序号(5)、(9)或(10); 正向保持功能:Qn+1= Qn,当且仅当变化说明序号(6)、(11)、(12)或(13);,电平敏感描述,边沿敏感描述,primitive udp_edge_jkff(Q,clk,J,K,SD,RD); input clk,J,K,SD,RD; output Q; reg Q; table / clk J K SD RD : Qn : Qn+1 ? ? ? 0 1 : ? : 1 ; /置位 ? ? ? * 1 : 1 : 1 ; ? ? ? 1 0 : ? : 0 ; / 复位 ? ? ? 1 * : 0 : 0 ; r 0 0 0 0

13、: 0 : 1 ; / 时钟驱动变化 说明分支 r 0 0 1 1 : ? : - ; r 0 1 1 1 : ? : 0 ; r 1 0 1 1 : ? : 1 ; r 1 1 1 1 : 0 : 1 ; r 1 1 1 1 : 1 : 0 ; f ? ? ? ? : ? : - ; b * ? ? ? : ? : - ; / JK变化 说明分支 b ? * ? ? : ? : - ; endtable endprimitive,时序UDP的初始化,时序用户定义原语输出端口的初始化用于指定输出端口的初始状态,以关键词initial开始,紧随过程赋值语句对输出端口赋值,其基本形式为: init

14、ial output_port = initialization_value; initial语句布置在table之前,表达式左侧的output_port是UDP内申明的reg型输出端口,表达式右侧的initialization_value是初始化值。 UDP初始化语句内不允许使用延时赋值。,例:指定RS触发器输出端口的初始值为1,由于UDP只有一个输出端口,因此只允许出现一条初始化赋值语句, 赋值语句的操作对象是reg寄存器类型的输出端口,端口确认符必须一致。 赋值表达式的右侧只能使用1b1、1b0、1bx、1或0。,primitive SRFF(Q, S, R); output Q; re

15、g Q; input S, R; initial Q = 1b1; /输出端口的初始值为逻辑1 table / S R : Qn : Qn+1 1 0 : ? : 1 ; f 0 : 1 : - ; 0 r : ? : 0 ; 0 f : 0 : - ; 1 1 : ? : 0 ; endtable endprimitive,用户定义原语建模,在系统层次化结构中,用户定义原语是一个独立的模块,与其他模块有相同的语法层次和相应的抽象级别。 在源文件的模块结构中,用户定义原语可以出现在模块内任何需要例化的地方,当然不能超出模块的module和endmodule范围。,UDP建模的基本形式,udp_

16、namedrive_strengthdelay2attribute_instanceudp_instance (output_port, input_port) ; udp_name:用户定义原语模块名,例如SR触发器UDP的SRFF; drive_strength用于指定UDP的驱动强度; delay2用于指定UDP的延时赋值; attribute_instance用于例化UDP的属性; 上述三项与模块的相关规则相同。 udp_instance是模块中被指定的UDP例化名; output_port和input_port是分别与模块连接的输出端口和输入端口列表,其连接顺序必须与模块内相关端口的顺序保持一致。,(1)设计T触发器用户定义原

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 小学教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号