收藏 分享(赏)

第4章模块和端口.ppt

上传人:天天快乐 文档编号:1155725 上传时间:2018-06-15 格式:PPT 页数:38 大小:639.50KB
下载 相关 举报
第4章模块和端口.ppt_第1页
第1页 / 共38页
第4章模块和端口.ppt_第2页
第2页 / 共38页
第4章模块和端口.ppt_第3页
第3页 / 共38页
第4章模块和端口.ppt_第4页
第4页 / 共38页
第4章模块和端口.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、第4章 模块和端口,学习目标 说明Verilog模块定义中的各个组成部分,例如模块名、端口列表、参数、变量声明、数据流描述语句、行为语句、调用(实例引用)其他模块以及任务和函数等。 理解如何定义模块的端口列表以及在Verilog中如何声明。 讲述模块实例的端口连接规则。 理解如何通过有序列表和名字将端口与外部信号相连。 解释对Verilog标识符的层次引用。,4.1 模块,图4.1Verilog模块的部件,4.1 模块,模块定义以关键字module开始,模块名、端口列表、端口声明和可选的参数声明必须出现在其他部分的前面,endmodule语句必须为模块的最后一条语句。 端口是模块与外部环境交互

2、的通道,只有在模块有端口的情况下才需要有端口列表和端口声明。 模块内部的5个组成部分是:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数。这些部分可以在模块中的任意位置,以任意顺序出现。在模块的所有组成部分中,只有module、模块名和endmodule必须出现,其他部分都是可选的,用户可以根据设计的需要随意选用。在一个Verilog源文件中可以定义多个模块,Verilog对模块的排列顺序没有要求。,41 模块,为了理解模块的各个组成部分,下面我们以SR锁存器为例进行详细说明,如图4.2所示。,图4.2 SR锁存器,41 模块,我们可以从例4.1中注意到以下几个特点:在SR锁存器的

3、描述中,图4.1中显示的各组成部分并未全部出现,例如变量声明、数据流(assign)语句和行为语句块(always和initial结构);在SR锁存器的激励模块中包括了模块名、线网/寄存器/变量声明、低层模块实例、行为语句块和endmodule语句,但是没有包括端口列表、端口声明和数据流(assign)语句;除了module和endmodule这一对关键字以及模块名,其他部分都是可选的,可以根据设计需要混合使用。,/本例说明模块的构成部件/模块名和端口列表/SR锁存器模块module SR_latch(Q, Qbar, Sbar, Rbar);/端口声明output Q, Qbar;input

4、 Sbar, Rbar;/调用(实例引用)较低层次的模块/本例中调用(实例引用)的是verilog原语部件nand,即与非门/注意它们之间互相交叉连接的情况nand n1(Q, Sbar, Qbar);nand n2 (Qbar, Rbar, Q);/模块语句结束endmodule,/模块名和端口列表/测试激励信号模块module Top;/声明wire,reg和其他类型的变量wire q, qbar;reg set, reset;/调用(实例引用)较低层次的模块/本模块中调用(实例引用)的是SR_latchSR_latch ml(q, qbar, set, reset);/行为模块,初始化i

5、nitialbegin $monitor($time,set= %b, reset= %b, q= %bn,set,reset,q); set=0; reset= 0; #5 reset = 1; #5 reset = 0; #5 set = 1;end/模块语句结束endmodule,4.2 端口,端口是模块与外界环境交互的接口,例如IC芯片的输入、输出引脚就是它的端口。对于外部环境来讲,模块内部是不可见的,对模块的调用(实例引用)只能通过其端口进行。这种特点为设计者提供了很大的灵活性:只要接口保持不变,模块内部的修改并不会影响到外部环境。我们也常常将端口称为终端(terminal)。,42

6、 端口,421 端口列表 在模块的定义中包括一个可选的端口列表。如果模块和外部环境没有交换任何信号,则可以没有端口列表。考虑一个在顶层模块Top中被调用(实例引用)的四位加法器,图4.3显示了输入/输出端口的示意图。,图4.3 全加器和顶层模块的I/O端口,42 端口,例42 端口列表,module fulladd4(sum,c_out,a,b, c_in);/有端口列表的模块module Top;/没有端口列表的模块,仿真用顶层模块,4.2.2 端口声明,端口列表中的所有端口必须在模块中进行声明,Verilog中的端口具有以下三种类型:,根据端口信号的方向,端口具有三种类型:输入、输出和输入

7、/输出。,422 端口声明,例43 端口声明,module fulladd4(sum, c_out, ina, inb, c_in);/端口声明开始output3:0 sum;output c_cout;input 3:0 ina, inb;input c_in;/端口声明结束模块的内容endmodule,assign cout,sum =ina+inb+cin;,4 位全加器的仿真程序 timescale 1ns/1ns include adder4.v module adder_tp; /测试模块的名字 reg3:0 ina,inb; /测试输入信号定义为reg型 reg cin; wir

8、e3:0 sum; /测试输出信号定义为wire型 wire cout; integer i,j; adder4 adder(sum,cout,ina,inb,cin); /调用测试对象 always #5 cin=cin; /设定cin的取值 initial begin ina=0;inb=0;cin=0;,for(i=1;i16;i=i+1) #10 ina=i; /设定a的取值 end initial begin for(j=1;j16;j=j+1) #10 inb=j; /设定b的取值 end initial /定义结果显示格式 begin $monitor($time,%d + %d

9、 + %b=%b,%d,ina,inb,cin,cout,sum); #160 $finish; end endmodule,在Verilog中,所有的端口隐含地声明为wire类型,因此如果希望端口具有wire数据类型,将其声明为三种类型之一即可;如果输出类型的端口需要保存数值,则必须将其显式地声明为reg数据类型。,例44 DFF模块的端口声明,module DFF(q, d, clk, reset);output q;reg q; /输出端口q保持值,因此它被声明为寄存器类型(reg)的变量input d, clk, reset;endmodule,不能将input和inout类型的端口声

10、明为reg数据类型,这是因为reg类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化,并不能保存这些信号的值。,422 端口声明,例45 ANSIC风格的端口声明,module fulladd4 (output reg 3:0 sum, output reg c_out,input 3:0 a, b, /默认类型为wireinput c_in; /默认类型为wire模块的内容endmodule,assign cout,sum =ina+inb+cin;,4.2.3 端口连接规则,我们可以将一个端口看成是由相互连接的两个部分组成,一部分位于模块的内部,另一部分位于模块的外部。当

11、在一个模块中调用(实例引用)另一个模块时,端口之间的连接必须遵守一些规则。,图4.4端口连接规则,423 端口连接规则,输入端口 从模块内部来讲,输入端口必须为线网数据类型;从模块外部来看,输入端口可以连接到线网或reg数据类型的变量。输出端口 从模块内部来讲,输出端口可以是线网或reg数据类型;从模块外部来看,输出必须连接到线网类型的变量,而不能连接到reg类型的变量。输入/输出端口 从模块内部来讲,输入/输出端口必须为线网数据类型;从模块外部来看,输入/输出端口也必须连接到线网类型的变量。,423 端口连接规则,位宽匹配 在对模块进行调用(实例引用)的时候,Verilog允许端口的内、外两

12、个部分具有不同的位宽。在一般情况下,Verilog仿真器会对此给予警告。未连接端口 Verilog允许模块实例的端口保持未连接的状态。例如,如果模块的某些输出端口只用于调试,那么这些端口可以不与外部信号连接。,fulladd4 fa0(SUM, A, B, C_IN); /输出端口c_out没有连接,423 端口连接规则,非法端口连接举例 下面我们以例4.3中的模块fulladd4在测试激励块Top中的调用(实例引用)为例,来说明端口的连接规则。,例46 非法端口连接,module Top;/声明连接变量reg 3:0A,B;reg C_IN;reg 3:0 SUM;wire C_OUT;/调

13、用(实例引用)fulladd4,在本模块中把它命名为fa0fulladd4 fa0(SUM, C_OUT, A, B, C_IN);/非法连接,因为fulladd4模块中的输出端口sum被连接到Top模块中的寄存器变量SUM上测试激励endmodule,在这个例子中,如果把SUM变量声明为wire类型,则这种连接是正确的。,4.2.4 端口与外部信号的连接,在对模块调用(实例引用)的时候,可以使用两种方法将模块定义的端口与外部环境中的信号连接起来:按顺序连接以及按名字连接。但是,这两种方法不能混合在一起使用。,顺序端口连接 对于初学者,按照顺序进行端口连接是很直观的方法。在这种方法中,需要连接

14、到模块实例的信号必须与模块声明时目标端口在端口列表中的位置保持一致。,module Top;/声明连接变量reg 3:0A,B;reg C_IN;wire3:0 SUM;wire C_OUT;/调用(实例引用)fulladd4,在本模块中把它命名为fa_ordered/信号按照端口列表中的次序连接fulladd4 fa_ordered(SUM, C_OUT, A, B, C_IN);测试激励endmodulemodule fulladd4(sum, c_out, a, b, c_in);output 3:0 sum;output c_cout;input 3:0 a, b;input c_in

15、;模块的内容endmodule,例47 顺序端口连接,顺序端口连接信号按照端口列表中的次序连接,4.2.4 端口与外部信号的连接,命名端口连接 在大型的设计中,模块可能具有很多个端口。在这种情况下,要记住端口在端口列表中的顺序是很困难的,而且很容易出错。因此,Verilog提供了另一种端口连接方法:命名端口连接。顾名思义,在这种方法中端口和相应的外部信号按照其名字进行连接,而不是按照位置。使用这种方法调用(实例引用)模块fulladd4的Verilog程序代码如下所示。,424 端口与外部信号的连接,/调用(实例引用)以fa_byname命名的全加器模块fulladd4,通过端口名与外部信号连

16、接Fulladd4 fa_byname(.cout(C_OUT),.sum(SUM),.b(B),.c_in(C_IN),.a(A),);,注意,在这种连接方法中,需要与外部信号连接的端口必须用名字进行说明,而不需要连接的端口只需简单地忽略掉即可。例如,如果端口c_out需要悬空,则Vefilog程序代码如下所示。注意,在端口连接列表中端口c_out被忽略。,/调用(实例引用)以fa_byname命名的全加器模块fulladd4,通过端口名与外部信号连接fulladd4 fa_byname(.sum(SUM),.b(B),.c_in(C_IN),.a(A),);,相对于顺序端口连接,命名端口连

17、接的另一个优点是,只要端口的名字不变,即使模块端口列表中端口的顺序发生了变化,模块实例的端口连接也无需进行调整。,【实验1】 简单组合电路的设计(三选一电路),module mux21a (a, b, s, y);input a,b,s;output y;reg y; always (a or b or s) begin if (s=1b0) begin y=a; end else begin y=b; end endendmodule,module MUXK (a1, a2, a3, s0, s1, outy); input a1, a2, a3, s0, s1; output outy;

18、wire outy; wire tmp;mux21a u1 (.a(a2),.b(a3),.s(s0),.y(tmp);mux21a u2 (.a (a1),.b (tmp),.s (s1),.y (outy);endmodule,4.3 层次命名,用Verilog进行层次化设计。每一个模块实例、信号或变量都使用一个标识符进行定义;在整个设计层次中,每个标识符都具有惟一的位置。层次命名允许设计者在整个设计中通过惟一的名字表示每个标识符。层次名由一连串使用“”分隔的标识符组成,每个标识符代表一个层次,这样设计者就可以在设计中的任何地方通过指定完整的层次名对每个标识符进行访问。,43 层次命名,我

19、们将设计中的顶层模块称为“根模块”,它不能被其他模块所调用(实例引用),它是整个设计层次的起点。我们可以从这个起点出发,沿着层次路径找到设计中的每个标识符。,图4.5 SR锁存器仿真的设计层次,例48层次名,stimulus stimulus.qstimulus.qbar stimulus.setstimulus.reset stimulus.m1stimulus.ml.Q stimulus.ml.Qbarstimulus.ml.S stimulus.ml.Rstimulus.nl stimulus.n2,例子中,stimulus是顶层模块,它不能在其他模块中被调用(实例引用),因此是设计层次

20、的根。在stimulus中定义的标识符包括q,qbar,set和reset,并且调用(实例引用)了模块SR_latch(实例名为m1)。在实例m1中调用(实例引用)了预定义的nand(实例名为n1和n2),其中定义的端口信号为Q,Qbar,S和R。,44 小结,模块定义包括多个组成部分。关键字module和endmodule是必须使用的。其他各个部分,诸如端口列表、端口声明、变量和信号声明、数据流语句、行为语句块、低层模块实例以及任务和函数都是可选的,由用户根据需要进行添加。端口是模块与其他模块或外部环境通信的渠道。模块可以具有一个端口列表,其中的每个端口必须在模块中声明为输入、输出或输入/输

21、出三种类型之一。在对模块进行调用(实例引用)的时候,必须遵守有关端口连接的规则。ANSI C风格的端口声明将端口声明嵌入到端口列表中。端口的连接方法有两种:顺序连接和命名连接。设计中的每个标识符都具有惟一的层次名,它使得用户可以在设计中的任何位置访问设计中的每个标识符。,45 习题,1模块的基本组成部分有哪些?哪几个部分必须出现?答: 1. module,模块名2. 端口列表 port list3. 参(变) 数的参数Parameters4. 线网/寄存器/变量声明Declarations of wires, regs and other variables5. 低层模块实例Instantia

22、tion of lower level modules6. 数据流语句Data flow statements (assign)7. 行为语句块(always和initial结构)always and initial blocks8. 任务和函数tasks and functions9. endmodule模块语句结束只有module、模块名和endmodule必须出现,其他部分都是可选的,2一个不与外部环境交互的模块是否有端口?模块定义中是否有端口列表?答:一个不与外部环境交互的模块没有端口如果模块和外部环境没有交换任何信号,则可以没有端口列表。,45 习题,3一个4位并行移位寄存器的FO引

23、脚如下图所示。写出模块shift_reg的定义,只需写出端口列表和端口定义,不必写出模块的内部结构。,45 习题,module shift_reg(reg_out, reg_in, clock);output 3:0 reg_out;input 3:0 reg_in;input clock;/不必写出模块的内部结构endmodule,45 习题,4定义一个顶层模块stimulus,在其中声明reg变量REG_IN(4位)和CLK(1位)以及wire变量REG_OUT(4位)。在其中调用(实例引用)模块shift_reg,实例名为sr1,使用顺序端口连接。,module stimulus;wir

24、e 3:0 reg_out;reg 3:0 reg_in;reg clock;shift_reg sr1(reg_out, reg_in, clock);/不必写出模块的内部结构endmodule,45 习题,5将上题的端口连接方法改为命名连接。,module stimulus;wire 3:0 REG_OUT;reg 3:0 REG_IN;reg CLOCK;shift_reg sr1(.reg_out(REG_OUT), .reg_in(REG_IN), .clock(CLOCK);/不必写出模块的内部结构endmodule,6写出REG_IN,CLK和REG_OUT的层次名。答:Stimulus. REG_INStimulus. CLKStimulus. REG_OUT,45 习题,7写出模块实例sr1及其端口clock和reg_in的层次名。答:Stimulus. sr1 . clockStimulus . sr1 . reg_in,

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

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报