【PPT】-电路计算机辅助设计.ppt

上传人:本田雅阁 文档编号:3102506 上传时间:2019-07-08 格式:PPT 页数:107 大小:1.26MB
返回 下载 相关 举报
【PPT】-电路计算机辅助设计.ppt_第1页
第1页 / 共107页
【PPT】-电路计算机辅助设计.ppt_第2页
第2页 / 共107页
【PPT】-电路计算机辅助设计.ppt_第3页
第3页 / 共107页
【PPT】-电路计算机辅助设计.ppt_第4页
第4页 / 共107页
【PPT】-电路计算机辅助设计.ppt_第5页
第5页 / 共107页
点击查看更多>>
资源描述

《【PPT】-电路计算机辅助设计.ppt》由会员分享,可在线阅读,更多相关《【PPT】-电路计算机辅助设计.ppt(107页珍藏版)》请在三一文库上搜索。

1、电路计算机辅助设计,吉林大学通信工程学院 高燕梅,教学内容与要求,第1章 EDA技术简介 第2章 Verilog HDL语言编程 (10学时) 第3章 VHDL语言编程(4学时) 第4章 MATLAB程序入门 (12学时) 第5章 MATLAB在电路中的应用(4学时) 每章有实验室上机实验 实验教学,成绩评定标准,五级分制 作业加上机考核: 1、作业必做,上机交作业时随机考两个问题。 2、点名没有缺勤,加分。,第1章 EDA技术简介 1.1 EDA技术的主要内容 1.2 EDA软件系统的构成 1.3 EDA的工程设计流程 1.4 数字系统的设计方法,第2章 Verilog HDL语言编程 2

2、.1 Verilog HDL设计模块的基本结构 2.2 Verilog HDL词法构成 2.3 Verilog HDL的语句 2.4 Verilog HDL模型 2.5 Verilog HDL设计电路流程 2.6 用Verilog HDL描述逻辑电路的实例,第3章 VHDL 语言编程基础 3.1 概述 3.2 VHDL程序基本结构 3.3 VHDL语言要素 3.4 VHDL顺序语句 3.5 VHDL并行语句 3.6 子程序(SUBPROGRAM) 3.7 库、程序包及其他 3.8 VHDL描述风格 3.9 基本逻辑电路设计 3.10 状态机的VHDL设计,第4章 MATLAB程序入门 4.1基

3、本语法 4.1.1 变量及其赋值 4.4.2 矩阵的初等运算 4.1.3 元素群运算 4.1.4 逻辑判断及流程控制 4.2 基本绘图方法 4.2.1 M文件及程序调试 4.2.2 MATLAB的开发环境和工具 第5章 MATLAB在电路中的应用 5.1 电阻电路和动态电路 5.2 正弦稳态电路和频率响应 5.3 二端口电路 5.4 滤波器,第1章 EDA技术简介 1.1 EDA技术的主要内容 EDA是电子设计自动化(Electronic Design Automation)的缩写。 EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完

4、成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。 EDA技术的出现,极大地提高了电路设计的效率和可靠性,减轻了设计者的劳动强度。 在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。 CPLD、FPGA器件可以通过软件编程而对硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。促进了EDA技术的迅速发展。,EDA技术涉及面广,内容丰富,主要应掌握如下四个方面的内容: 大规模可编程逻辑器件,大规模可编程逻辑器件是利用EDA技术进行电子

5、系统设计的载体。 FPGA和CPLD 硬件描述语言,硬件描述语言是利用EDA技术进行电子系统设计的主要表达手段。VHDL、Verilog、ABEL 软件开发工具,软件开发工具是利用EDA技术进行电子系统设计的智能化的自动化设计工具。 Altera的MAX+plus II、Lattice的ispEXPERT、Xilinx的Foundation Series。 实验开发系统,实验开发系统则是利用EDA技术进行电子系统设计的下载工具及硬件验证工具。,1 大规模可编程逻辑器件 可编程逻辑器件(简称PLD)是一种由用户编程以实现某种逻辑功能的新型逻辑器件。 FPGA是现场可编程门阵列的简称, CPLD是

6、复杂可编程逻辑器件的简称。 高集成度、高速度和高可靠性是FPGA/CPLD最明显的特点,其时钟延时可小至ns级,结合其并行工作方式,在超高速应用领域和实时测控方面有着非常广阔的应用前景。 FPGA/CPLD的高可靠性还表现在几乎可将整个系统下载于同一芯片中,实现所谓片上系统,从而大大缩小了体积,易于管理和屏蔽。,2 硬件描述语言(HDL) 常用的硬件描述语言有VHDL、Verilog、ABEL。 VHDL:作为IEEE的工业标准硬件描述语言,在电子工程领域,已成为事实上的通用硬件描述语言。 Verilog:支持的EDA工具较多,适用于RTL级(寄存器转换级)和门电路级的描述,其综合过程较VHD

7、L稍简单,但其在高级描述方面不如VHDL。 有专家认为,在新世纪中,VHDL与Verilog语言将承担几乎全部的数字系统设计任务。,3 软件开发工具 目前比较流行的、主流厂家的EDA的软件工具有: Altera的MAX+plus II、升级版Quartus II; Lattice的ispEXPERT; Xilinx的Foundation Series。 MAX+plus II是Altera公司开发的EDA工具软件。Altera公司是世界上最大的可编程逻辑器件供应商之一。MAX+plus II软件是一个集成化的可编程逻辑器件开发环境,设计者能在这个环境下进行逻辑设计,完成设计文件的输入编辑、编译

8、、仿真、综合、布局布线和编程下载等设计工作。软件界面友好、方便易学、功能全面,是非常流行的大众化EDA平台。,MAX+plus II:支持原理图、VHDL和Verilog语言文本文件,以及以波形与EDIF等格式的文件作为设计输入,并支持这些文件的任意混合设计。 它具有门级仿真器,可以进行功能仿真和时序仿真,能够产生精确的仿真结果。 在适配之后,MAX+plus II生成供时序仿真用的EDIF、VHDL和Verilog这三种不同格式的网表文件。 它界面友好,使用便捷,被誉为业界最易学易用的EDA的软件 ,并支持主流的第三方EDA工具,支持所有Altera公司的FPGA/CPLD大规模逻辑器件。,

9、4 实验开发系统 提供芯片下载电路及EDA实验/开发的外围资源(类似于用于单片机开发的仿真器),供硬件验证用。一般包括: 实验或开发所需的各类基本信号发生模块,包括时钟、脉冲、高低电平等; FPGA/CPLD输出信息显示模块,包括数码显示、发光管显示、声响指示等; 监控程序模块,提供“电路重构软配置”; 目标芯片适配座以及上面的FPGA/CPLD目标芯片和编程下载电路。,自己阅读,1.2 EDA软件系统的构成 EDA技术研究的对象是电子设计的全过程,有系统级、电路级和物理级3个层次的设计。 涉及的电子系统从低频、高频到微波,从线性到非线性,从模拟到数字,从通用集成电路到专用集成电路构造的电子系

10、统,因此EDA技术研究的范畴相当广泛。 EDA软件系统应当包含以下子模块: 设计输入子模块、 设计数据库子模块、 分析验证子模块、 综合仿真子模块、 布局布线子模块等。,自己阅读,(1) 设计输入子模块;用户编辑输入模块的设计描述,并进行语义正确性、语法规则的检查,检查通过后,将用户的设计描述数据转换为EDA软件系统的内部数据格式,存入设计数据库被其他子模块调用。 设计输入子模块不仅能接受图形描述输入、硬件描述语言(HDL)描述输入,还能接受图文混合描述输入。 该子模块一般包含针对不同描述方式的编辑器,如图形编辑器、文本编辑器等,同时包含对应的分析器。,自己阅读,(2)设计数据库子模块:该模块

11、存放系统提供的库单元以及用户的设计描述和中间设计结果。 (3) 分析验证子模块:该模块包括各个层次的模拟验证、设计规则的检查、故障诊断等。 (4) 综合仿真子模块:该模块包括各个层次的综合工具,理想的情况是:从高层次到低层次的综合仿真全部由EDA工具自动实现。 (5) 布局布线子模块:该模块实现由逻辑设计到物理实现的映射,因此与物理实现的方式密切相关。例如,最终的物理实现可以是门阵列、可编程逻辑器件等,由于对应的器件不同,因此各自的布局布线工具会有很大的差异。,自己阅读,1.3 EDA的工程设计流程 1 源程序的编辑和编译 利用EDA技术进行一项工程设计,首先需利用EDA工具的文本编辑器或图形

12、编辑器将它用文本方式或图形方式表达出来,进行排错编译,变成Verilog、VHDL文件格式,为进一步的逻辑综合作准备。 常用的源程序输入方式有三种。 (1) 原理图输入方式:利用EDA工具提供的图形编辑器以原理图的方式进行输入。原理图输入方式比较容易掌握,直观且方便,所画的电路原理图与传统的器件连接方式完全一样,很容易被人接受,而且编辑器中有许多现成的单元器件可以利用,自己也可以根据需要设计元件。,(2) 状态图输入方式:以图形的方式表示状态图进行输入。当填好时钟信号名、状态转换条件、状态机类型等要素后,就可以自动生成VHDL程序。这种设计方式简化了状态机的设计,比较流行。 (3) Veril

13、og、VHDL软件程序的文本方式:最一般化、最具普遍性的输入方法,任何支持VHDL的EDA工具都支持文本方式的编辑和编译。,2 逻辑综合和优化 将VHDL的软件设计与硬件的可实现性挂钩,需要利用EDA软件系统的综合器进行逻辑综合。 综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形的描述,针对给定硬件结构组件进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述文件。 综合器工作前,必须给定最后实现的硬件结构参数,它的功能就是将软件描述与给定硬件结构用某种网表文件的方式联系起来。 综合器是软件描述与硬件实现的一座桥梁。综合过程就是将电路的高级语言描

14、述转换成低级的,可与FPGA/CPLD或构成ASIC的门阵列基本结构相映射的网表文件。,自己阅读,1.4数字系统的设计方法 数字系统设计有多种方法,如模块设计法、自顶向下设计法和自底向上设计法等。 数字系统的设计一般采用自顶向下、由粗到细、逐步求精的方法。 自顶向下是指将数字系统的整体逐步分解为各个子系统和模块,若子系统规模较大,则还需将子系统进一步分解为更小的子系统和模块,层层分解,直至整个系统中各子系统关系合理,并便于逻辑电路级的设计和实现为止。 采用该方法设计时,高层设计进行功能和接口描述,说明模块的功能和接口,模块功能的更详细的描述在下一设计层次说明,最底层的设计才涉及具体的寄存器和逻

15、辑门电路等实现方式的描述。,采用自顶向下的设计方法有如下优点: (1) 自顶向下设计方法是一种模块化设计方法。对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维习惯。由于高层设计同器件无关,设计易于在各种集成电路工艺或可编程器件之间移植。 (2) 适合多个设计者同时进行设计。随着技术的不断进步,许多设计由一个设计者已无法完成,必须经过多个设计者分工协作完成一项设计的情况越来越多。在这种情况下,应用自顶向下的设计方法便于由多个设计者同时进行设计,对设计任务进行合理分配,用系统工程的方法对设计进行管理。 针对具体的设计,实施自顶向下的设计方法的形式会有所不同,但均需遵循以下两条原则:逐层分解

16、功能,分层次进行设计。同时,应在各个设计层次上,考虑相应的仿真验证问题。,自己阅读,第2章 Verilog HDL语言 2.1 Verilog HDL设计模块的基本结构 Verilog HDL程序设计由模块(module)构成的, 设计模块的基本结构如图,一个完整的Verilog HDL设计模块包括端口定义、I/O声明、信号类型声明和功能描述4个部分。 一、模块端口的定义 模块端口定义用来声明电路设计模块 的输入/输出端口,端口定义格式如下: module 模块名 (端口1,端口2,端口3,); 在端口定义的括号中,是设计电路模块与外界联系的全部输入/输出端口信号或引脚,是设计实体对外的一个通

17、信界面,是外界可以看到的部分(不包含电源和接地端),多个端口之间用“,”分隔。例如1位全加器adder模块的端口定义为 module adder (sum, cout, ina, inb, cin); 模块名adder,二、模块内容 模块内容包括I/O声明、信号类型声明和功能描述。 (1)模块的I/O声明 模块的I/O声明用来声明模块端口定义中各端口数据流动方向,包括输入(input)、输出(output)和双向(inout)。I/O声明格式如下: input 端口1,端口2,端口3,; /声明输入端口 output 端口1,端口2,端口3,;/声明输出端口 例如,1位全加器的I/O声明为 i

18、nput ina, inb, cin; output sum, cout;,(2)信号类型声明 信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数。信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)、和时间(time)等。 (3)功能描述 功能描述是Verilog HDL程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(instantiate)方式、always块语句、initial块语句等方法来实现,通常将设计模块描述的方法称为建模。

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

20、ndmodule “assign cout, sum = ina+inb+cin;”语句实现1位全加器的进位输出cout与和输出sum的建模。 在语句表达式中,用拼接运算符“”将cout、sum这两个1位操作数拼接为一个2位操作数。,用元件例化(instantiate)方式建模 元件例化方式建模是利用Verilog HDL提供的元件库实现的。例如,用与门例化元件定义一个三输入端与门可以写为 and myand3(y,a,b,c); and是Verilog HDL元件库中与门元件名,myand3是例化出的三输入端与门名,y是与门输出端,a、b、c是输入端。 用always块语句建模 always

21、块语句可以产生各种逻辑,常用于时序逻辑的功能描述。一个程序设计模块中,可以包含一个或多个always语句。程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。,例2 8位二进制加法计数器的设计 8位二进制加法计数器的逻辑符号如图。 OUT是8位二进制计数器的输出端(8位向量); COUT是进位输出端(1位); DATA是并行数据输入端(8位向量); LOAD是计数器的预置控制输入端, 当LOAD=1时,OUT=DATA; CLK是时钟控制输入端,上升沿为有效边沿; CLR是同步复位输入端,当CLK的上升沿到来时且CLR=1,则计数器被复位,OUT=00000000。,(逻辑符

22、号图是由计算机对计数器电路的Verilog HDL源代码编译后产生的元件符号,图中的输入/输出标识符自动被改为大写,而源程序中的标识符都是小写。),8位二进制加法计数器的Verilog HDL 源程序如下: module cnt8 (out, cout,data,load,cin,clk, clr); input 7:0 data; input load, cin, clk, clr output 7:0 out; output cout; reg 7:0 out; always (posedge clk) begin if (load) out=data; else if(clr) out=

23、b00000000; else out=out+1; end assign cout = ”语句产生进位输出cout,在语句中“&out”是与的缩减运算式,只有out中数字全为1时,结果才为1。,用initial块语句建模 Initial块语句与always语句类似,不过在程序中它只执行1次就结束了。 Initial块语句的使用格式 : Initial Begin 语句1; 语句2; : end 例3 用Initial过程语句对测试变量赋值 initial begin for(addr=0; addrsize; addr=addr+1) memoryaddr=0; /对memory存储器进行初

24、始化 end,从以上例子中可以看出 Verilog HDL程序设计模块的基本结构: Verilog HDL程序是由模块构成的。每个模块的内容都是嵌套在module和endmodule两语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。 每个模块首先要进行端口定义,并声明输入(input)、输出(output)或双向(inouts),然后对模块的功能进行逻辑描述。 Verilog HDL程序的书写格式自由,一行可以有一条或多条语句,一条语句也可以分为多行写。 除了end或以end开头的关键字(如endmodule)语句外,每条语句后必须要有分号“;”。 可以用/*/或/对Verilog

25、 HDL程序的任何部分注释。一个完整的源程序都应当加上必要的注释,以加强程序的可读性。,2.2 Verilog HDL词法构成 Verilog HDL的词法标识符包括:间隔符与注释符、操作符、数值常量、字符串、标识符和关键字。 (1)间隔符与注释符 间隔符又称空白符,包括空格符、tab符号、换行符及换页符等。它们的作用是分隔其他词法标识符。在必要的地方插入间隔符可以增强源文件的可读性。但在字符串中空格符和tab符号(制表符)是有意义的字符。 Verilog HDL 有单行注释和多行段注释两种注释形式。单行注释以字符“/”起始,到本行结束;而段注释则以“/*”起始以“*/”结束,在段注释中不允许

26、嵌套,段注释中单行注释标识符“/”没有任何特殊意义。 (2)操作符 Verilog HDL 中定义了操作符,又称运算符,按照操作数的个数,可以分为一元、二元和三元操作符;按功能可以大致分为算术操作符、逻辑操作符、比较操作符等几大类。,表1 Verilog HDL 的操作符及简要说明,同其他高级语言类似,各类操作符号之间有优先级之分,如下表:,列表顶部是最高优先级,底部是最低优先级。列在同一行中的操作符具有相同的优先级。所有操作符(?:除外)在表达式中都是从左向右结合的。圆括号()用于改变优先级或使得表达式中运算顺序更加清晰,提高源文件的可读性。,(3)数值常量 Verilog HDL中的数值常

27、量有整型和实型两大类,分为十进制、十六进制、八进制或二进制。若在前面加上一个正“+”或负“”号就表示有符号数,否则所代表的就是无符号数。在数值常量的任意位置可以随意插入下划线“_”以提高可读性。 常量定义格式为: parameter 常量名1=表达式,常量名2=表达式,常量名n=表达式; parameter是常量定义关键字,常量名是用户定义的标识符,表达式为常量赋值。 例如 parameter Vcc=5, fbus=8b11010001; Verilog HDL中的整型数值常量就是整数,有两种书写格式:一种是无位宽的十进制表示法,如-132。第二种是定义位宽和进制的表示法,这种表示方法通常是

28、无符号数。 常数书写格式是: sizebase value 其中size是位宽,定义了数值常量的位数(长度);base 代表这个数据的进制,取值范围和相应的进制如下表;value是一个数值常量的值,书写格式与进制base相对应。 例如 4h6a8c,表示一个4位十六进制数。 2hf5 等于8b11110101; 8b1111xxxx 等价2hfx; 8b1101zzzz 等价2hdz。,Verilog HDL中的进制,Verilog HDL中的实型数值常量就是浮点数,可以用十进制与科学计数法两种形式书写。如果采用十进制格式,小数点两边必须都有数字。 Verilog HDL的编程最终是与硬件相对

29、应的。由于硬件电路中信号的逻辑状态具有特殊性,即不仅有0(低电平)和1(高电平),还有可能是X(未知状态)和Z(高阻态),因此Verilog HDL数值集合有四个基本值: 0:逻辑0或假状态; 1:逻辑1或真状态; X:逻辑不确定; Z:高阻态。,(4)字符串 字符串是双引号“”括起来的字符序列,必须包含在同 一行中,不能多行书写。在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列,即一个字符串中的每一个字符对应一个8位ASCII值。 (5)标识符 标识符是模块、寄存器、端口、连线、示例和begin-end块等元素的名称,是赋给对象的唯一的名称。标识符可以是字母、数字、$符和下划线“

30、_”字符的任意组合序列。 定义标识符规则: 首字符不能是数字,必须以字母或下划线“_”开头。 字符数不能多于1024。 标识符区分大小写。 不要与关键字同名。 例如 ina、inb、adder、adder8、name_adder是正确的,而1a ?b是错误的。 (6)关键字 关键字是Verilog HDL预先定义的专用词。在IEEE标准Verilog HDL 1364-1995中规定了102个关键词,都采用小写形式。关键词有其特定和专有的语法作用,用户不能再对它们做新的定义。,关键字,(7)变量 变量是在程序运行时其值可以改变的量。在Verilog HDL中,变量分为网络型(nets type

31、)和寄存器型(register type)两种。 网络型变量 nets型变量是输出值始终根据输入变化而更新的变量,一般用来定义硬件电路中的各种物理连线。Verilog HDL提供了多种nets型变量。 常见的nets型变量及说明,s1,s2,s3,寄存器型变量 register型变量是用来描述硬件系统的基本数据对象。作为一种数值容器,可以容纳当前值,也可以保持历史值。与寄存器的记忆功能相对应,可以作为模块各器件间的信息传递通道。 register型变量与wire型变量的区别在于register型变量需要被明确的赋值, 并且在重新赋值前一直保持原值。register型变量是在always、ini

32、tial等过程语句种定义,并通过过程语句赋值。 常见的register型变量及说明,2.3 Verilog HDL的语句 Verilog HDL的语句包括赋值语句、条件语句、循环语句、结构声明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。 (1)赋值语句 在Verilog HDL中,赋值语句常用于描述硬件设计电路输出与输入之间的信息传送,改变输出结果。Verilog HDL有4种赋值方法:门基元、连续赋值、过程赋值和非阻塞赋值。 门基元赋值语句 门基元赋值语句的格式为: 基本逻辑门关键字 (门输出,门输入1,门输入

33、2,门输入n); 例如 4输入与非门的门基元赋值语句为 nand (y,a,b,c,d); /与语句assign y=(a&b&c&d)等效,连续赋值语句 连续赋值语句的关键字assign,赋值符号是“=”,赋值语句的格式为 assign 赋值变量=表达式; 例如 assign y=(a /#1表示输出与输入信号之间具有1个单位的时间延迟 endmodule,过程赋值语句 过程赋值语句出现在initial和always块语句中,赋值符号是“=”,语句格式为: 赋值变量=表达式; 过程赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在该语句结束时即可得到。 如果一个块语句中包含若干

34、条过程赋值语句,按顺序一条一条执行,前面的语句没完成,后面的语句就不能执行。 因此,过程赋值语句也称为阻塞赋值语句。,非阻塞赋值语句 非阻塞赋值语句也是出现在initial和always块语句中,赋值符号是“=”,语句格式为: 赋值变量=表达式; 非阻塞赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在块语句结束时才可得到,与过程赋值语句不同。 例如 下面的块语句包含4条赋值语句 always (posedge clock) m=3; n=75; n=m; r=n; 语句执行结束后,r的值是75,而不是3,因为第3行是非阻塞赋值语句“n=m”,该语句要等到本块语句结束时,n的值才

35、能改变。 块语句的“(posedge clock)”是定时控制敏感函数,表示时钟信号clock的上升沿到来的敏感时刻。 例2 上升沿触发的D触发器的Verilog HDL源程序 module D_FF(q,d,clock); input d,clock; /属于wire型变量,由隐含规则定义。 output q; /属于reg型变量 reg q; always (posedge clock) q=d; endmodule,(2)条件语句 条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。 if语句 完整的Verilog HDL的if语句结构如下: if(表达式) b

36、egin 语句; end else if(表达式) begin 语句; end else begin 语句; end 在if语句中,“表达式”是逻辑表达式或关系表达式,也可以是位宽为1位的变量。 系统对表达式的值进行判断, 若为0,x,z按“假”处理;若为1,按“真”处理,执行指定的语句。,例3 8线-3线优先编码器的设计 8线-3线优先编码器的功能表 module code(y,a); input7:0 a; output2:0 y; reg2:0 y; always (a) begin if(a7) y=3b111; else if(a6) y=3b110; else if(a5) y=3

37、b101; else if(a4) y=3b100; else if(a3) y=3b011; else if(a2) y=3b010; else if(a1) y=3b001; else y=3b000; end endmodule,case语句 case语句是一种多分支的条件语句,case语句的格式为: case(表达式) 选择值1: 语句1; 选择值2: 语句2; 选择值n: 语句n; default: n+1 endcase 执行case语句时,首先计算表达式的值,然后执行条件句中相应的“选择值”的语句。当所有的条件句的“选择值”与表达式的值不同时,则执行“default”后的语句。d

38、efault可以省略。 case语句多用于数字系统中的译码器、数据选择器、状态机及微处理器的指令译码器等电路的描述。,例4:用case语句描述4选1数据选择器 控制信号s1,s2有4种组合,控制a,b,c,d中的一个数据送到输出端。 4选1数据选择器Verilog HDL的描述如下: module mux41(z,a,b,c,d,s1,s2); input s1,s2; input a,b,c,d; output z; reg z; always (s1 or s2) begin case(s1,s2) 2b00: z=a; 2b01: z=b; 2b10: z=c; 2b11: z=d; e

39、ndcase end endmodule case语句还有两种变体形式,casez和casex语句。与case语句的区别是不考虑语句中的高阻z和未知x的那些位,只关注其他位的比较结果。,4选1数据选择器功能表,(3)循环语句 循环语句包含for语句、repeat语句、while语句和forever语句4种。 for语句 for语句的格式为: for(循环指针=初值;循环指针 终值;循环指针=循环指针+步长值) begin 语句; end for语句可以是一组语句重复执行,语句中的参数一般属于整型变量或常量。语句重复执行的次数由语句中的参数确定。即 循环重复次数=(终值-初值)/步长值,例5:8

40、位奇偶校验器的描述 用a表示输入信号,长度为8位的向量。在程序中,用for语句对a的值,逐位进行模2加运算(即异或XOR),循环指针变量n控制模2加的次数。 11100110 奇数个1 循环变量的初值为0,终值为8,因此,控制循环共执行了8次。 例5 用Verilog HDL对8位奇偶校验器的描述如下: module test8(a,out); input7:0 a; output out; reg out; integer n; always (a) begin out=0; for(n=0;n8;n=n+1) out=outan; /异或 end endmodule,repeat语句 re

41、peat语句的语法格式为: repeat(循环次数表达式)语句; 例6 用repeat语句实现8位奇偶校验器的描述如下: module test8_1(a,out); parameter size=7; input7:0 a; output out; reg out; integer n; always (a) begin out=0; n=0; repeat(size) begin out=outan; n=n+1; end end endmodule /MAX+plus II软件不支持repeat语句,但synplify软件支持。,while语句 while语句的语法格式为: while(

42、循环执行条件表达式) begin 重复执行语句; 修改循环条件语句; end while语句在执行时,首先判断循环执行条件表达式是否为真。若为真,则执行其后面的语句;若为假,则不执行 ,表示循环结束。为了使语句能够结束,在循环执行的语句中必须包含一条能改变循环条件的语句。 forever语句 forever语句的语法格式为: forever begin 语句; end forever是一种无穷循环控制语句,它不断地执行其后的语句或语句块,永远不会结束。Forever语句常用来产生周期性的波形,作为仿真激励信号。例如产生时钟clk的语句为: #10 forever #10 clk=!clk; /

43、#10表示输出与输入信号之间具有10个单位的时间延迟,!clk取非,(4)结构声明语句 Verilog HDL的任何过程模块都是放在结构声明语句中,结构声明语句包括always、initial、task和function等4种结构。 always块语句 在一个Verilog HDL模块(module)中,always块语句的使用次数是不受限制的,块内的语句也是不断重复执行的。always块语句的语法结构为: always () begin /过程赋值语句; /if 语句,case语句; /for语句, while语句,repeat语句; /task语句、 function语句; end 在al

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

45、件是由clk的下降沿触发的。,initial语句 initial语句的语法格式为: initial begin 语句1; 语句2; ; end initial语句的使用次数是不受限制的,但块内的语句仅执行一次,因此initial语句常用于仿真中的初始化。,task语句 在Verilog HDL模块中,task语句用来定义任务。任务类似高级语言中的子程序,用来单独完成某项具体任务,并可以被模块或其他任务调用。利用任务可以把一个大的程序模块分解成为若干小的任务,使程序清晰易懂。 可以被调用的任务必须事先用task语句定义,定义格式如下: task 任务名; 端口声明语句; 类型声明语句; begi

46、n 语句 end endtask 任务定义与模块(module)定义的格式相同,区别在于任务是用task -endtask语句来定义,而且没有端口名列表。 例如,8位加法器的任务定义如下: task adder8 output7:0 sum; output cout; input7:0 ina,inb; input cin; assigncout,sum=ina+inb+cin; endtask,任务调用的格式如下: 任务名 (端口名列表); 例如 8位加法器任务调用 adder8 (tsum, tcout, tina, tinb); 使用任务时,需要注意几点: (1)任务的定义和调用必须在同

47、一个module模块内。 (2)定义任务时,没有端口名列表,但要进行端口和数据的声明。 (3)当任务调用时,任务被激活。任务调用与模块调用一样,通过任务名实现,调用时需列出端口名列表,端口名和类型必须与任务定义的排序和类型一致。 例如 8位加法器任务调用时的端口名列表中的tsum、 tcout、 tina、 tinb端口,与任务定义中的端口sum、cout、ina、inb排序和类型保持一致。 (4)一个任务可以调用别的任务或函数,可调用的任务和函数的个数不受限制。,function语句 在Verilog HDL模块中,function语句用来定义函数。函数类似高级语言中的函数,用来单独完成某项

48、具体操作,并可以作为表达式中的一个操作数,被模块或任务及其他函数调用,函数调用时返回一个用于表达式的值。 可以被调用的函数必须事先定义,函数定义格式如下: function最高有效位:最低有效位 函数名; 端口声明语句; 类型声明语句; begin 语句; end endfunction 在函数定义语句中,“最高有效位:最低有效位”是函数调用返回值位宽或类型声明。,例8 求最大值的函数 function7:0 max; input7:0 a,b; begin if (a=b) max=a; else max=b; end endfunction 函数调用的格式如下 函数名 (关联参数表); 函

49、数调用一般是出现在模块、任务或函数语句中。通过函数的调用来完成摹写数据的运算或转换。例如,调用上例中求最大值函数的语句为 peak=max(data, peak); 其中,data和peak是与函数定义的两个参数a、b相关联的关联参数。通过函数的调用,求出data和peak中的最大值,并用函数名max返回。,函数和任务存在以下几处区别: (1)任务可以有任意不同类型输入/输出参数,函数不能将inout类型作为输出。 (2)任务只可以在过程语句中调用,不能在连续赋值语句assign中调用;函数可以作为表达式中的一个操作数,在过程赋值语句和连续赋值语句中调用。 (3)任务可以调用其他任务或函数;函数可以调用其他函数,但不能调用任务。 (4)任务

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

当前位置:首页 > 其他


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