第4章VHDL用户自定义元件UDP.ppt

上传人:本田雅阁 文档编号:2120798 上传时间:2019-02-18 格式:PPT 页数:61 大小:805.01KB
返回 下载 相关 举报
第4章VHDL用户自定义元件UDP.ppt_第1页
第1页 / 共61页
第4章VHDL用户自定义元件UDP.ppt_第2页
第2页 / 共61页
第4章VHDL用户自定义元件UDP.ppt_第3页
第3页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第4章VHDL用户自定义元件UDP.ppt》由会员分享,可在线阅读,更多相关《第4章VHDL用户自定义元件UDP.ppt(61页珍藏版)》请在三一文库上搜索。

1、第4章 用户自定义元件(UDP),4.1 UDP 4.2 组合逻辑电路UDP 4.3 时序逻辑电路UDP,4.1什么是UDP?,在 Verilog 结构模型中,可以使用: 二十多个门级原器件。 用户定义的原语。 UDP 可用于ASIC 库单元设计和小规模芯片和中规模芯片设计。 可以使用 UDP 扩大预定义原器件的范围。 UDP 是自包含的, 不能调用其他的模块。 UDP 既可以用来代替时序逻辑元件,也可以代替组合逻辑元件。 使用真值表来描述 UDP 的行为。 调用 UDP 的方式与调用嵌入的原器件的方式相同。,UDP的定义 UDP的定义是由一个独立的定义模块构成的,该模块由关键词“primit

2、ive”和“endprimitive”界定。 UDP定义模块的语法格式:,primitive (, , , ); 输出端口类型说明(output); 输入端口类型说明(input); 输出端寄存器变量说明(reg); 元件初始状态说明( initial ); table ; ; ; endtable endprimitive,对上述的语法格式,需要说明如下几点: (1) UDP定义模块不能出现在其它模块定义之内,UDP定义模块和其它模块具有相同的语法结构地位,它的定义必须独立于其它模块结构成分。所以UDP定义模块必须出现在其它模块定义之外,同时它也可以出现在独立的文件中。,【例4-1】UDP定

3、义模块的正确位置。 module MODULE1; /模块MODULE1定义的开始 /模块MODULE1描述体 endmodule /模块MODULE1定义的结束 primitive MY_GATE(out,a,b); /UDP元件MY_GATE定义模块的开始 /UDP元件MY_GATE定义的描述体 endprimitive /UDP元件MY_GATE定义模块的结束 module MODULE2; /模块MODULE2定义的开始 /模块MODULE2 描述体 endmodule /模块MODULE2定义的结束 在例4-1中,UDP元件MY_GATE的定义模块与其它两个模块MODULE1和MOD

4、ULE2并列出现,相互独立;,【例4-2】UDP定义模块的错误位置。 module MODULE1; /模块MODULE1定义的开始 /模块MODULE1描述体 primitive MY_GATE(out,a,b); /UDP元件MY_GATE定义模块的开始 /UDP元件MY_GATE定义的描述体 endprimitive /UDP元件MY_GATE定义模块的结束 endmodule /模块MODULE1定义的结束 而在例4-2中,UDP定义模块却包含在另一个模块MODULE1结构之中,这种情况是不允许的。,(2) 在UDP定义模块的第一行,关键词“primitive”标志着定义模块的开始;其

5、后出现的“元件名”是为被定义UDP元件所取的一个名字;后面出现的端口列表指明了UDP元件的输入输出端口,该端口列表由若干个端口组成,其中只能有一个输出端口并且该输出端口必须是端口说明表中的第一项,而UDP的输入端口数目可以是一个或多个,一般对时序电路的UDP最多允许有9个输入端,对组合电路的UDP最多允许有10个输入端。 必须注意在定义UDP元件时所有输入端口和输出端口都只能是1位的(标量)。,(3) 输出端口类型说明是对UDP元件的输出端口进行说明,这和普通模块定义中的输出端口说明一样是通过关键词“output”来进行的,比如: output out; 就说明了端口out 是一个输出端口。

6、(4) 输入端口类型说明是对UDP元件的输入端口进行说明,这和普通模块定义中的输入端口说明一样是通过关键词“input”来进行的,比如: input a,b; 就说明了端口a和端口b 是两个输入端口。,(5) 输出端寄存器变量说明是在对时序逻辑UDP元件进行定义时,为了对输出端口寄存器变量类型进行说明而引入的。寄存器变量用于描述时序电路UDP中的内部状态。要注意只有在被定义的元件是时序逻辑元件时才能将输出端口定义成寄存器类变量。寄存器变量说明用关键词“reg”实现,比如: reg out; 就将UDP输出端口 out定义为一个寄存器变量。,(6) 元件初始状态说明也是为进行时序电路UDP的定义

7、而引入的,它的作用是对时序电路上电时刻(即0时刻)的初始状态进行定义,只允许有0、1、x三种状态。缺省为x态。元件初始状态说明用“initial”过程块来实现,比如: initial out=x; 就将时序逻辑UDP元件的初始状态定义为“x”。,(7) 由关键词“table”和“endtable”界定的多个table表项构成了UDP元件定义模块内的一个输入输出真值表。在table表项中只允许出现0、1、x三种逻辑值,不允许出现高阻态“z”。组合电路UDP定义模块和时序电路UDP定义模块内的table表项格式是不同的。table表项构成了UDP元件输入、输出以及内部状态(时序逻辑电路情况)间的一

8、张“逻辑真值表”。对不同逻辑功能的UDP元件进行定义时的差别将体现在不同的table表项描述上。,(8) 关键词“endprimitive”出现在定义模块的末尾,它标志着UDP定义模块的结束。 下面给出对四选一MUX进行UDP定义描述的一个例子。,【例4-3】将四选一MUX定义成UDP元件。 primitive mux4_l(out,in1,in2,in3,in4,ctrl1,ctrl2); output out; input in1,in2,in3,in4,ctrl1,ctrl2; table / in1 in2 in3 in4 ctrl1 ctrl2 out 注释行,用于保证表项中各项的正

9、确排列顺序 0 ? ? ? 0 0 : 0 1 ? ? ? 0 0 : 1 ? 0 ? ? 0 1 : 0 ? 1 ? ? 0 1 : 1 ? ? 0 ? 1 0 : 0 ? ? 1 ? 1 0 : 1 ? ? ? 0 1 1 : 0 ? ? ? 1 1 1 : 1 endtable endprimitive,注意:不能将控制端口定义成一个二位的输入端口,即不能采用如下定义方式:,【例4-4】错例。 primitive mux4_l(out,in1,in2,in3,in4,ctrl);/错例 output out; input in1,in2,in3,in4 ; input 21 ctrl;

10、/错,在UDP定义中的端口只能是一位宽度的标量类型 table /in1 in2 in3 in4 ctrl out 0 ? ? ? 00 : 0 1 ? ? ? 00 : 1 ? 0 ? ? 01 : 0 ? 1 ? ? 01 : 1 ? ? 0 ? 10 : 0 ? ? 1 ? 10 : 1 ? ? ? 0 11 : 0 ? ? ? 1 11 : 1 endtable endprimitive,UDP 只能有一个输出端,而且必须是端口的说明列表的第一项。 UDP 可以有多个输入端,最多允许有 10 个。 UDP 所有端口变量必须是标量,不允许使用双向端口。 UDP 不支持 Z 逻辑值。 在仿

11、真的开始,UDP 的输出可以使用 initial 语句初始化为一个已知值。 UDP 不能被综合。,UDP特征,UDP 只能有一个输出。如果设计时的输出多于一个,则需要把其它的原器件连接到 UDP 输出,或同时使用多个 UDP。 UDP 输入端最多可以有 10 个,但是当输入的个数多于 5 个时,内存的需要将大大的增加。下页表列出了输入数目不同时,每个输入所需要的内存。,UDP特征,4.2 组合逻辑电路UDP 对组合逻辑电路UDP元件的描述相当于直接把电路的逻辑真值表搬到UDP描述的table表中。组合逻辑电路UDP定义时的table表项的格式为: : ,对于上述table表项格式,必须注意:

12、(1) 各个输入输出逻辑值只能是 0,1,x 和 ? 中的一个,不能取高阻态“z”。 (2) 输出端口在primitive定义语句的端口表项中列第一的位置,而输出端逻辑值在table表项内则是位于最后一项。 (3) 在表项中要用空格分隔开不同的输入端逻辑值, 各个输入端口在table表项中的排列顺序必须与它们在“primitive”定义语句中端口表项内的排列顺序保持严格一致。,(4) table表项中的输入部分与输出部分之间要用一个冒号隔开。 (5) 为了明确观察输入输出相互关系和各项排列顺序是否正确,通常在table表项的第一栏中插人一条注释语句,比如例43中的注释行: / in1 in2

13、in3 in4 ctrl1 ctrl2 out,UDP元件的逻辑功能是由UDP定义模块内关键词“table”和“endtable”之间的table表的内容所决定的,table表相当于构成了UDP元件输入输出的一个真值表。在进行模拟时,当模拟器发现UDP的某个输入发生改变时,将会自动进入table表查找相匹配的table表项,再把查到的输出逻辑值赋给输出端口。如果在UDP定义模块的table表中找不到与当前输入相匹配的table表项,则输出端将取不定态“x”。所以,在进行UDP元件描述时,应当将尽可能多的输入状态设置到table表项中。,以设计一个一位的全加器为例,表4.1是它的本位和与进位的逻

14、辑真值表,由于一个UDP元件只允许有一个一位的输出,所以要分别定义两个UDP元件来实现全加器的本位和与进位。把它们的真值表分别移植到两个UDP描述的table表中,就得到了例4-5所示的全加器的UDP描述。,【例4-5】全加器的UDP描述。 /进位的UDP定义 primitive carry(cout,cin,a,b ); output cout; input a ,b ,cin; table /cout 对应的table表项 /cin a b : cout 0 0 0 : 0; 0 0 1 : 0; 0 1 0 : 0; 0 1 1 : 1: 1 0 0 : 0: 1 0 1 : 1; 1

15、1 0 : 1; 1 1 1 : 1; endtable endprimitive,/本位和的UDP定义 primitive summ(sum,cin,a,b ); output sum; input a ,b ,cin; table /sum对应的table表项 /cin a b : sum 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 1; 0 1 1 : 0: 1 0 0 : 1: 1 0 1 : 0; 1 1 0 : 0; 1 1 1 : 1; endtable endprimitive,在例4-5的table表没有考虑到输入为x时的情况,因此在某个输入为x时,模拟器找不

16、到对应的table表项,输出将为cout = x,sum = x。而实际上对于进位cout而言,只要三个输入项(cin,a和b)中有二个值为1,则不管第三个的值是什么(0,1或x),cout一定为1;反之,如果输入中有二个为0,则cout也一定为0。为了表示出进位的这一特征,可以在cout对应的UDP定义table表内用?来替代第三个值对应表项,得到例4-6的定义描述。,【例4-6】考虑了输入状态“x”后的全加器进位cout的UDP描述。 /进位的UDP定义 primitive carry(cout,cin,a,b ); output cout; input a ,b ,cin; table

17、/cout 对应的table表项,较例45的情况有所精简 /cin a b : cout 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0: 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1: endtable endprimitive,例:将如图4.1(下页)所示的组合逻辑电路描述为一个UDP元件时,首先得到该电路的真值表如表4.2所示。,图4.1 一个组合逻辑电路的例子,【例4-7】图4.1所示电路的UDP描述。 primitive and_or(out,a,b,c ); output out; input a ,b ,c; table /a b c : out

18、 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 0; 0 1 1 : 1: 1 0 0 : 0: 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1; endtable endprimitive,若再考虑到输入取x态的情况,由图4.1可知,当a b c0x0,x00时输出为0;当a b c0x1,11x,1x1,x01,x11,xx1时输出为1;将这些状态补充到table表中就得到例4-8的情况。,【例4-8】图4.1所示电路的UDP描述。 primitive and_or(out,a,b,c ); output out; input a ,b ,c; table /

19、a b c : out 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 0; 0 1 1 : 1: 1 0 0 : 0: 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1;,/补充的包含有x输入态的表项 0 x 0 : 0; x 0 0 : 0; 0 x 1 : 1; 1 1 x : 1; 1 x 1 : 1; x 0 1 : 1; x 1 1 : 1; x x 0 : 1; endtable endprimitive,由上面给出的逻辑图4.1和例4-8中的table表可以看出, 当输入c取值为1时,无论a,b取值如何,输出out取值都是1; 当输入a b取值为11时

20、,无论c取值如何输出,out取值都是1; 当输入b c取值为00时,无论a取值如何,输出out取值都是0; 当输入a c取值为00时,无论b取值如何,输出out取值都是0。 这样可以对table表进行简化得到例4-9所示的UDP描述。,【例4-9】图4.1所示电路的UDP描述。 primitive and_or(out,a,b,c ); output out; input a ,b ,c; table /a b c : out ? ? 1 : 1; 1 1 ? : 1; ? 0 0 : 0; 0 ? 0 : 0: endtable endprimitive,4.3 时序逻辑电路UDP 与组合逻

21、辑电路相比,时序逻辑电路元件的输出除了与当前的输入状态有关,还与时序元件本身的内部状态有关。 对时序逻辑电路UDP进行定义时的table表项格式为: : : ,与组合逻辑电路UDP的定义一样,时序逻辑电路UDP定义模块中各个输入端口在table表项中的排列顺序必须与它们在“primitive”语句中端口表项内的排列顺序保持严格一致;在表项中要用空格分隔开不同的输入逻辑值。,时序逻辑电路UDP定义时的 table表项格式与组合逻辑电路UDP的表项格式的不同之处在于: (1) 表项中多了关于元件内部状态的描述。 (2) 要用两个冒号分别将输入逻辑值部分与元件内部状态,元件内部状态与输出逻辑值部分分

22、隔开。 (3) 在构建table表项时要把元件内部状态对输出的影响考虑进去。,时序逻辑电路元件可根据触发方式分为 电平触发 边沿触发 它们对应的table表项格式虽然都是上面给出的格式,但是table表项中输入输出信号可取的状态在两种电路类别下是不同的。,4.3.1 初始化状态寄存器 因为时序逻辑电路元件有自己的内部状态,所以必须有一个寄存器变量来保持其内部状态。在时序逻辑电路UDP的定义模块中必须将输出端口定义为寄存器类型,时序逻辑电路UDP的定义模块中必须增加“输出端寄存器变量说明”这一项来将输出端口说明成寄存器变量类型。,在有些情况下必须对上电时刻(即0时刻)元件的初始状态值加以指定。所

23、以在时序逻辑电路UDP的定义模块中还可以增加“元件初始状态说明”这一项通过initial过程块来指定元件上电时刻的初始状态(0、1或x)。如果该说明项(initial语句)缺省,则元件的初始状态被默认为不定态“x”。,4.3.2 电平触发时序电路UDP 电平触发时序电路UDP的特点是其内部状态改变是由某一输入信号电平触发的。 比如一个电平触发的锁存器,其真值表示于表4.3中。,当它的时钟输入信号clk为逻辑0时,锁存器的状态及输出时刻保持与输入信号d_in相同;当时钟输入信号为逻辑1时,锁存器进入锁存状态,其内部状态及输出保持不变。,下面给出了电平触发锁存器的UDP描述。,【例4-10】电平触

24、发锁存器的UDP描述。 primitive latch (q,clk,d_in); output q; reg q; input clk, d_in ; initial q = 1b0; / 内部状态和输出被初始化为0状态 table /clk d_in : current_state : next_state 0 1 : ? : 1; 0 0 : ? : 0; 1 ? : ? : ; /“”表示输出状态不变 endtable endprimitive,需要注意到:定义中增加了对说明输出q为寄存器类变量的reg语句;又增加了指定UDP初始状态为逻辑0值的initial语句。,最后一个table

25、项内引入了一个新的标记“”,它的含义就是UDP的内部状态(也就是输出端状态)将保持原有状态不变(No-change)。表项中的“?”仍代表“任意态”。,4.3.3 边沿触发时序电路UDP 边沿触发时序电路UDP的特点是其内部状态的改变是由输入时钟的有效边沿(上升沿或下降沿)触发的,而与时钟信号稳定时的输入状况无关。所以对边沿触发时序逻辑元件的描述中就需要对输入信号的变化和变化方式加以考虑。,模拟器只有在检测到输入信号发生跳变时才会搜索table表得到新的内部状态值和输出逻辑值。这样table表项中的输入逻辑值部分需要列出输入逻辑值的变化情况即跳变情况。 在Verilog中用一对括号括起来的二个

26、数字“(vw)”的形式来表示从一个状态到另一个状态的转化,其中v、w可以是0、1、x、?之一,因而(01)代表的就是由0往1的上升沿正跳变,(10)则代表了下降沿负跳变,(1x)代表了由1往不定态的跳变,(?)代表在0,1,x三状态间的任意跳变。,必须注意Verilog规定在每一条table表项中最多只允许一个输入信号处于跳变状态,例如: / clk data state next_state (01) (10) 0 0 ; 表示的这一条table表项就是不允许的,因为其中有两个输入信号clk和data同时发生了跳变。 以设计一个上升沿T触发器为例,其真值表示于表4.4中。,真值表的第14行说

27、明了在时钟信号clk发生上跳变时,若输入t_in为0则触发器状态保持不变,而若clk上跳变时t_in为1则触发器状态翻转;,真值表的第58行说明了在时钟信号clk发生下跳变时,不管输入t_in为何值,触发器状态保持不变;,真值表的第9、10行说明在时钟信号clk处于稳定值但t_in发生跳变时,触发器状态保持不变;,将真值表中的各种情况加以简化并移植到UDP描述的table表中可以得到例4-11所示的上升沿T触发器的UDP描述。,【例4-11】上升沿T触发器的UDP描述。 primitive t_trigger(q,clk,t_in); output q; reg q: input t_in,c

28、lk; table / clk t_in : state : q (01) 0 : ? : - ; (01) 1 : 0 : 1 ; (01) 1 : 1 : 0 ; (10) ? : ? : - ; (0x) 0 : ? : - ; (1x) 0 : ? : - ; ? (?) : ? : - ; endtable endprimitive,table表中的第5、6项内容的目的是为了把尽可能的定态输出情况考虑进去。它们在本例中的意思是,当时钟从0状态变化到不定态x时或从1状态变化到不定态x时,如果输入t_in为0,则UDP元件状态及输出逻辑值保持原来的取值不变;,table表中的最后一项与真

29、值表的第9、10两行对应,注意这项是描述一个T触发器所必需的,因为只要在table表中出现了一个含有输入逻辑值跳变的表项,模拟器就会对任何一个输入信号的跳变作出反应,进入table表查找相应的表项,如果上例中没有这条表项来对数据输入端t_in发生跳变时元件输出端对应的逻辑取值进行说明,模拟器将会因为找不到对应的说明项而输出一个不定态x。,为了简化UDP元件定义模块中table表项的描述,以及为了加强table表的可读性,Verilog在对UDP进行定义时引入了一些缩记符号来描述table表项,这些符号列于表4.5之中,利用这些缩记符号,例4-11可以被改写成例4-12的形式。,【例4-12】使

30、用缩记符号后的上升沿T触发器的UDP元件定义模块。 primitive t_trigger(q,clk,t_in); output q; reg q: input t_in,clk; table / clk t_in : state : q r 0 : ? : - ; r 1 : 0 : 1 ; r 1 : 1 : 0 ; f ? : ? : - ; (?) 0 : ? : - ; ? (?) : ? : - ; endtable endprimitive,4.3.4 电平触发和边沿触发混合的时序电路UDP 有些时序逻辑电路中的状态改变要既受电平触发、又受边沿触发。这种电路称为电平触发和边沿触

31、发混合的时序电路。 例如一个带有异步清零输入和异步置位输入的触发器,清零和置位操作时要求电平触发,而触发器本身却是边沿触发的。,在这种混合触发形式时序电路类型的UDP定义模块中,稳定的输入状态和输入信号的跳变状况都将对元件的输出和元件内部状态的改变产生影响。所以在进行UDP定义描述时需要同时对输入的稳定取值和变化状态加以考虑。在table表项中要同时包括有稳定输入状态和输入跳变状态。例4-13中所描述的就是一个具有异步清零功能的下降沿D触发器。,【例4-13】具有异步清零功能的下降沿D触发器的UDP定义模块。 primitive dff (q,d,clk,clr); output q; inp

32、ut clk,clr,d; reg q; /定义输出q为寄存器变量类型 initial q = 0; /上电时q值初始化为0 table /d clk clr : state : q /*清零情况*/ ? ? 0 : ? : 0 ; / clr=0, 执行触发器清零 /*正常触发下的时序逻辑*/ 0 r 1 : ? : 0 ; /时钟上升沿时输入d=0,触发器置0 1 r 1 : ? : 1 ; /时钟上升沿时输入d=1,触发器置1 ? n 1 : ? : - ; /时钟负跳变时,触发器状态保持不变 /*输入d发生跳变情况下的逻辑*/,第1条table表项描述的就是当异步清零输入有效时(低电平

33、有效)的处理方式。,第24条table表项描述是同步D触发器正常的触发操作,其中第2条和第3条表项说明:时钟发生上升沿跳变后,元件的输出状态将与发生跳变时输入d的逻辑值相同;而第4条表项说明输入时钟的负跳变不会对元件输出端状态产生影响;,* ? 1 : ? : - ; /clk处于定态时,忽略d跳变,触发器状态保持不变 /*输入clr发生正跳变情况下的逻辑*/ ? ? p : ? : - ; /clr处于定态时,忽略clr正跳变, / 触发器状态保持不变 /*减少输出不定态*/ 0 (0X) 1 : 0 : 0 ; 1 (0X) 1 : 1 : 1 ; endtable endprimitive,第5条table表项说明当时钟输入处于稳定态时,d输入端信号的跳变不会影响触发器的输出和内部状态。,第6条table表项说明当时钟输入处于稳定态时,clr输入端的正跳变不会影响触发器的输出和内部状态。,最后两个table表项是为了减少输出的不定态而设计的。,在上面的例子中,电平触发方式对应的table表项排在边沿触发方式对应的table表项之前,这是因为清零操作要比正常的同步触发逻辑操作具有更高的优先级,将电平触发清零操作对应的表项放在table表的最前面,依据查表顺序,可以保证模拟器在进行仿真运行时会先对异步清零信号作出响应。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1