逻辑电路及verilog HDL简介_第1页
逻辑电路及verilog HDL简介_第2页
逻辑电路及verilog HDL简介_第3页
逻辑电路及verilog HDL简介_第4页
逻辑电路及verilog HDL简介_第5页
已阅读5页,还剩211页未读 继续免费阅读

下载本文档

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

文档简介

天道酬勤第2章

逻辑电路及VerilogHDL简介目录2.1基本逻辑门和常用逻辑门

2.2用VerilogHDL实现基本的逻辑操作

2.3原理图输入法逻辑电路设计2.4三种风格的VerilogHDL描述

2.5常用的组合电路及其设计

2.6时序电路的设计方法

算术运算和逻辑运算算术运算:当二进制数表示不同大小的数值时,数值与数值之间可以进行加、减、乘、除等运算,称算术运算。逻辑运算:当二进制数表示不同状态的代码时,代码与代码之间的运算是一种逻辑因果关系的运算,有与、或、非三种,称逻辑运算。这两种运算有本质的不同。算术运算—加法1001+011100010进位1进位1进位1进位12.1

基本逻辑门和常用逻辑门基本逻辑运算有逻辑与、逻辑或和逻辑非。实现这三种逻辑运算的电路,称作基本逻辑门。

1.逻辑代数的三种基本运算模型

⑴逻辑与(乘)运算只有决定一件事情的全部条件具备之后,结果才能发生,这种因果关系为“逻辑与”或“逻辑乘”。逻辑与(乘)运算逻辑与的逻辑关系表达式写成Y=A·B“·”表示“与运算”或“逻辑乘”,读作“与”或“乘”,可省略不读。与逻辑功能可记成:“有0出0,全1出1”与运算规则:

0·0=0;0·1=0;1·0=0;1·1=1A·0=0;A·1=A;0·A=0;1·A=A逻辑符号

AB00011011Y0001

真值表AB(a)YYAB(b)YAB&(c)(2)逻辑或(加)运算逻辑或的逻辑关系表达式Y=A+B“+”表示“或运算”或“逻辑加”,读作“或”或“加”。或逻辑功能:“有1出1,全0出0”。或运算规则:

0+0=0;0+1=1;1+0=1;1+1=1

A+0=A;A+1=1;A+A=A。AB00011011Y0111真值表逻辑或(加)运算二进制运算和逻辑代数的区别:二进制运算中的加法、乘法有进位问题,1+1=10;但逻辑代数研究的是“0”、“1”两种逻辑状态的逻辑加、逻辑乘、逻辑非,是一种逻辑运算,所以

1+1=1,1+1+···+1=1。逻辑符号

ABY(c)≥1ABY(a)+ABY(b)逻辑运算—或1001+01111111(3)逻辑非运算逻辑非的逻辑表达式写成

“ˉ”表示“非运算”或“逻辑非”,读作“非”。非运算的运算规则:逻辑符号A01Y10真值表AY1(c)AY(a)AY(b)基本逻辑门2.1.2基本逻辑符号2.复合逻辑运算与、或、非为三种基本逻辑运算。实际逻辑问题要比与、或、非复杂得多,但都可以用简单的与、或、非逻辑组合来实现。从而构成复合逻辑。复合逻辑常见的有与非、或非、异或、同(或)运算等。(1)

与非门

与非运算的逻辑结论:有0出1,全1出0。(2)

或非门

或非运算的逻辑结论:有1出0,全0出1。(3)

异或门

逻辑关系是:相异出1;相同出0

。逻辑结论:A<>B时,Y=1;A=B时,Y=0。(4)

同或门

异或运算和同或运算互为反函数即A⊙B=A⊕B逻辑关系:相同出1;相异出0

。逻辑结论:

A=B时Y=1;A<>B时Y=0。复合逻辑运算=A⊙B

逻辑符号如下图,其中第一行为IEEE84国际标准符号;第二行为惯用符号;第三行为IEEE91国际标准符号。公理3:公理4:公理5:3.逻辑代数的运算规则 一.基本公理

公理1:

设A为逻辑变量,若A≠0,则A=1;若A≠l,则A=0。

公理2:

0

0=0;1+1=11

1=1;0+0=0。

0

1=0;1+0=1。1

0=0;0+1=1。二.基本定律分别令A=0及A=1代入这些公式,即可证明它们的正确性。(20)6、交换律7、结合律8、分配律A+B=B+AA•B=B•AA+(B+C)=(A+B)+C=(A+C)+BA•(B•C)=(A•B)•CA(B+C)=A•B+A•CA+B•C=(A+B)(A+C)普通代数不适用!三、德摩根定理(反演律)(21)(DeMorgan)证明:真值表法、穷举法推广到多变量:说明:两个(或两个以上)变量的与非(或非)运算等于两个(或两个以上)变量的非或(非与)运算。用真值表证明摩根定理成立(22)A·B=A+BA+B=A·BAB00011011Y1=A·BY2=A+B11101110相等√逻辑代数的基本公式=A⊙B=自等律说明公式求反律反演律分配律结合律还原律吸收律交换律重叠律互补律0—1律(24)四种表示方法逻辑函数式

(逻辑表示式,逻辑代数式)

逻辑电路图:卡诺图n个输入变量种组合。真值表:将逻辑函数输入变量取值的不同组合与所对应的输出变量值用列表的方式一一对应列出的表格。4.逻辑函数的表示方法010100110100011110CAB卡诺图表述方式找出那些使函数值为1的变量取值组合,变量值为1的写成原变量,为0的写成反变量,这样对应于使函数值为1的每一个组合就可以写出一个乘积项,把这些乘积项加起来,可以得到函数的原函数的标准与或式。把函数值为0的对应乘积项相加,则得反函数。5.逻辑函数表达式与真值表的相互转换(1)由真值表求对应的逻辑函数表达式例:写出表决逻辑的原函数和反函数的标准与或式。解:00010111000001010011100101110111FABC表决逻辑真值表(2)由函数式写真值表将输入变量的各种组合一一代入函数式中计算输出变量值,全部完成后得到真值表。01010101C00110011B00001111Y=A+BC+ABCA011···01111例如:Y=A+BC+ABC,求它的真值表。6.逻辑代数化简法

同一个逻辑函数可以有多种表达形式,一种形式的表达式,对应一种电路,尽管它们的形式不同,但实现的逻辑功能相同,所以在实现某种函数的电路时,重要的是如何处理函数,以尽量少的单元电路、以及电路类型来达到目的。化简的意义:电路简单使用已有器件化简的方法:代数化简法(公式法)卡诺图化简法

一般说来,表达式越简单,实现起来逻辑电路也越简单。默认最简形式为最简与或式,即用最少的与门和或门来实现函数。

与或表达式最简,由它转换得来的表达式,一般来说也就最简。最简与或式:乘积项的项数最少。每个乘积项中变量个数最少。将n个输入变量的全部最小项用小方块阵列图表示,并且将逻辑相邻的最小项放在相邻的几何位置上,所得到的阵列图就是n变量的卡诺图。

卡诺图的每一个方块(最小项)代表一种输入组合,并且把对应的输入组合注明在阵列图的上方和左方。

卡诺图化简法一、与或表达式的卡诺图表示0001111000011110CDAB最小项卡诺图的画法①画正方形或矩形,图形中分割出2n个小方格,n为变量的个数,每个最小项对应一个小方格。②变量取值按循环码排列(GrayCode),其特点是相邻两个编码只有一位状态不同。变量卡诺图形象地表达了变量各个最小项之间在逻辑上的相邻性。0001111001BCA说明:⑴2个或以上变量,按循环码规则排列;⑵每个小方格对应一个最小项;⑶相邻方格的最小项,具有逻辑相邻性,即有一个变量互为反变量;⑷具有逻辑相邻性的方格有: 相接——几何相邻的方格; 相对——上下两边、左右两边的方格; 相重——多变量卡诺图,以对称轴相折叠,重在一齐的方格。逻辑相邻的最小项可以消去互补变量mo

m1m2m3m6m7

m4

m50100011110CAB三变量卡诺图逻辑相邻举例0001111001BCA相接相对0001111001BCA四变量卡诺图逻辑相邻举例相接相对相对0001111000011110CDAB由真值表填卡诺图ABC F000 0001 1010 0011 1100 1101 1110 0111 0mo

m1m2m3m6m7

m4

m50100011110CAB

0100011110CAB对应最小项填1其余补0

01

101

1

000001111001BCAmo

m1m3

m2m4

m5m7

m60001111001BCA11110000(37)二、卡诺图法化简步骤(一)布阵(画法规则)(二)填项(用卡诺图表示逻辑函数)(三)勾圈化简(用卡诺图化简)三步曲(一)布阵(画法规则):1.N=2n

格(n5):最小项2.循环码编排循环邻接上下封闭布阵(38)ABCD0001111000011110ABDC

m0m1m3m2

m4m5m7m6

m8m9m11m10

m12m13m15m14高位低位(39)(二)填项:用卡诺图表示逻辑函数填F=1的项1.最小项直接填入;2.刷项(填公因子所包含的项);3.按(m0,m15)

编号填入。按F=1的与或式填项方法(40)例1:ABCD0001111000011110ABDC1直接填入1公因子:有重复“1”者,只填一个“1”。(41)ABCD0001111000011110ABDC1111公因子:BD有重复“1”者,只填一个“1”。刷项:填公因子包含的项例1:(42)ABCD0001111000011110ABDC111111111111有重复“1”者,只填一个“1”。刷项:填公因子包含的项例1:(43)ABCD0001111000011110ABDC111111111111F=1的项全部填完以后,填项结束;不填者自动为“0”。例1:(44)(三)勾圈化简:1.尽量勾大,2i个格消i个变量(in);3.每个圈至少有一个独立格;4.圈必须覆盖所有的“1”,即不能遗漏取值为“1”的小方块。勾圈原则得到最简与或式。2.“1”可以重复利用;(45)ABCD0001111000011110ABDC111111111111D保留公因子:消取值不同的变量:B保留公因子:合理重叠(“1”可以重复使用)。例1:(46)也可以取F=0的项化简:ABCD00011110000111101111111111110000组合逻辑电路时序逻辑电路功能:输出只取决于

当前的输入逻辑电路组成:门电路(不存在记忆元件)功能:输出取决于当前的输入原来的状态组成:组合电路记忆元件

7.组合逻辑电路的设计

组合逻辑电路的特点2023/2/148

组合逻辑电路的一般设计步骤

1、由逻辑问题抽象出逻辑功能,列出真值表;2、由卡洛图进行化简,得到逻辑函数式;4、对逻辑电路图进行仿真。

组合逻辑电路手工设计方法

设计要求:按要求得到最简单的逻辑电路。3、选定器件,画出逻辑电路图;2023/2/149例:

数据选择器的设计在数字信号的传输过程中,有时需要从多路输入数据中选出某一路数据,完成此功能的逻辑器件称为数据选择器,即所谓多路开关,简称MUX(Multiplexer)

。D3D2D1D0F选择端输入数据输出数据A1A0功能示意图:数据选择器S2023/2/150一位二选一数据选择器

真值表:选择端数据端输出端a1a0Y10

0010

1011

0111

110

a0a0选择a0选择a1(51)sa1a00100011110001101勾圈化简:0054本课程要学习的PLD设计EDA工具软件

QuartusⅡ美国Altera公司自行设计的第四代PLD开发软件可以完成PLD的设计输入、逻辑综合、布局与布线、仿真、时序分析、器件编程的全过程同时还支持SOPC(可编程片上系统)设计开发2.3原理图输入法逻辑电路设计2.3.1QuartusII软件简介

QuartusⅡ简介

QuartusⅡ提供了方便的设计输入方式、快速的编译和直接易懂的器件编程。能够支持逻辑门数在百万门以上的逻辑器件的开发,并且为第三方工具提供了无缝接口。QuartusⅡ支持的器件有:StratixⅡ、StratixGX、Stratix、Mercury、MAX3000A、MAX7000B、MAX7000S、MAX7000AE、MAXⅡ、FLEX6000、FLEX10K、FLEX10KA、FLEX10KE、Cyclone、CycloneⅡ、APEXⅡ、APEX20KC、APEX20KE和ACEX1K系列。QuartusⅡ软件包的编程器是系统的核心,提供功能强大的设计处理,设计者可以添加特定的约束条件来提高芯片的利用率。QuartusⅡ主界面QuartusⅡ主界面的一个实例原理图输入法逻辑电路设计设计流程1、建立一个新工程,并指定对象器件。2、设计输入:

编辑HDL文件

原理图3、功能模拟:

编译(分析和综合)生成网表文件建立波形文件4、物理设计引脚分配

完整编译后时序模拟5、器件编程:下载

进入原理图编辑器从元件库中调入元件符号绘制原理图将设计项目设置成可调用的元件设计顶层文件将设计设置成工程2.3.2电路原理图编辑输入进入原理图编辑器进入原理图编辑器File->NewBlockDiagram/SchematicFile原理图编辑器窗口原理图设计方法

元件输入对话框

从元件库中调入元件符号

电路原理图编辑输入电路原理图编辑输入(1)新建一个文件夹。

(2)打开原理图编辑窗。(3)文件存盘。

2.3.3创建工程

(1)打开建立新工程管理窗。新建工程工作目录的路径新建的工程名称工程的顶层设计实体名称创建工程

(2)将设计文件加入工程中。创建工程

(3)选择目标芯片。

(4)工具设置。

选择对象器件EP1C12Q240C8创建工程

(5)结束设置。创建工程

(6)编辑构建电路图。

2.3.5编译前设置

选择FPGA目标芯片。选择对象器件EP1C12Q240C82.3.6全程编译processing->startcompilationprocessing->start菜单编译器窗口编译结果的报告2.3.7时序仿真测试电路功能

选择编辑矢量波形文件,打开波形编辑器(1)打开波形编辑器建立波形文件File->New->VectorWaveformFile使用波形编辑器绘制测试向量波形波形编辑器窗口时序仿真测试电路功能

(1)打开波形编辑器。(2)设置仿真时间区域。

(3)波形文件存盘。Edit->EndTime指定模拟终止时间(4)将工程top的端口信号名选入波形编辑器中(1)选择Pins:all(2)点击List(5)编辑输入波形(输入激励信号)(1)按住鼠标左键并拖动鼠标,选择一个时间段(2)在工具条中选择一个值,给信号赋值(6)仿真器参数设置(7)启动仿真器。模拟器窗口Processing->Simulatortool或Processing->StartSimulator(8)观察分析仿真结果。时延2.4三种风格的VerilogHDL描述

⇓cVerilogHDLStyles1.Structuralstyle(结构风格)2.Dataflowstyle(数据流风格)3.Behavioralstyle(功能描述风格)cVerilogHDLSynthesisandSimulationTools

Therearemanytools(freeornot) Iamusing2freetools OnWindows:QuartusIIWebEdition

ACPLD/FPGAdesigntoolbyAltera OnLinux:IcarusVerilog

Supporttransistorleveldesign AlsoforWindowsc2.4.1VerilogHDL基础知识一.Verilog模块的结构VerilogHDL以模块集合的形式来描述数字系统。“模块”(module)是Verilog程序的基本设计单元,用于描述某个设计的功能、结构、与其他模块通信的外部端口。

先通过三个简单的Verilog程序,直观地认识Verilog模块的结构。例1:根据电路结构建模&&modulemux2x1_gate(a0,a1,s,y);outputy;inputa0,a1,s;noti0(sn,s);andi1(a0_sn,a0,sn);andi2(a1_s,a1,s);ori3(y,a0_sn,a1_s);endmodule//模块名、端口列表//声明y为输出端口//声明a0,a1,s为输入端口//调用内置“非”门元件//调用内置“与”门元件//调用内置“与”门元件//调用内置“或”门元件例2:根据逻辑表达式建模modulemux2x1_dataflow(a0,a1,s,y);outputy;inputa0,a1,s;endmodule

assigny=(~s&a0)|(s&a1);定义同上采用逻辑表达式进行逻辑功能的描述&&例3:根据电路行为建模modulemux2x1_behavioral_if_else(a0,a1,s,y);

inputa0,a1,s;

outputy;

regy;endmodulealways@(sora0ora1)

if(s)y=a1;

elsey=a0;定义always中的赋值变量

只要信号a0,a1,s中有一个发生变化,就执行下面的语句。在这里已看不出电路的结构,而是一种电路行为的描述。&&Verilog模块基本结构module模块名(端口列表);端口定义input输入端口output输出端口……数据类型说明wireregparameter……逻辑功能定义assignalways语言内置门元件调用…endmodule1.模块声明Verilog模块结构完全包含在module和endmodule关键字之间。模块声明的格式:module模块名(端口1,端口2、….);……endmodule2.端口(Port)定义

端口是模块与外界或其他模块进行连接和通信的信号线,对模块的输入、输出端口要进行明确的定义,格式如下:input〈[向量位宽]〉

端口名1,端口名2,……端口名n;output〈[向量位宽]〉

端口名1,端口名2,……端口名n;定义输入定义输出3.数据类型和信号类型的声明

每个端口除声明为输入、输出,还要声明其数据类型是连线型(wire)还是寄存器型(reg),若没有声明,综合器默认为是wire型。

模块中用到的节点信号(连线)也必须进行数据类型的定义。用wire将信号定义为连线型;用reg将信号定义为寄存器型;用parameter定义符号常量。特别提示:输入不能声明为reg型!4.逻辑功能定义

模块中最核心的部分是逻辑功能定义。下面介绍几种基本方法。(1)用“assign”持续赋值语句进行逻辑功能的定义例如:assignF=~((A&B)|(C&D));“assign”语句一般用于组合逻辑的赋值,称为持续赋值方式。是一种基于逻辑表达式的逻辑功能描述方式。在前面的例2中,就是采用这种方式建立电路模型。(2)

调用内置元件(元件例化)描述电路结构调用VerilogHDL中提供的动态元件“画”电路图。例如:andmyand3(out,a,b,c);调用门元件,构造一个名为myand3的三输入与门。andc1(F,in1,in2);调用门元件,构造一个名为c1的二输入与门。

前面例1中,通过调用门元件,进行信号的相互连接,构造电路的模型。(3)

用“always”过程块描述电路的逻辑功能moduleMUX2_1(out,a,b,sel);//Portdeclarationsoutputout;inputa,b,sel;wireout,a,b,sel;wiresel_,a1,b1;

regout;

always@(seloraorb)if(!sel)out=a;elseout=b;endmodule注释行定义always中的赋值变量a,b,sel是输入端口,out是输出端口。所有信号通过这些端口从模块输入/输出。另一个模块可以通过模块名及端口说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它的使用。多路器由关键词module和endmodule开始及结束。小结●VerilogHDL程序是由模块构成的●模块是可以进行层次嵌套的●上层模块可以通过模块调用构成更大的逻辑系统●Verilog模块分为逻辑综合模块和逻辑模拟模块●每个模块由模块声明、端口定义、数据类型说明、逻辑功能定义四部分构成●VerilogHDL程序的书写格式自由,一行可写多个语句,一个语句也可分写多行。●除endmodule外,每个语句和数据定义的最后必须有分号●可用/*…*/和//…进行多行、单行注释(绿色),增强程序的可读性二.VerilogHDL中的数字(数值)常量VerilogHDL有下列四种基本的逻辑状态:0:低电平、逻辑0或“假”1:高电平、逻辑1或“真”x或X:不确定或未知的逻辑状态z或Z:高阻状态VerilogHDL中的常量是有这四类基本值组成的。

±<size>′<base_format><number>位宽:对应二进制数的宽度,省缺为32位。当指定进制格式时,不能省略数值采用的进制格式b或B:二进制d或D或缺省:十进制h或H:十六进制o或O:八进制基于进制的数字序列VerilogHDL可综合模块中常用的整数型常量的书写格式:正、负号例:

659//简单的十进制表示′h837FF/*省缺位宽的十六进制数,位宽大于实际位数,数值高位是

0或1,高位补0;数值高位是x或z,高位补x或z。*/′o7460//省缺位宽的八进制数4AF//非法的整数表示,十六进制需要′hb001//非法的整数表示,不能省略′4′b0010//四位的二进制数5′D3//五位的十进制数8′b0100_1010//使用下划线增加可读性

±<size>′<base_format><number>三.VerilogHDL中的标识符由字母、数字以及符号“$”、“_”(下划线)组成。●标识符必须以字母或下划线开头●标识符是区分大小写的合法标识符举例:countCOUNT_A1_d2不正确的标识符:30countOut*$123标识符常用于“模块名”或“变量名”四.VerilogHDL中的关键字

关键字也称为保留字,是VerilogHDL语言内部的专用词,用于组织语言结构,全部采用小写形式(蓝色)。例如:module、endmodule、begin、end、always、and、or、if、else、wire、reg、input、output、……

请同学们在后续课程学习时,关注、总结VerilogHDL中的关键字,从现在开始熟悉掌握。请注意:ALWAYS是标识符(黑色),与关键字always是不同的。五.VerilogHDL中的数据(变量)类型

在硬件描述语言中,数据类型用来表示逻辑电路中的物理连线、数据存储和传送单元。VerilogHDL中共有19种数据类型,分为连线型(NetType)和寄存器型(RegisterType)。在可综合模块中,最常用的是这两类中的wire型、reg型、integer型和parameter型。1.连线型(NetType)变量

连线型变量一般用来描述硬件电路中的各种物理连线。其特点是输出始终跟随输入的变化而变化。对连线型变量有两种驱动方式,一种是在结构描述中将其连接到一个逻辑门或模块的输出端;另一种是用assign语句进行赋值。类型功能说明wire,tri常用连线类型wor,trior具有线或特性的连线wand,triand具有线与特性的连线tri1,tri0上拉电阻,下拉电阻supply1,supply0电源(逻辑1),地(逻辑0)VerilogHDL提供了多种连线型变量重点介绍在可综合模块中最常用的是wire型变量wire型变量常用来表示通过assign语句赋值的组合逻辑信号。Verilog模块中的输入、输出端口的信号类型说明省缺时,自动定义为wire型。wire型变量可用于任何表达式的输入assign语句的输出实例元件的输出对综合器而言,其取值0,1,x,z其他模块的输出wire型变量的定义格式

wire〈[向量位宽]〉数据名1,数据名2,……数据名n;关键字n-1:0或n:1时,定义多位wire型向量;省略时,定义一位的wire型变量。例如,wire型变量或向量的定义:

wirea,b;//定义两个1位wire型变量a,bwire[7:0]databus;//定义一个8位宽的向量(数据总线)

wire[20:1]addrbus;//定义20位宽的地址总线例如,wire型向量的全域使用……wire[7:0]in,out;//定义两个8位wire型向量in,outassignout=in;//按位对应赋值……例如,对wire型向量可选域使用……wire[7:0]out;wire[3:0]in;assignout[5:2]=in;//in的0-3位赋值给out的2-5位……等效于:assignout[5]=in[3];assignout[4]=in[2];assignout[3]=in[1];assignout[2]=in[0];2.寄存器型(RegisterType)变量

寄存器型变量对应的是具有状态保持作用的电路元件。例如:触发器,寄存器。

寄存器型变量的特点是必须进行明确的赋值,并且在被重新赋值前一直保持原值。register型变量与net型变量的根本区别在于:register型变量能够保持最后一次的赋值;net型变量需要有持续的驱动。

在设计中必须将寄存器型变量放在过程块语句(initial,always)中,通过过程赋值语句赋值。即:initial,always过程块内被赋值的每一个信号,都必须定义为register型变量。VerilogHDL中也提供了多种寄存器型变量,在可综合模块中常用的是integer型和reg型。

integer寄存器型变量是一种纯数学的抽象描述,它虽然能定义带符号的32位整型寄存器变量,但不对应任何具体的硬件电路。

reg<[向量位宽]>数据名1,数据名2,……数据名n;reg型变量的定义格式:关键字n-1:0或n:1时,定义多位reg型向量;省略时,定义一位的reg型变量。例如,reg型变量、向量的定义

rega,b;//定义两个寄存器型变量a,b。位宽为1。

reg[7:0]data;//定义位宽为8的寄存器型变量data。

reg[8:1]data;//等效。例如:……reg[7:0]a,b;reg[3:0]c;regd;……d=a[7]&b[7];//位选择c=a[7:4]+b[3:0];//域选择……

在表达式中,可任意使用reg型变量中的一位或相邻几位,分别称为位选择和域选择。例:parametersel=8,code=8′ha3;//定义sel为常数8(十进制),code为常数a3(十六进制)parameterdata=8,addr=data*2;//data为8,addr为16,用常数表达式赋值。3.parameter型数据

在VerilogHDL中,用parameter定义符号常量,即定义一个标识符代表一个常量。定义格式如下:

parameter参数名1=表达式1,参数名2=表达式2,……;六.VerilogHDL中的运算符按功能分成九大类:关系运算符算术运算符逻辑运算符等式运算符缩减运算符条件运算符拼接运算符移位运算符位运算符按运算符所带的操作数区分:单目运算符(unaryoperator),带一个操作数。双目运算符(binaryoperator),带两个操作数。三目运算符(ternaryoperator),带三个操作数。算术运算符+加-减*乘/除%模运算符(对两个整型数据进行求余运算)均为双目运算符。在进行整数除法运算时,结果略去小数。取模运算时,结果符号与第一操作数相同。当两操作数中有一个为x,则结果就为x。10%3,结果为1;12%4,结果为0;-10%3,结果为-1;11%-3,结果为2逻辑运算符&&逻辑与,双目运算‖逻辑或,双目运算!逻辑非,单目运算当进行逻辑运算时:●若操作数是一位的,则逻辑运算真值表如下:aba&&ba||b!a!b00001010100010111100●当操作数由多位组成,则将操作数作为一个整体处理,即如操作数所有位都是“0”,则整体作为逻辑“0”;只要其中有一位是“1”,则整体作为逻辑“1”。●若操作数中有x,则结果也可能是x。例如:设a=2b=0c=4′hxa&&b逻辑与,1&&0,结果为0a‖b逻辑或,1‖0,结果为1!a逻辑非,!1,结果为0a&&c逻辑与,1&&x,结果为xa‖c逻辑或,1‖x,结果为1!c逻辑非,!X,结果为x位运算符~按位非(按位取反),单目运算。&按位与︱按位或^按位异或^~,~^按位异或非(按位同或)●将操作数按位对应,进行逻辑运算。●两个不同长度的数据进行位运算时,按右对齐,位数少的在高位补“0”。●注意x对运算结果的影响位运算符应用举例:若A=5′B11001,B=5′b101x1,则

~A=5′b00110A&B=5′b10001A︱B=5′b111x1A^B=5′b011x0关系运算符<小于<=小于或等于>大于>=大于或等于

比较两个操作数的大小关系,如果比较关系成立,则返回逻辑“1”;否则,返回逻辑“0”。如果两个操作数中有一个为x,则返回值是x。例:A=2,B=5,D=4′hx则:A<B返回逻辑“1”A>B返回逻辑“0”B<=D返回值是x等式运算符==等于!=不等于===全等!==不全等

双目运算,运算的结果是1位的逻辑值。两个操作数逐位相等,返回逻辑1;否则,返回逻辑0。若任何一个操作数中某位是x或z,则返回x。对操作数中的x和z也进行比较,逐位一致,返回逻辑1;否则,返回逻辑0。例:a=5′b11x01,c=5′b11x01,则

a==c得到的结果是xa===c得到的结果是1归约运算符又称为“缩减运算符”,是单目运算符。&归约与~&归约与非︱归约或~︱归约或非^归约异或~^,^~归约异或非(归约同或)对单个操作数进行归约的递推运算,运算结果是1位二进制数。过程:先将操作数的第1位与第2位进行归约运算,运算结果再与第3位进行归约运算,依此类推,直到最后一位。…reg[3:0]a;b=&a;//等效于b=((a[0]&a[1])&a[2])&a[3])…归约运算符举例若A=5′b11001则

&A归约运算结果是0,只有各位均为1,结果才为1。

︱A归约运算结果是1,只有各位均为0,结果才为0^A归约运算结果是1,奇数个1,结果为1。移位运算符>>逻辑右移<<逻辑左移

双目运算,将运算符左边的操作数左移或右移运算符右边的操作数指定的位数,空位补0。即:A>>n或A<<n。例如:A=6′b110010则A>>2的结果是6′b001100A<<2的结果是6′b001000条件运算符

?:三目运算符应用方式

signal=condition

true-expression:false-expression;信号=条件?表达式1:

表达式2;当条件成立时,信号取表达式1的值,反之取表达式2的值。条件运算符举例

moduleadd_subtract(a,b,op,result);parameterADD=1′b0;//定义字符常量

input [3:0]a,b;//定义a,b为4位输入向量

input op;//定义op为1位输入变量

output[3:0]result;//定义result为4位输出向量

assignresult=(op==ADD)?a+b:a-b;endmodule当op为0,做a+b当op为1,做a-b拼接运算符{}

将两个或多个信号的某些位拼接起来。用法如下:{信号1的某几位,信号2的某几位,……信号n的某几位}示例:a=1′b1b=2′b00c=6′b101001则:{a,b}产生一个3位数3′b100{c[5:3],a}产生一个4位数4′b1011嵌套使用,进行常量或变量的复制以及简化书写。例如:{3{a,b}}等同于{{a,b},{a,b},{a,b}}

也等同于{a,b,a,b,a,b}七.运算符的优先级运算符优先级!~高低*/%+–<<>><<=>>===!====!==&~&^^~|~|&&||?:

不同的综合开发工具在执行这些优先级时会有微小的差异,建议养成用括号控制优先级的习惯。2.4.2

VerilogHDL的功能描述模块一.功能描述

逻辑电路的结构描述侧重于表示一个电路由哪些基本元件组成,以及这些基本元件的相互连接关系。

逻辑电路的数据流描述侧重于逻辑表达式以及VerilogHDL中运算符的灵活运用。

功能描述关注逻辑电路输入、输出的因果关系(行为特性),即在何种输入条件下,产生何种输出(操作),并不关心电路的内部结构。EDA的综合工具能自动将功能描述转换成电路结构,形成网表文件。

显然,当电路的规模较大或时序关系较复杂时,通常采用功能描述方式进行设计。二.VerilogHDL功能描述风格模块的设计模型Verilog功能描述风格基本结构module模块名(端口列表);端口定义input输入端口output输出端口数据类型说明

regparameter逻辑功能定义always@(敏感事件列表)begin阻塞、非阻塞、if-else、case、for等行为语句endendmodule三.功能描述中的always进程应用模板always@(<敏感信号表达式>)begin//过程赋值语句

//if-else,case,casex,casez选择语句

//for循环语句

end

一般情况下,always进程带有触发条件,这些触发条件列在敏感信号表达式中,只有当触发条件满足时,begin-end块语句才被执行。

在一个VerilogHDL模块中可以有多个always进程,它们是并发执行的。

敏感信号表达式

又称敏感事件列表。当该表达式中任意一个信号(变量)的值改变时,就会引发块内语句的执行。因此,应将所有影响块内取值的信号(变量)列入。多个敏感信号用“or”或“,”连接。2001年以后的版本只要写一个“*”就行了。例如:@(a)//当信号a的值发生改变时@(a,b)//当信号a或信号b的值发生改变时@(*)//当所有输入信号中至少有一个的值发生改变时

这里a和b称为电平敏感型信号,代表的触发事件是:信号除了保持稳定状态以外的任意一种变化过程。

这种电平敏感型信号列表常用在组合逻辑的描述中,以体现输入随时影响输出的组合逻辑特性。

再例如:@(posedgeclock)//当clock的上升沿到来时@(negedgeclock)//当clock的下降沿到来时@(posedgeclockornegedgereset)//当clock的上升沿到来或当reset的下降沿到来时

这里的clock和reset信号称为边沿敏感型信号,posedge描述对信号的上升沿敏感;negedge描述对信号的下降沿敏感。显然,这种边沿敏感型信号列表适合描述同步时序电路,以体现同步时序电路的特点——在统一时钟作用下改变电路的状态。

posedge——代表的触发事件是,信号发生了正跳变。

0→x,0→z,0→1,x→1,z→1negedge——代表的触发事件是,信号发生了负跳变。

1→x,1→z,1→0,x→0,z→0

在每一个always过程语句中,最好只使用一种类型的敏感信号列表,不要混合使用。以避免使用不同的综合工具时发生错误。四.串行块

由关键字begin-end界定的一组语句。串行块的特点:●一般情况下,块内语句顺序执行,前面一条语句执行毕后,才开始执行下一条语句。●模块运行时,遇到串行块,块内第一条语句即开始执行,最后一条执行完毕,串行块结束。●整个串行块执行时间等于块内各条语句执行时间的总和。begin

语句1

语句2……endmoduleff_1(A,B,C,D,F);inputA,B,C,D;outputF;wirew1,w2;

assignw1=A&B;assignw2=~(C&D);assignF=w1|w2;endmodulemoduleff_1(A,B,C,D,F);inputA,B,C,D;outputF;regF,w1,w2;always@(AorBorCorD)

begin

w1=A&B;w2=~(C&D);F=w1|w2;endendmodule功能描述串行块只应用在always进程中:多条语句;顺序执行。

过程赋值语句必须放在always进程中,分为阻塞型和非阻塞型,其基本格式为:

〈被赋值变量〉〈赋值操作符〉〈赋值表达式〉●reg或integer类型变量;●寄存器向量的某一位或某几位;●用拼接符{}拼接起来的寄存器。=阻塞赋值操作符<=非阻塞赋值操作符任意合法表达式五.过程赋值语句//过程赋值语句的目标变量形式……rega;reg[7:0]b;integeri;always@(敏感事件列表)begin

a=0;i=356;b[2]=1′b1;b[3:0]=4′b1111;{a,b}=9′b101110110;end……过程赋值语句阻塞型过程赋值非阻塞型过程赋值操作符“=”在前面讨论中,用到的赋值语句都是阻塞型过程赋值语句●串行块(begin-end)内各条阻塞型过程赋值语句按顺序依次执行。下一条语句的执行被阻塞,等本条语句的赋值操作完成后,才开始执行。●阻塞型过程赋值语句的执行过程:先计算“赋值表达式”的值,然后立即赋值给“=”左边的“被赋值变量”。过程赋值语句非阻塞型过程赋值阻塞型过程赋值操作符“<=”特点:●在begin-eng串行块语句中,各条非阻塞过程赋值语句对应的“赋值表达式”同时开始计算。●在过程块结束时,才将结果赋值给各个“被赋值变量”。●可理解为先同时采样,最后一起赋值。……beginA<=B;//S1B<=A;//S2end……这里,S1、S2语句均为非阻塞赋值,立即开始计算B和A值(上次的值)。在过程块结束时,进行赋值操作,将计算得到的B,A的值赋给变量A,B。(实现A,B交换)

如果不能很好地理解阻塞赋值与非阻塞赋值的区别,往往给设计带来麻烦,特别是在可综合逻辑模块中,不易把握reg型变量的赋值过程。建议同学在编写模块时,只采用一种过程赋值方式,并且最好不要将输出再次作为输入使用。

为了更好地理解阻塞赋值与非阻塞赋值的区别,我们观察下面的示例。//例1:非阻塞赋值modulen_block(c,b,a,clk);outputc,b;inputclk,a;regb,c;always@(posedgeclk)beginb<=a;c<=b;endendmodule//例2:阻塞赋值moduleblock(c,b,a,clk);outputc,b;inputclk,a;regb,c;always@(posedgeclk)beginb=a;c=b;endendmodule结果:b更新为a的值,c为上个时钟周期b的值。结果:b、c都更新为a的值。这两个程序进行逻辑综合后的结果如下:>DQ>DQclkabc>DQclkacb例1非阻塞赋值综合结果例2阻塞赋值综合结果高级程序语句if-else条件分支语句case分支控制语句(1)if-else条件分支语句格式1if(<条件表达式>)语句或语句块;格式2if(<条件表达式>)语句或语句块1;

else语句或语句块2;格式3if(<条件表达式1>)语句或语句块1;

elseif(<条件表达式2>)语句或语句块2;

……elseif(<条件表达式n>)语句或语句块n;

else语句或语句块n+1;两路分支选择控制多路分支选择控制六.条件语句

三种格式中的<条件表达式>,一般为逻辑表达式或关系表达式,也可以是一位的变量。系统对<条件表达式>的值进行判断,若为0、x、z,按“假”处理;若为1,按“真”处理,执行指定语句。语句可以是单句,也可以是多句,多句时用begin-end括起来。

为了清晰表达if和else的匹配关系,建议最好用begin-end将“指定语句”括起来。//if-else条件分支语句应用举例

modulesel-from-three(q,sela,selb,a,b,c);inputsela,selb,a,b,c;outputq;regq;always@(selaorselboraorborc)beginif(sela)q=a;elseif(selb)q=b;elseq=c;endendmoduleselaselb语句

00q=c01q=b10q=a11q=a注意隐含的优先级关系。排在前面的分支项指定的操作具有较高优先级。例:11时,执行q=a,不是q=b。(2)case分支控制语句

相对if-else语句只有两个分支而言,case语句是一种多分支语句。所以,常用来描述译码器、多路数据选择器、微处理器的指令译码和有限状态机。case分支控制语句有三种形式:casecasexcasez全等比较分支控制局部比较分支控制“全等比较分支控制”case语句的格式:

case(<控制表达式>)<分支项表达式1>:语句块1;

<分支项表达式2>:语句块2;

……<分支项表达式n>:语句块n;

default:语句块n+1;endcase对程序流向进行控制的信号(变量)控制信号(变量)的具体状态组合取值受控的分支操作,可单句,也可多句。未列入分支控制的状态组合下应进行的操作未列入分支控制的状态组合的统称。

(其余状态时)与真值表存在某种对应关系

按位全等比较case语句示例……case(op_code)2′b00:out=a︱b;2′b01:out=a&b;2′b10:out=~(a&b);2′b11:out=a^b;default:out=0;endcase……case语句在执行时,控制表达式和分支项表达式之间进行的是按位全等比较,只有对应每一位都相等,才认为控制表达式和分支项表达式是相等的。显然,这种比较包含了信号的0、1、x、z四种状态。

根据按位全等比较的特点,要求case语句中的控制表达式和分支项表达式必须具有相同的位宽。当各个分支项表达式以常数形式给出时,必须明确标明位宽,否则编译器默认为与机器字长相同的位宽(例如32位)。能不能忽略信号的x和z逻辑状态的比较?这就引出了“局部比较”分支控制的casex和casez语句。利用控制表达式和分支项表达式中某些位的比较结果控制程序流向。

casez语句——忽略处于“z”逻辑状态位的比较。casex语句——忽略处于“x”或“z”逻辑状态位的比较。

casex语句示例

……reg[7:0]out;always@(aorboropcode)begincasex(opcode)

温馨提示

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

评论

0/150

提交评论