电路计算机辅助设计课件_第1页
电路计算机辅助设计课件_第2页
电路计算机辅助设计课件_第3页
电路计算机辅助设计课件_第4页
电路计算机辅助设计课件_第5页
已阅读5页,还剩197页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电路计算机辅助设计

吉林大学通信工程学院高燕梅电路计算机辅助设计吉林大学通信工程学院1教学内容与要求第1章EDA技术简介第2章VerilogHDL语言编程(10学时)第3章VHDL语言编程(8学时)第4章MATLAB程序入门(12学时)第5章MATLAB在电路中的应用(4学时)每章有实验室上机实验/eeec实验教学

教学内容与要求第1章EDA技术简介2第1章EDA技术简介1.1EDA技术的主要内容1.2EDA软件系统的构成1.3EDA的工程设计流程1.4数字系统的设计方法第1章EDA技术简介3第2章VerilogHDL语言编程2.1VerilogHDL设计模块的基本结构2.2VerilogHDL词法构成2.3VerilogHDL的语句2.4VerilogHDL模型2.5VerilogHDL设计电路流程2.6用VerilogHDL描述逻辑电路的实例第2章VerilogHDL语言编程4第3章VHDL语言编程基础3.1概述3.2VHDL程序基本结构3.3VHDL语言要素3.4VHDL顺序语句3.5VHDL并行语句3.6子程序(SUBPROGRAM)3.7库、程序包及其他3.8VHDL描述风格3.9基本逻辑电路设计3.10状态机的VHDL设计

第3章VHDL语言编程基础5第4章MATLAB程序入门4.1基本语法4.1.1变量及其赋值4.4.2矩阵的初等运算4.1.3元素群运算4.1.4逻辑判断及流程控制4.2基本绘图方法4.2.1M文件及程序调试4.2.2MATLAB的开发环境和工具第5章MATLAB在电路中的应用5.1电阻电路和动态电路5.2正弦稳态电路和频率响应5.3二端口电路5.4滤波器第4章MATLAB程序入门6第1章EDA技术简介

1.1EDA技术的主要内容EDA是电子设计自动化(ElectronicDesignAutomation)的缩写。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可靠性,减轻了设计者的劳动强度。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。CPLD、FPGA器件可以通过软件编程而对硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。促进了EDA技术的迅速发展。第1章EDA技术简介7EDA技术涉及面广,内容丰富,主要应掌握如下四个方面的内容:①大规模可编程逻辑器件,大规模可编程逻辑器件是利用EDA技术进行电子系统设计的载体。FPGA和CPLD②硬件描述语言,硬件描述语言是利用EDA技术进行电子系统设计的主要表达手段。VHDL、Verilog、ABEL③软件开发工具,软件开发工具是利用EDA技术进行电子系统设计的智能化的自动化设计工具。Altera的MAX+plusII、Lattice的ispEXPERT、Xilinx的FoundationSeries。④实验开发系统,实验开发系统则是利用EDA技术进行电子系统设计的下载工具及硬件验证工具。EDA技术涉及面广,内容丰富,主要应掌握如下四个方面的内容:81大规模可编程逻辑器件

可编程逻辑器件(简称PLD)是一种由用户编程以实现某种逻辑功能的新型逻辑器件。FPGA是现场可编程门阵列的简称,CPLD是复杂可编程逻辑器件的简称。高集成度、高速度和高可靠性是FPGA/CPLD最明显的特点,其时钟延时可小至ns级,结合其并行工作方式,在超高速应用领域和实时测控方面有着非常广阔的应用前景。FPGA/CPLD的高可靠性还表现在几乎可将整个系统下载于同一芯片中,实现所谓片上系统,从而大大缩小了体积,易于管理和屏蔽。1大规模可编程逻辑器件92硬件描述语言(HDL)

常用的硬件描述语言有VHDL、Verilog、ABEL。VHDL:作为IEEE的工业标准硬件描述语言,在电子工程领域,已成为事实上的通用硬件描述语言。Verilog:支持的EDA工具较多,适用于RTL级(寄存器转换级)和门电路级的描述,其综合过程较VHDL稍简单,但其在高级描述方面不如VHDL。有专家认为,在新世纪中,VHDL与Verilog语言将承担几乎全部的数字系统设计任务。2硬件描述语言(HDL)103软件开发工具目前比较流行的、主流厂家的EDA的软件工具有:Altera的MAX+plusII、升级版QuartusII;Lattice的ispEXPERT;Xilinx的FoundationSeries。MAX+plusII是Altera公司开发的EDA工具软件。Altera公司是世界上最大的可编程逻辑器件供应商之一。MAX+plusII软件是一个集成化的可编程逻辑器件开发环境,设计者能在这个环境下进行逻辑设计,完成设计文件的输入编辑、编译、仿真、综合、布局布线和编程下载等设计工作。软件界面友好、方便易学、功能全面,是非常流行的大众化EDA平台。3软件开发工具11MAX+plusII:支持原理图、VHDL和Verilog语言文本文件,以及以波形与EDIF等格式的文件作为设计输入,并支持这些文件的任意混合设计。它具有门级仿真器,可以进行功能仿真和时序仿真,能够产生精确的仿真结果。在适配之后,MAX+plusII生成供时序仿真用的EDIF、VHDL和Verilog这三种不同格式的网表文件。它界面友好,使用便捷,被誉为业界最易学易用的EDA的软件,并支持主流的第三方EDA工具,支持所有Altera公司的FPGA/CPLD大规模逻辑器件。MAX+plusII:支持原理图、VHDL和Verilog124实验开发系统提供芯片下载电路及EDA实验/开发的外围资源(类似于用于单片机开发的仿真器),供硬件验证用。一般包括:①实验或开发所需的各类基本信号发生模块,包括时钟、脉冲、高低电平等;②FPGA/CPLD输出信息显示模块,包括数码显示、发光管显示、声响指示等;③监控程序模块,提供“电路重构软配置”;④目标芯片适配座以及上面的FPGA/CPLD目标芯片和编程下载电路。自己阅读4实验开发系统自己阅读131.2EDA软件系统的构成EDA技术研究的对象是电子设计的全过程,有系统级、电路级和物理级3个层次的设计。涉及的电子系统从低频、高频到微波,从线性到非线性,从模拟到数字,从通用集成电路到专用集成电路构造的电子系统,因此EDA技术研究的范畴相当广泛。EDA软件系统应当包含以下子模块:设计输入子模块、设计数据库子模块、分析验证子模块、综合仿真子模块、布局布线子模块等。自己阅读1.2EDA软件系统的构成自己阅读14(1)设计输入子模块;用户编辑输入模块的设计描述,并进行语义正确性、语法规则的检查,检查通过后,将用户的设计描述数据转换为EDA软件系统的内部数据格式,存入设计数据库被其他子模块调用。设计输入子模块不仅能接受图形描述输入、硬件描述语言(HDL)描述输入,还能接受图文混合描述输入。该子模块一般包含针对不同描述方式的编辑器,如图形编辑器、文本编辑器等,同时包含对应的分析器。自己阅读(1)设计输入子模块;用户编辑输入模块的设计描述,15(2)设计数据库子模块:该模块存放系统提供的库单元以及用户的设计描述和中间设计结果。(3)分析验证子模块:该模块包括各个层次的模拟验证、设计规则的检查、故障诊断等。(4)综合仿真子模块:该模块包括各个层次的综合工具,理想的情况是:从高层次到低层次的综合仿真全部由EDA工具自动实现。(5)布局布线子模块:该模块实现由逻辑设计到物理实现的映射,因此与物理实现的方式密切相关。例如,最终的物理实现可以是门阵列、可编程逻辑器件等,由于对应的器件不同,因此各自的布局布线工具会有很大的差异。

自己阅读(2)设计数据库子模块:该模块存放系统提供的库单元以及161.3EDA的工程设计流程1源程序的编辑和编译

利用EDA技术进行一项工程设计,首先需利用EDA工具的文本编辑器或图形编辑器将它用文本方式或图形方式表达出来,进行排错编译,变成Verilog、VHDL文件格式,为进一步的逻辑综合作准备。常用的源程序输入方式有三种。(1)原理图输入方式:利用EDA工具提供的图形编辑器以原理图的方式进行输入。原理图输入方式比较容易掌握,直观且方便,所画的电路原理图与传统的器件连接方式完全一样,很容易被人接受,而且编辑器中有许多现成的单元器件可以利用,自己也可以根据需要设计元件。1.3EDA的工程设计流程17电路计算机辅助设计课件18

(2)状态图输入方式:以图形的方式表示状态图进行输入。当填好时钟信号名、状态转换条件、状态机类型等要素后,就可以自动生成VHDL程序。这种设计方式简化了状态机的设计,比较流行。

(3)Verilog、VHDL软件程序的文本方式:最一般化、最具普遍性的输入方法,任何支持VHDL的EDA工具都支持文本方式的编辑和编译。(2)状态图输入方式:以图形的方式表示状态图进行输入。192逻辑综合和优化将VHDL的软件设计与硬件的可实现性挂钩,需要利用EDA软件系统的综合器进行逻辑综合。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形的描述,针对给定硬件结构组件进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述文件。综合器工作前,必须给定最后实现的硬件结构参数,它的功能就是将软件描述与给定硬件结构用某种网表文件的方式联系起来。综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高级语言描述转换成低级的,可与FPGA/CPLD或构成ASIC的门阵列基本结构相映射的网表文件。自己阅读2逻辑综合和优化自己阅读201.4数字系统的设计方法数字系统设计有多种方法,如模块设计法、自顶向下设计法和自底向上设计法等。数字系统的设计一般采用自顶向下、由粗到细、逐步求精的方法。自顶向下是指将数字系统的整体逐步分解为各个子系统和模块,若子系统规模较大,则还需将子系统进一步分解为更小的子系统和模块,层层分解,直至整个系统中各子系统关系合理,并便于逻辑电路级的设计和实现为止。采用该方法设计时,高层设计进行功能和接口描述,说明模块的功能和接口,模块功能的更详细的描述在下一设计层次说明,最底层的设计才涉及具体的寄存器和逻辑门电路等实现方式的描述。1.4数字系统的设计方法21

采用自顶向下的设计方法有如下优点:(1)自顶向下设计方法是一种模块化设计方法。对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维习惯。由于高层设计同器件无关,设计易于在各种集成电路工艺或可编程器件之间移植。(2)适合多个设计者同时进行设计。随着技术的不断进步,许多设计由一个设计者已无法完成,必须经过多个设计者分工协作完成一项设计的情况越来越多。在这种情况下,应用自顶向下的设计方法便于由多个设计者同时进行设计,对设计任务进行合理分配,用系统工程的方法对设计进行管理。针对具体的设计,实施自顶向下的设计方法的形式会有所不同,但均需遵循以下两条原则:逐层分解功能,分层次进行设计。同时,应在各个设计层次上,考虑相应的仿真验证问题。自己阅读采用自顶向下的设计方法有如下优点:自己阅读22第2章VerilogHDL语言2.1VerilogHDL设计模块的基本结构VerilogHDL程序设计由模块(module)构成的,设计模块的基本结构如图,一个完整的VerilogHDL设计模块包括端口定义、I/O声明、信号类型声明和功能描述4个部分。一、模块端口的定义模块端口定义用来声明电路设计模块的输入/输出端口,端口定义格式如下:module模块名(端口1,端口2,端口3,…);在端口定义的括号中,是设计电路模块与外界联系的全部输入/输出端口信号或引脚,是设计实体对外的一个通信界面,是外界可以看到的部分(不包含电源和接地端),多个端口之间用“,”分隔。例如1位全加器adder模块的端口定义为moduleadder(sum,cout,ina,inb,cin);模块名adder第2章VerilogHDL语言23二、模块内容模块内容包括I/O声明、信号类型声明和功能描述。(1)模块的I/O声明模块的I/O声明用来声明模块端口定义中各端口数据流动方向,包括输入(input)、输出(output)和双向(inout)。I/O声明格式如下:input端口1,端口2,端口3,…;//声明输入端口output端口1,端口2,端口3,…;//声明输出端口例如,1位全加器的I/O声明为inputina,inb,cin;outputsum,cout;二、模块内容24(2)信号类型声明信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数。信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)、和时间(time)等。(3)功能描述功能描述是VerilogHDL程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(instantiate)方式、always块语句、initial块语句等方法来实现,通常将设计模块描述的方法称为建模。(2)信号类型声明25①用assign语句建模

用assign语句建模的方法很简单,只需要在“assign”后面再加一个表达式。Assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。例1一位全加器的设计1位全加器的逻辑符号:sum是全加器的和输出端,cout是进位输出端,ina和inb是两个加数输入端,cin是低位进位输入端。①用assign语句建模26全加器的VerilogHDL源程序如下:

moduleadder1(sum,cout,ina,inb,cin);inputina,inb,cin;outputsum,cout;

assign{cout,sum}=ina+inb+cin;

endmodule“assign{cout,sum}=ina+inb+cin;”语句实现1位全加器的进位输出cout与和输出sum的建模。在语句表达式中,用拼接运算符“{}”将cout、sum这两个1位操作数拼接为一个2位操作数。全加器的VerilogHDL源程序如下:27②用元件例化(instantiate)方式建模元件例化方式建模是利用VerilogHDL提供的元件库实现的。例如,用与门例化元件定义一个三输入端与门可以写为andmyand3(y,a,b,c);and是VerilogHDL元件库中与门元件名,myand3是例化出的三输入端与门名,y是与门输出端,a、b、c是输入端。③用always块语句建模always块语句可以产生各种逻辑,常用于时序逻辑的功能描述。一个程序设计模块中,可以包含一个或多个always语句。程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。②用元件例化(instantiate)方式建模28例28位二进制加法计数器的设计8位二进制加法计数器的逻辑符号如图。OUT是8位二进制计数器的输出端(8位向量);COUT是进位输出端(1位);DATA是并行数据输入端(8位向量);LOAD是计数器的预置控制输入端,当LOAD=1时,OUT=DATA;CLK是时钟控制输入端,上升沿为有效边沿;CLR是同步复位输入端,当CLK的上升沿到来时且CLR=1,则计数器被复位,OUT=00000000。(逻辑符号图是由计算机对计数器电路的VerilogHDL源代码编译后产生的元件符号,图中的输入/输出标识符自动被改为大写,而源程序中的标识符都是小写。)例28位二进制加法计数器的设计(逻辑符号图是由计29

8位二进制加法计数器的VerilogHDL源程序如下:modulecnt8(out,cout,data,load,cin,clk,clr);input[7:0]data;inputload,cin,clk,clroutput[7:0]out;outputcout;reg[7:0]out;always@(posedgeclk)beginif(load)out=data;elseif(clr)out=’b00000000;elseout=out+1;endassigncout=&out;endmodule用always块语句实现8位二进制加法计数器的建模。@(posedgeclk)是时间控制敏感函数,表示clk上升沿到来的敏感时刻。每当clk的上升沿到来时,always块语句中的全部语句就执行一遍。“assigncout=&out;”语句产生进位输出cout,在语句中“&out”是与的缩减运算式,只有out中数字全为1时,结果才为1。8位二进制加法计数器的VerilogHDL源程序如30④用initial块语句建模Initial块语句与always语句类似,不过在程序中它只执行1次就结束了。Initial块语句的使用格式:

Initial

Begin语句1;语句2;:

end例3用Initial过程语句对测试变量赋值

initial

beginfor(addr=0;addr<size;addr=addr+1)memory[addr]=0;//对memory存储器进行初始化

end

④用initial块语句建模31从以上例子中可以看出VerilogHDL程序设计模块的基本结构:①VerilogHDL程序是由模块构成的。每个模块的内容都是嵌套在module和endmodule两语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。②每个模块首先要进行端口定义,并声明输入(input)、输出(output)或双向(inouts),然后对模块的功能进行逻辑描述。③VerilogHDL程序的书写格式自由,一行可以有一条或多条语句,一条语句也可以分为多行写。④除了end或以end开头的关键字(如endmodule)语句外,每条语句后必须要有分号“;”。⑤可以用/*……*/或//……对VerilogHDL程序的任何部分注释。一个完整的源程序都应当加上必要的注释,以加强程序的可读性。从以上例子中可以看出32

2.2VerilogHDL词法构成VerilogHDL的词法标识符包括:间隔符与注释符、操作符、数值常量、字符串、标识符和关键字。

(1)间隔符与注释符间隔符又称空白符,包括空格符、tab符号、换行符及换页符等。它们的作用是分隔其他词法标识符。在必要的地方插入间隔符可以增强源文件的可读性。但在字符串中空格符和tab符号(制表符)是有意义的字符。VerilogHDL有单行注释和多行段注释两种注释形式。单行注释以字符“//”起始,到本行结束;而段注释则以“/*”起始以“*/”结束,在段注释中不允许嵌套,段注释中单行注释标识符“//”没有任何特殊意义。

(2)操作符VerilogHDL中定义了操作符,又称运算符,按照操作数的个数,可以分为一元、二元和三元操作符;按功能可以大致分为算术操作符、逻辑操作符、比较操作符等几大类。2.2VerilogHDL词法构成33表1VerilogHDL的操作符及简要说明分类操作符及功能简要说明算术操作符+加-

减*

乘/除%整除二元操作符,即有两个操作数。操作数可以是物理数据类型,也可以是抽象数据类型。%是求余操作符,在两个整数相除基础上,取余数。例如,5%6的值是5;13%5余数3。

关系操作符>大于<小于>=大于等于<=小于等于==相等!=不相等===全等!==非全等关系运算是二元操作符,关系运算的结果是1位逻辑值。如果操作数之间的关系成立,返回值为1;关系不成立,则返回值为0。若某一个操作数的值不定,则关系是模糊的,返回值是不定值X。

相等与全等操作符的区别:相等运算两个操作数必须逐位相等,不定态和高阻态的比较结果为不定值。全等运算要求两个操作数完全一致。例如:A=8’b1101xx01B=8’b1101xx01则A==B运算结果为x(未知);A===B运算结果为1(真)。表1VerilogHDL的操作符及简要说明分类操作符34位操作符

~按位非&按位与|按位或^按位异或^~(~^)按位同或位运算是将两个操作数按对应位进行逻辑操作。“~”是一元操作符,其余都是二元操作符。将操作数按位进行逻辑运算。

例如:A=8’b11010001~A=8’B00101110B=8’b00011001A&B=8b’00010001分类操作符及功能简要说明逻辑操作符&&逻辑与||逻辑或!逻辑非&&和||为二元操作符;!为一元操作符,即只有一个操作数。缩减操作符&归约与~&归约与非|归约或~|归约或非^归约异或~^(^~)归约同或一元操作符,对操作数各位的值进行运算。如“&”是对操作数各位的值进行逻辑与运算,得到一个一位的结果值1或0。例如:A=8’b11010001则&A=0与缩减运算A中的数字全为1时,结果才为1。

|A=1或缩减运算A中的数字全为0时,结果才为0。位操作符~按位非位运算是将两个操作数按对应位进行逻辑操35分类操作符及功能简要说明移位操作符>>右移<<左移二元操作符,对左侧的操作数进行它右侧操作数指明的位数的移位,空出的位用0补全。例如:设A=8’b11010001

则A>>4结果A=8’b00001101而A<<4结果A=8’b00010000。条件操作符?:操作数=条件?表达式1:表达式2;当条件为真(值为1)时,操作数=表达式1;为假(值为0)时,操作数=表达式2。三元操作符,即条件操作符有三个操作数。例如a?b:c若条件操作数a是逻辑1,则算子返回表达式1操作数b;若a是逻辑0,则算子返回表达式2操作数c。并接操作符{,}

例如{a,{2{a,b}}}等价于{a,a,b,a,b}。

将1位全加器的进位cout和sum并接,表达式为将两个或两个以上用逗号分隔的表达式按位连接在一起。还可以用常数来指定重复的次数。{cout,sum}=ina+inb+cin;

分类操作符及功能简要说明移位操作符>>右移二元操作符36同其他高级语言类似,各类操作符号之间有优先级之分,如下表:优先级序号操作符操作符名称1!、~逻辑非、按位取反2*、/、%乘、除、求余3+、-加、减4<<、>>左移、右移5<、<=、>、>=小于、小于等于、大于、大于等于6==、!=、===、!==等于、不等于、全等、不全等7&、~&

缩减与、缩减与非8^、^~缩减异或、缩减同或9|、~|缩减或、缩减或非10&&逻辑与11||逻辑或12?:条件操作符列表顶部是最高优先级,底部是最低优先级。列在同一行中的操作符具有相同的优先级。所有操作符(?:除外)在表达式中都是从左向右结合的。圆括号()用于改变优先级或使得表达式中运算顺序更加清晰,提高源文件的可读性。同其他高级语言类似,各类操作符号之间有优先级之分,如下表:优37(3)数值常量VerilogHDL中的数值常量有整型和实型两大类,分为十进制、十六进制、八进制或二进制。若在前面加上一个正“+”或负“—”号就表示有符号数,否则所代表的就是无符号数。在数值常量的任意位置可以随意插入下划线“_”以提高可读性。常量定义格式为:parameter常量名1=表达式,常量名2=表达式,…,常量名n=表达式;parameter是常量定义关键字,常量名是用户定义的标识符,表达式为常量赋值。例如parameterVcc=5,fbus=8’b11010001;VerilogHDL中的整型数值常量就是整数,有两种书写格式:一种是无位宽的十进制表示法,如-132。第二种是定义位宽和进制的表示法,这种表示方法通常是无符号数。常数书写格式是:[size]’basevalue其中size是位宽,定义了数值常量的位数(长度);base代表这个数据的进制,取值范围和相应的进制如下表;value是一个数值常量的值,书写格式与进制base相对应。例如4’h6a8c,表示一个4位十六进制数。2’hf5等于8’b11110101;8’b1111xxxx等价2’hfx;

8’b1101zzzz等价2’hdz。(3)数值常量38VerilogHDL中的进制base进制代码取值对应的进制b或B二进制o或O八进制d或D十进制h或H十六进制

VerilogHDL中的实型数值常量就是浮点数,可以用十进制与科学计数法两种形式书写。如果采用十进制格式,小数点两边必须都有数字。VerilogHDL的编程最终是与硬件相对应的。由于硬件电路中信号的逻辑状态具有特殊性,即不仅有0(低电平)和1(高电平),还有可能是X(未知状态)和Z(高阻态),因此VerilogHDL数值集合有四个基本值:0:逻辑0或假状态;1:逻辑1或真状态;X:逻辑不确定;Z:高阻态。VerilogHDL中的进制base进制代码取值对应的进制39(4)字符串字符串是双引号“”括起来的字符序列,必须包含在同一行中,不能多行书写。在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列,即一个字符串中的每一个字符对应一个8位ASCII值。(5)标识符标识符是模块、寄存器、端口、连线、示例和begin-end块等元素的名称,是赋给对象的唯一的名称。标识符可以是字母、数字、$符和下划线“_”字符的任意组合序列。定义标识符规则:①首字符不能是数字,必须以字母或下划线“_”开头。②字符数不能多于1024。③标识符区分大小写。④不要与关键字同名。例如ina、inb、adder、adder8、name_adder是正确的,而1a?b是错误的。(6)关键字关键字是VerilogHDL预先定义的专用词。在IEEE标准——VerilogHDL1364-1995中规定了102个关键词,都采用小写形式。关键词有其特定和专有的语法作用,用户不能再对它们做新的定义。(4)字符串40关键字AlwaysandAssignattributeBeginBufBufif0Bufif1CaseCasexCasezCmosDeassignDefaultdefparamDisableedgeelseendendattributeendcaseendfunctionendmoduleendprimitiveendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highzlifinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenmosnornotnotif0notifloroutputparameterpmosposedgeprimitivepull0pull1pulldownpulluprcmosrealrealtimeregreleaserepeatrtraniflscalaredsignedsmallspecifyspecpramstrengthstrong0strong1supply0supply1tabletasktimetrantranif0tranif1tritri0tri1triandtriortritegunsignedvectoredwaitwandweak0weak1whilewireworxnorxor关键字Alwaysandelsehighzlnotiflrt41(7)变量变量是在程序运行时其值可以改变的量。在VerilogHDL中,变量分为网络型(netstype)和寄存器型(registertype)两种。①网络型变量nets型变量是输出值始终根据输入变化而更新的变量,一般用来定义硬件电路中的各种物理连线。VerilogHDL提供了多种nets型变量。常见的nets型变量及说明类型功能说明wire、tri连线类型(两者功能完全相同)wor、trior具有线或特性的连线(两者功能一致)wand、triand具有线与特性的连线(两者功能一致)tri1、tri0分别为上拉电阻和下拉电阻supply1、supply0分别为电源(逻辑1)和地(逻辑0)s1s2s3(7)变量类型功能说明wire、tri连线类型(两者42②寄存器型变量register型变量是用来描述硬件系统的基本数据对象。作为一种数值容器,可以容纳当前值,也可以保持历史值。与寄存器的记忆功能相对应,可以作为模块各器件间的信息传递通道。register型变量与wire型变量的区别在于register型变量需要被明确的赋值,并且在重新赋值前一直保持原值。register型变量是在always、initial等过程语句种定义,并通过过程语句赋值。常见的register型变量及说明类型功能说明reg常用的寄存器型变量integer32位带符号整数型变量real64位带符号实数型变量time无符号时间型变量②寄存器型变量类型功能说明reg常用的寄存器型变量i432.3VerilogHDL的语句VerilogHDL的语句包括赋值语句、条件语句、循环语句、结构声明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。(1)赋值语句在VerilogHDL中,赋值语句常用于描述硬件设计电路输出与输入之间的信息传送,改变输出结果。VerilogHDL有4种赋值方法:门基元、连续赋值、过程赋值和非阻塞赋值。①门基元赋值语句门基元赋值语句的格式为:基本逻辑门关键字(门输出,门输入1,门输入2,…,门输入n);例如4输入与非门的门基元赋值语句为

nand(y,a,b,c,d);//与语句assigny=~(a&b&c&d)等效2.3VerilogHDL的语句44②连续赋值语句连续赋值语句的关键字assign,赋值符号是“=”,赋值语句的格式为

assign赋值变量=表达式;例如assigny=~(a&b&c&d);连续赋值语句的“=”两边的变量都应该是wire型变量。在执行中,输出y的变化跟随输入a、b、c、d的变化而变化,反映了信息传送的连续性。连续赋值语句用于逻辑门和组合逻辑电路的描述。例1四输入端与非门的VerilogHDL源程序module

example1(y,a,b,c,d);outputy;inputa,b,c,d;assign#1y=~(a&b&c&d);

//#1表示输出与输入信号之间具有1个单位的时间延迟

endmodule②连续赋值语句45

③过程赋值语句过程赋值语句出现在initial和always块语句中,赋值符号是“=”,语句格式为:

赋值变量=表达式;过程赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在该语句结束时即可得到。如果一个块语句中包含若干条过程赋值语句,按顺序一条一条执行,前面的语句没完成,后面的语句就不能执行。因此,过程赋值语句也称为阻塞赋值语句。③过程赋值语句46

④非阻塞赋值语句非阻塞赋值语句也是出现在initial和always块语句中,赋值符号是“<=”,语句格式为:

赋值变量<=表达式;非阻塞赋值语句“<=”左边的赋值变量必须是(寄存器)reg型变量,其值在块语句结束时才可得到,与过程赋值语句不同。例如下面的块语句包含4条赋值语句

always@(posedgeclock)m=3;n=75;n<=m;r=n;语句执行结束后,r的值是75,而不是3,因为第3行是非阻塞赋值语句“n<=m”,该语句要等到本块语句结束时,n的值才能改变。块语句的“@(posedgeclock)”是定时控制敏感寒暑,表示时钟信号clock的上升沿到来的敏感时刻。例2上升沿触发的D触发器的VerilogHDL源程序

module

D_FF(q,d,clock);

inputd,clock;//属于wire型变量

outputq;//属于reg型变量

regq;always@(posedgeclock)q<=d;

endmodule④非阻塞赋值语句47

(2)条件语句条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。

①if语句完整的VerilogHDL的if语句结构如下:

if(表达式)begin语句;endelseif(表达式)begin语句;endelsebegin语句;end在if语句中,“表达式”是逻辑表达式或关系表达式,也可以是位宽为1位的变量。系统对表达式的值进行判断,若为0,x,z按“假”处理;若为1,按“真”处理,执行指定的语句。(2)条件语句48

例38线-3线优先编码器的设计8线-3线优先编码器的功能表

module

code(y,a);input[7:0]a;output[2:0]y;reg[2:0]y;always@(a)beginif(~a[7])y<=3’b111;elseif(~a[6])y<=3’b110;elseif(~a[5])y<=3’b101;elseif(~a[4])y<=3’b100;elseif(~a[3])y<=3’b011;elseif(~a[2])y<=3’b010;elseif(~a[1])y<=3’b001;elsey<=3’b000;end

endmodule输入输出in0in1in2in3in4in5in6in7out2out1out0xxxxxxx0xxxxxx01xxxxx011xxxx0111xxx01111xx011111x011111101111111111110101100011010001000例38线-3线优先编码器的设计输入输出in0in149

②case语句case语句是一种多分支的条件语句,case语句的格式为:

case(表达式)选择值1:语句1;选择值2:语句2;…选择值n:语句n;default:n+1

endcase执行case语句时,首先计算表达式的值,然后执行条件句中相应的“选择值”的语句。当所有的条件句的“选择值”与表达式的值不同时,则执行“default”后的语句。default可以省略。case语句多用于数字系统中的译码器、数据选择器、状态机及微处理器的指令译码器等电路的描述。②case语句50

例4:用case语句描述4选1数据选择器控制信号s1,s2有4种组合,控制a,b,c,d中的一个数据送到输出端。4选1数据选择器VerilogHDL的描述如下:

module

mux41(z,a,b,c,d,s1,s2);inputs1,s2;inputa,b,c,d;outputz;regz;always@(s1ors2)begincase({s1,s2})2’b00:z=a;2’b01:z=b;2’b10:z=c;2’b11:z=d;endcaseend

endmodulecase语句还有两种变体形式,casez和casex语句。与case语句的区别是不考虑语句中的高阻z和未知x的那些位,只关注其他位的比较结果。s1s2z00011011abcd4选1数据选择器功能表例4:用case语句描述4选1数据选择器s1s2z51

(3)循环语句循环语句包含for语句、repeat语句、while语句和forever语句4种。

①for语句for语句的格式为:

for(循环指针=初值;循环指针<终值;循环指针=循环指针+步长值)

begin语句;endfor语句可以是一组语句重复执行,语句中的参数一般属于整型变量或常量。语句重复执行的次数由语句中的参数确定。即

循环重复次数=(终值-初值)/步长值(3)循环语句52

例5:8位奇偶校验器的描述用a表示输入信号,长度为8位的向量。在程序中,用for语句对a的值,逐位进行模2加运算(即异或XOR),循环指针变量n控制模2加的次数。11100110奇数个1循环变量的初值为0,终值为8,因此,控制循环共执行了8次。例5用VerilogHDL对8位奇偶校验器的描述如下:

module

test8(a,out);input[7:0]a;outputout;regout;integern;always@(a)beginout=0;for(n=0;n<8;n=n+1)out=out^a[n];//异或end

endmodule例5:8位奇偶校验器的描述53

②repeat语句repeat语句的语法格式为:

repeat(循环次数表达式)语句;例6用repeat语句实现8位奇偶校验器的描述如下:

module

test8_1(a,out);parametersize=7;input[7:0]a;outputout;regout;integern;always@(a)beginout=0;n=0;repeat(size)beginout=out^a[n];n=n+1;endend

endmodule//MAX+plusII软件不支持repeat语句,但synplify软件支持。②repeat语句54

③while语句while语句的语法格式为:

while(循环执行条件表达式)begin重复执行语句;修改循环条件语句;endwhile语句在执行时,首先判断循环执行条件表达式是否为真。若为真,则执行其后面的语句;若为假,则不执行,表示循环结束。为了使语句能够结束,在循环执行的语句中必须包含一条能改变循环条件的语句。

④forever语句forever语句的语法格式为:

foreverbegin语句;endforever是一种无穷循环控制语句,它不断地执行其后的语句或语句块,永远不会结束。Forever语句常用来产生周期性的波形,作为仿真激励信号。例如产生时钟clk的语句为:

#10forever#10clk=!clk;//#10表示输出与输入信号之间具有10个单位的时间延迟,!clk取非③while语句55

(4)结构声明语句VerilogHDL的任何过程模块都是放在结构声明语句中,结构声明语句包括always、initial、task和function等4种结构。

①always块语句在一个VerilogHDL模块(module)中,always块语句的使用次数是不受限制的,块内的语句也是不断重复执行的。always块语句的语法结构为:always@()begin//过程赋值语句;//if语句,case语句;//for语句,while语句,repeat语句;//task语句、function语句;end在always块语句中,敏感信号表达式应该列出影响块内取值的所有信号(指设计电路的输入信号),多个信号之间用“or”连接。当表达式中任何信号发生变化时,就会执行一遍块内的语句。块内语句可以包括:过程赋值、if、case、for、while、repeat、task和function等语句。在进行时序逻辑电路的描述中,敏感信号表达式中经常使用“posedge”和“negedge”这两个关键字来声明事件是由输入信号的正边沿(上升沿)或负边沿(下降沿)触发的。如“always@(posedgeclk)”表示模块的事件是由clk的上升沿触发的;而“always@(negedgeclk)”表示模块的事件是由clk的下降沿触发的。(4)结构声明语句56

②initial语句initial语句的语法格式为:

initialbegin语句1;语句2;…;endinitial语句的使用次数是不受限制的,但块内的语句仅执行一次,因此initial语句常用于仿真中的初始化。②initial语句57

③task语句在VerilogHDL模块中,task语句用来定义任务。任务类似高级语言中的子程序,用来单独完成某项具体任务,并可以被模块或其他任务调用。利用任务可以把一个大的程序模块分解成为若干小的任务,使程序清晰易懂。可以被调用的任务必须事先用task语句定义,定义格式如下:

task

任务名;

端口声明语句;类型声明语句;begin语句end

endtask任务定义与模块(module)定义的格式相同,区别在于任务是用task-endtask语句来定义,而且没有端口名列表。例如,8位加法器的任务定义如下:

task

adder8output[7:0]sum;outputcout;input[7:0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;

endtask③task语句58任务调用的格式如下:

任务名(端口名列表);例如8位加法器任务调用

adder8(tsum,tcout,tina,tinb);使用任务时,需要注意几点:(1)任务的定义和调用必须在同一个module模块内。(2)定义任务时,没有端口名列表,但要进行端口和数据的声明。(3)当任务调用时,任务被激活。任务调用与模块调用一样,通过任务名实现,调用时需列出端口名列表,端口名和类型必须与任务定义的排序和类型一致。例如8位加法器任务调用时的端口名列表中的tsum、tcout、tina、tinb端口,与任务定义中的端口sum、cout、ina、inb排序和类型保持一致。(4)一个任务可以调用别的任务或函数,可调用的任务和函数的个数不受限制。任务调用的格式如下:59

④function语句在VerilogHDL模块中,function语句用来定义函数。函数类似高级语言中的函数,用来单独完成某项具体操作,并可以作为表达式中的一个操作数,被模块或任务及其他函数调用,函数调用时返回一个用于表达式的值。可以被调用的函数必须事先定义,函数定义格式如下:

function[最高有效位:最低有效位]函数名;端口声明语句;类型声明语句;begin语句;end

endfunction在函数定义语句中,“[最高有效位:最低有效位]”是函数调用返回值位宽或类型声明。④function语句60

例8求最大值的函数

function[7:0]max;input[7:0]a,b;beginif(a>=b)max=a;elsemax=b;end

endfunction函数调用的格式如下

函数名(关联参数表);函数调用一般是出现在模块、任务或函数语句中。通过函数的调用来完成摹写数据的运算或转换。例如,调用上例中求最大值函数的语句为

peak<=max(data,peak);其中,data和peak是与函数定义的两个参数a、b相关联的关联参数。通过函数的调用,求出data和peak中的最大值,并用函数名max返回。例8求最大值的函数61

函数和任务存在以下几处区别:(1)任务可以有任意不同类型输入/输出参数,函数不能将inout类型作为输出。(2)任务只可以在过程语句中调用,不能在连续赋值语句assign中调用;函数可以作为表达式中的一个操作数,在过程赋值语句和连续赋值语句中调用。(3)任务可以调用其他任务或函数;函数可以调用其他函数,但不能调用任务。(4)任务不向表达式返回值,函数向调用它的表达式返回一个值。函数和任务存在以下几处区别:62(5)语句的顺序执行与并行执行VerilogHDL中有顺序执行语句和并行执行语句之分。always块语句中的语句顺序语句,按照程序书写的顺序执行。always块本身确是并行语句,它与其他always语句及assign语句、例化元件语句都是同时(即并行)的。例9同步清除十进制加法计数器的描述同步清0是在时钟信号作用下,计数器的状态被clr清0,清0信号clr高电平有效;时钟信号clk上升沿触发。计数器计数状态从4’b0000到4’b1001循环。modulecnt10(clr,clk,cnt,out);inputclr,clk;output[3:0]out;outputcnt;regcnt;reg[3:0]out;always@(posedgeclk)

beginif(clr)

begincnt=0;out=4’b0000;endelseif(out==4’b1001)

beginout=4’b0000;cnt=1;endelse

begincnt=0;out=out+1;endendendmodule

(5)语句的顺序执行与并行执行modulecnt10(c63

2.4.不同抽象级别的VerilogHDL模型VerilogHDL具有行为描述和结构描述功能。行为描述是对设计电路的逻辑动能的描述,并不关心设计电路使用哪些元件及这些元件之间的连接关系。行为描述属于高层次的描述方法,在VerilogHDL中,行为描述包括系统级(SystemLevel)、算法级(AlgorithmLevel)和寄存器传输级(RTL:RegisterThansferLevel)等3种抽象级别。结构描述是对设计电路的结构进行描述,既描述设计电路使用的元件及这些元件之间的连接关系。结构描述属于低层次的描述方法,在VerilogHDL,结构描述包括门级(GateLevel)和开关级(SwitchLevel)两种抽象级别。应重点掌握高层次描述方法,结构描述也可以用来实现电路的系统设计。2.4.不同抽象级别的VerilogHDL模型64

(1)VerilogHDL门级描述方式VerilogHDL提供了丰富的门类型关键字,用于门级的描述。常用的:

not非门、and与门、nand与非门、or或门、nor或非门、xor异或门、xnor同或门、buf缓冲器、及bufif1、bufif0、notif1、notif0各种三态门。门级描述语句格式为

门类型关键字<例化门的名称>(端口列表);其中,“例化门的名称”是用户定义的标识符,属可选项;端口列表按:(输出、输入,使能控制端)的顺序列出。例如:

nandnand2(y,a,b);//二输入端与非门

xormyxor(y,a,b)//异或门

bufif0mybuf(y,a,en);//低电平使能的三态缓冲器(1)VerilogHDL门级描述方式65例10采用结构描述方式描述硬件电路moduleexample_4_11(y,a,b,c);inputa,b,c;outputy;wires1,s2,s3;not(s1,a);nand(s2,c,s1);nand(s3,a,b);nand(y,s2,s3);endmodule例10采用结构描述方式描述硬件电路66

(2)VerilogHDL行为级描述VerilogHDL行为描述方式是通过行为语句来描述电路要实现的功能,表示输入输出间转换的行为,不涉及具体结构。行为建模是一种“高级”的描述方式。行为描述既可以描述简单的逻辑门,又可以描述复杂的数字系统,乃至微处理器。既可以描述组合逻辑电路,又可以描述时序逻辑电路。例112选1数据选择器,用VerilogHDL对它做行为描述。

module

mux_2_to_1(a,b,out,outbar,sel);

//这是一个2选1数据选择器,名为mux_2_to_1

inputa,b,sel;//定义模块的输入端口为a,b和sel

outputout,outbar;//定义模块的输出端口为out和outbar

assignout=sel?a:b;//如果sel=1,将a赋值给out//如果sel=0,将b赋值给out

assignoutbar=~out;//将out取反后赋值给outbar

endmodule//模块描述结束(2)VerilogHDL行为级描述module67作业365计数器和计数译码显示电路的编程,MAX+plusII仿真。作业365计数器和计数译码显示电路的编程,MAX+plu68

例123线-8线译码器的VerilogHDL设计moduledecode3_8(a,b,c,y,en);

//这是一个3线-8线译码器,名为decode3_8inputa,b,c,en;//定义模块的输入端口output[7:0]y;//定义模块的输出端口为outreg[7:0]y;always@(enoraorborc)beginif(en)y=8’b11111111;elsebegincase({c,b,a})3’b000:y<=8’b11111110;3’b001:y<=8’b11111101;3’b010:y<=8’b11111011;3’b011:y<=8’b11110111;3’b100:y<=8’b11101111;3’b101:y<=8’b11011111;3’b110:y<=8’b10111111;3’b111:y<=8’b01111111;endcaseendendendmodule//模块描述结束例123线-8线译码器的VerilogHDL设计69例138D锁存器的设计moduleD_8(d,q,en);output[7:0]q;inputen;input[7:0]d;reg[7:0]q;always@(enord)beginif(~en)q=q;elseq=d;endendmodule例138D锁存器的设计70

例14异步清除十进制加法计数器的描述异步清除是指复位信号有效时,计数器立即被清零,不考虑时钟。复位信号clr,高电平有效;时钟信号clk,上升沿触发;当clr=1,计数器清0。clr=0时,计数器正常计数。modulecnt10a(clr,clk,cnt,out);

//模块名称和端口名

inputclr,clk;output[3:0]out;outputcnt;reg[3:0]out;regcnt;always@(posedgeclkorposedgeclr)beginif(clr)beginout=4’b0000;cnt=0;endelseif(out==4’b1001)beginout=4’b0000;cnt=1;endelsebegincnt=0;out=out+1;endendendmodule例14异步清除十进制加法计数器的描述71(3)用结构描述实现电路系统设计任何用VerilogHDL描述的电路设计模块(module),均可用模块例化语句,例化一个元件,来实现电路系统的设计。模块例化语句格式与逻辑门例化语句格式相同,具体格式:

设计模块名<例化电路名>(端口列表);其中,“例化电路名”是用户为系统设计定义的标识符,相当于系统电路板上为插入设计模块元件的插座,而端口列表相当于插座上引脚名表,应与设计模块的输入/输出端口一一对应。用模块例化方式设计8位计数译码器电路系统。在8位计数译码系统电路设计中,需要事先设计一个4位二进制加法计数器cnt4e模块和一个七段数码显示器的译码器Dec7s模块,然后用例化方式将这两种模块组成计数译码系统电路。(3)用结构描述实现电路系统设计72

例154位二进制加法计数器的设计4位二进制加法计数器的符号如图,CLK是时钟输入端;CLR复位控制输入端,当CLR=1时计数器被复位,输出Q[3..0]=0000;ENA是使能控制输入端,当ENA=1时,计数器才能工作;COUT是进位输出端,当输出Q[3..0]=1111时,COUT=1。modulecnt4e(clk,clr,ena,cout,q);inputclk,clr,ena;output[3:0]q;outputcout;reg[3:0]q;always@(posedgeclrorposedgeclk)beginif(clr)q=’b0000;elseif(ena)q=q+1;endassigncout=&q;endmodule例154位二进制加法计数器的设计73例16七段数码显示器的译码器

Dec7s的元件符号如图A[3..0]是4数据输入端,将接至cnt4e的输出端Q[3..0];Q[7..0]是译码器的输出端,提供七段数码显示数据。moduleDec7s(a,q);output[7:0]q;input[3:0]a;reg[7:0]q;always@(a)

begincase(a)0:q=8'b00111111;1:q=8'b00000110;2:q=8'b01011011;3:q=8'b01001111;4:q=8'b01100110;5:q=8'b01101101;6:q=8'b01111101;7:q=8'b00000111;8:q=8'b01111111;9:q=8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论