任务3.1门级原语
任务3.2层次建模;任务3.1门级原语;任务3.1门级原语;简单的逻辑电路可以使用逻辑门来设计实现。
基本的逻辑门分为两类:与/或门类、缓冲/非门类。
(1)与/或门类。
与/或门类包括与门(and)、或门(or)、与非门(nand)、或非门(nor)、异或门(xor)、同或门(xnor)。与/或门类都具有一个标量输出端和多个标量输入端,门的端口列表中的第一个端口必定是输出端口,其他均为输入端口。当任意一个输入端口的值发生变化时,输出端口的值立即重新计算。
例如:;(2)缓冲/非门类。
缓冲/非门类包括缓冲器(buf)、非门(not)、带控制端的缓冲器/非门(bufif1、bufif0、notif1、notif0)。缓冲/非门类具有一个标量输入端和多个标量输出端,门的端口列表中的最后一个端口必定是输入端口,其他均为输出端口。
例如:;【例3-1】利用双输入端的nand门,编写自己的双输入端的与门(my_and)、或门(my_or)、非门(my_not)、异或门(my_xor)。
上述电路设计涉及的知识点有门级原语例化和多输出处理。
下面对这些知识点进行说明。;(1)门级原语例化。
在门级原语实例引用的时候,可以不指定具体的实例名,这一点给需要实例引用几百个甚至更多门的模块提供了方便。但对于初学者,建议在调用门级原语时给出实例名。在以上示例中,调用门级原语时均没有给出实例名。
在实际应用中,与非门和或非门更为普遍,这是因为由这两种门生成其他逻辑门容易实现。本例给出了使用与非门来设计其他基本逻辑门的方法。
(2)多输出处理。
例3-1中有4个输出y[0]~y[3],分别对应着与门、或门、非门、异或门。这4个输出均是独立的,在代码中分别进行了单独处理。在实践中,建议针对每个输出单独进行分析设计,这样做对于正确地实现电路逻辑是非常有效的。
例3-1的测试代码如例3-2所示。;【例3-2】门电路测试代码。
;任务3.2?层次建模;首先通过一个典型的实例来介绍层次建模的概念。
【例3-3】实现一个1位全加器。
使用QuartusⅡ软件综合的全加器的电路图如图
3-2所示。
由图3-2可见,全加器是由两个半加器和一个或门组成的。
双击图中的半加器,可以看出半加器又由与门、异或门和
???门构成,如图3-3所示。;上述电路设计涉及的知识点有层次建模、模块例化。
下面对这些知识点进行说明。
(1)层次建模。
模块是可以进行层次嵌套的,因此,可以将大型数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。
在全加器模块内部调用了半加器模块和或门模块,而在半加器模块内部又调用了基本逻辑门原语。
在层次建模中,不管是顶层模块还是被调用模块内部,其实现方式都可以使用多种方式,包括数据流建模、行为建模、结构化建模、状态机建模等。例如,在例3-3中,或门模块内部使用了数据流建模,使用了连续赋值语句assign。;(2)模块例化。
在全加器模块中有两处调用了半加器:h_adderu0(ain,bin,d,e);?和h_adderu1(e,cin,f,sum);。每次调用均给出一个唯一的实例名,调用时端口列表名称不同。在Verilog设计中,模块调用时,可以按顺序将模块定义的端口与外部环境中的信号连接起来,这种方法称为按顺序连接。h_adderu0(ain,bin,d,e);?调用将ain、bin、d、e分别与模块定义中的端口a、b、co、so连接;h_adderu1(e,cin,f,sum);?调用将e、cin、f、sum分别与模块定义中的端口a、b、co、so连接。
全加器的仿真波形如图3-4所示。从仿真波形中可???看出,该设计完成了一位全加器的功能。;与仿真波形相应的测试代码如下:
【例3-4】1位全加器测试模块。
;(1)层次建模。
数字电路设计中有两种基本的设计方法:自底向上和自顶向下。在自顶向下设计方法中,首先定义顶层模块,随后将顶层模块分解为多个必要的子模块,然后进一步对各个子模块进行分解,直到达到无法进一步分解的底层功能块,如图3-5所示。
在自底向上设计方法中,首先对现有的功能块进行分析,然后使用这些模块来搭建规模大一些的功能块,如此继续,直到顶层模块,如图3-6所示。
在典型的设计中,这两种方法是混合使用的。为了说明层次建模的概念,下面结合全加器进行说明。
根据全加器的电路图,可以得出全加器的设计层次如图3-7所示。;使用自顶向下的方法进行设计,首先需要说明全加器的功能。在使用半加器和或门搭建顶层模块之后,进一步使用与门、异或门和非门来实现半加器。这样就可以将较大的功能块分解为较小的功能块,直到无法继续分解。对于例3-4,我们