FPGA现代数字系统设计_第1页
FPGA现代数字系统设计_第2页
FPGA现代数字系统设计_第3页
FPGA现代数字系统设计_第4页
FPGA现代数字系统设计_第5页
已阅读5页,还剩211页未读 继续免费阅读

下载本文档

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

文档简介

第二章Verilog硬件描述语言,2.1基本概念2.2VerilogHDL基本结构2.3模块与声明2.4数据类型与运算符号2.5行为建模2.6Verilog-2001设计规则Verilog基本模块,怎样设计复杂的数字系统?,现代的设计方法:选用合适的EDA仿真工具;选用合适电路图输入和HDL编辑工具;逐个编写可综合HDL模块;逐个编写HDL测试模块;逐个做VerilogHDL电路逻辑访真;编写VerilogHDL总测试模块;做系统电路逻辑总仿真;,2.1基本概念,现代的设计方法(续):选用合适的基本逻辑元件库和宏库租用或购买必要的IP核;选用合适的综合器;进行综合得到门级电路结构;布局布线,得到时延文件;后仿真;定型,FPGA编码或ASIC投片,为什么要用硬件描述语言来设计?,电路的逻辑功能容易理解;便于计算机对逻辑进行分析处理;把逻辑设计与具体电路的实现分成两个独立的阶段来操作;逻辑设计与实现的工艺无关;逻辑设计的资源积累可以重复利用;可以由多人共同更好更快地设计非常复杂的逻辑电路(几十万门以上的逻辑系统)。,学习内容,术语定义硬件描述语言特点Verilog历史如何从抽象级(levelsofabstraction)理解电路设计Verilog描述,术语定义,硬件描述语言HDL:描述电路硬件结构及电路时序的一种编程语言。仿真器:读入HDL并进行解释及执行的一种软件。抽象级:描述风格的详细程度,如行为级结、构级、门级。自下而上的设计流程:一种先构建底层单元,然后由底层单元构造更大的系统的设计方法。自顶向下的设计流程:一种设计方法,先用高抽象级构造系统,然后再设计下层单元。RTL级:寄存器传输级(RegisterTransferLevel),用于设计的可综合的一种抽象级。逻辑综合:在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。,Verilog的用途,Verilog的主要应用包括:ASIC和FPGA工程师编写可综合的RTL代码在高抽象级进行系统仿真,完成系统结构开发编写系统仿真的测试代码,硬件描述语言特点,VerilogHDL较多的第三方工具的支持语法结构比VHDL简单学习起来比VHDL容易仿真工具比较好使测试激励模块容易编写,VerilogHDL的发展历史,有哪几种HDL语言?各有什么特点?,VHDL-比VerilogHDL早几年成为IEEE标准;-语法/结构比较严格,因而编写出的模块风格比较清晰;-比较适合由较多的设计人员合作完成的特大型项目(一百万门以上)。,两者建模能力的比较,抽象级,Verilog既是一种行为描述的语言也是一种结构描述语言。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别包括:,系统说明-设计文档/算法描述RTL/功能级-Verilog门级/结构级-Verilog版图/物理级-几何图形,行为综合综合前仿真逻辑综合综合后仿真版图,在抽象级上需要进行折衷,系统说明-设计文档/算术描述RTL/功能级-Verilog门级/结构级-Verilog版图/物理级-几何图形,详细程度低高,输入/仿真速度高低,Verilog可以在三种抽象级上进行描述,行为级用功能块之间的数据流对系统进行描述在需要时在函数块之间进行调度赋值。RTL级/功能级用功能块内部或功能块之间的数据流和控制信号描述系统基于一个已定义的时钟的周期来定义系统模型结构级/门级用基本单元(primitive)或低层元件(component)的连接来描述系统以得到更高的精确性,特别是时序方面。在综合时用特定工艺和低层元件将RTL描述映射到门级网表,设计工程师在不同的设计阶段采用不同的抽象级首先在行为级描述各功能块,以降低描述难度,提高仿真速度。在综合前将各功能模块进行RTL级描述。用于综合的库中的大多数单元采用结构级描述。Verilog还有一定的晶体管级描述能力及算法级描述能力,有关VerilogHDL的几个重要基本概念,综合:通过工具把用VerilogHDL描述的模块自动转换为用门级电路网表表示的模块的过程。寄存器传输级VerilogHDL模块:也可称为RTL(Verilog)HDL模块。它是符合特定标准和风格的描述状态转移和变化的VerilogHDL模块。能用综合器把它转换为门级逻辑。VerilogHDL测试模块:用VerilogHDL描述的模块,可以用来产生测试信号序列并可以接收被测试模块的信号,用于验证所设计的模块是否能正常运行,往往不可综合成具体门级电路。,4)VerilogHDL顶层(测试)模块:同上。布局布线:把用综合器自动生成的门级网表(EDIF)通过运行一个自动操作的布局布线工具,使其与具体的某种FPGA或某种ASIC工艺库器件对应起来,并加以连接的过程。VerilogHDL后仿真测试模块:同3)、4),但被测试的模块至少是一个门级描述的或用具体FPGA(ASIC)库器件(带时间延迟信息)描述的结构型VerilogHDL模块。,2.2VerilogHDL基本结构,语言本身提供了各种层次抽象的表述,可以用详细程度有很大差别的的多层次模块组合来描述一个电路系统。行为级:技术指标和算法的Verilog描述RTL级:逻辑功能的Verilog描述门级:逻辑结构的Verilog描述开关级:具体的晶体管物理器件的描述,VerilogHDL的抽象级别,行为级:有关行为和技术指标模块,容易理解RTL级:有关逻辑执行步骤的模块,较难理解门级:有关逻辑部件互相连接的模块,很难理解开关级:有关物理形状和布局参数的模块,非常难理解,抽象级别和综合与仿真的关系,行为仿真:行为的验证和验证模块分割的合理性前仿真:即RTL级仿真,检查有关模块逻辑执行步骤是否正确。逻辑综合:把RTL级模块转换成门级。后仿真:用门级模型做验证,检查门的互连逻辑其功能是否正确。布局布线:在门级模型的基础上加上了布线延时布局布线后仿真:与真实的电路最接近的验证。,行为级和RTL级,modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;regout;always(sloraorb)if(!sl)out=a;elseout=b;endmodule,a,b,sl,out,这个行为的描述并没有说明如果输入a或b是三态的(高阻时)输出应该是什么,但有具体结构的真实电路是有一定的输出的。RTL模块的数据流动必须基于时钟。RTL模块在每个时钟的沿时刻,其变量的值必定是精确的。RTL模块是可综合的,它是行为模块的一个子集合。,结构级,modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;notu1(ns1,sl);and#1u2(sela,a,nsl);and#1u3(selb,b,sl);or#2u4(out,sela,selb);endmodule,out,模块基本结构,modulemodule_name/模块名(port_list);/端口声明列表input;/输入声明output;/输出声明reg;/寄存器类型声明wire;/线网类型声明parameter;/参数声明/主程序代码gatelevelassignlevelinitialalways(posedgeclkornegedgereset)UDPstructuresub_moduleu(out,input1,input1)/被调用子模块functiontaskendmodule,2.3模块与声明,模块命名模块的命名规则模块端口连接规则模块划分信号命名端口声明参数声明变量声明,2.3.1模块命名,1、模块的命名规则将模块的英文名称的各个单词首字母组合起来,形成3-5个字符缩写。例:Built-inSelfTest模块命名为BISTArithmaticLogicalUnit模块命名为ALU若模块的英文名称只有一个单词,可取该单词中的前三个字母。例:Transceivers模块命名为TRS,模块之间的接口信号的命名所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写Req是Request的缩写。两个缩写的第一个字母都大写便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。模块上下层次间信号的命名也遵循本规定,模块内部信号模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;单词除常用的缩写方法外,如:Clock-Clk,Write-Wr,Read-Rd等),一律取该单词的前几个字母(如:Frequency-Freq,Variable-Var等);每个缩写单词的第一个字母大写;若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);举例:SdramWrEn_n;FlashAddrLatchEn;,2、模块端口连接规则模块调用另一模块时有两种连接方式:1)按端口顺序连接:底层模块定义时声明的端口顺序与上层模块相应的连接端口顺序保持一致。2)按端口名称连接,被调用的底层模块和上层模块是通过端口名称进行连接。,3、模块划分,2.3.2信号命名,系统级信号的命名。系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。,2.3.3端口声明,输入端口:input端口名;模块从外界读取数据的接口,是连线类型输出端口:output端口名;模块向外界传输数据的接口,是连线或寄存器型输入输出端口:inout端口名;可读取数据也可接收数据的端口,数据是双向的,是连线型,2.3.4变量声明,声明变量的数据类型后,不能再进行更改在VerilogHDL中只要在使用前声明即可声明后的变量、参数不能再次重新声明声明后的数据使用时的配对数据必须和声明的数据类型一致,2.4.5“include”和“define”,“include”是调用某个目录下的文件添加到这个程序中“define”是编译指令中用作全局变量声明,2.3.6代码编写风格,1、分节编写2、注释单行注释以“/”多行注释以“/*”开始,以“*/”结束。3、程序编写说明,Verilog模块由两部分组成:端口信息和内部功能。moduleblock1(a,b,c,d,e);inputa,b,c;outputd,e;assignd=a|(bendmodule,小结,a,b,c,d,e,从上面的例子可以看出:-Verilog模块结构完全嵌在module和endmodule声明语句之间;-每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。,Verilog模块的结构由在module和endmodule关键词之间的四个主要部分组成:-端口信息:moduleblock1(a,b,c,d);-输入/输出说明:inputa,b,c;outputd;-内部信号:wirex;-功能定义:assignd=a|x;assignx=(bendmodule,请在下面的空格中填入适当的符号使其成为右图的Verilog模块:moduleblock1(a,b,);input,;d,;assignd=a|(b_,编写VerilogHDL模块的练习,a,b,c,d,e,请在下面的空格中填入适当的符号使其成为右图的Verilog模块:moduleblock1(a,b,c,d,e);inputa,b,c;outputd,e;assignd=a|(bendmodule,a,b,c,e,d,2.4数据类型与运算符,数字声明数值逻辑常量数据类型整数型实数型时间型数据类型线网性寄存器型参数数组类型字符串型运算符和表达式,基本常识,关键字?,标识符?,空白符?,关键字:在verilogHDL内部已经使用的词称为关键字或保留字。,标识符:用于定义模块名、端口名、连线、信号名等。标识符可以是任意一组字母、数字、$符号下划线的组合,但标识符第一个字符必须是字母或者下划线,且字符不能多于1024个。此外还区分大小写。,空白符:空白符由空格、换行等组成,仅仅用于分隔标识符,在编译中被忽略。,2.4.1数字声明,数字的表达方式:位宽用十进制数表示数值的位数进制用于设定数字的基底,一般为h、b、d、o等数值填入有效的4种格式的数字其数字包括高阻态和不确定值当数值位宽大于指定大小时,截去高位注意:在数字中可以加入负号,通常负号要出现在位宽之前,如出现在格式和数值间则是错误的。缺省位宽时,默认为32位数据,数字的表示方法,2.4.2数值逻辑,Verilog的四种逻辑值:(0、1、X、Z),0、低、伪、逻辑低、地、VSS、负插入,1、高、真、逻辑高、电源、VDD、正插入,X、不确定:逻辑冲突无法确定其逻辑值,HiZ、高阻抗、三态、无驱动源,2.4.3常量数据类型,1、整数型关键字是integer进行声明,是一种通用的寄存器数据类型2、实数型关键字是real进行声明3、时间型使用$time进行声明时间变量,2.4.4数据类型,1.Nets(网络连线):由模块或门驱动的连线。驱动端信号的改变会立刻传递到输出的连线上。例如:右图上,selb的改变,会自动地立刻影响或门的输出。,连接类型变量的种类:在为不同工艺的基本元件建立库模型的时候,常常需要用不同的连接类型来与之对应,使其行为与实际器件一致。常见的有以下几种。如果不明确地说明连接是何种类型,应该是指wire类型。例:wire7:0a,b;/位宽为8的wire型变量a和b,综合编译器不支持的net类型,2.寄存器(register)类型变量register型变量能保持其值,直到它被赋于新的值。register型变量常用于行为建模,产生测试的激励信号。常用行为语句结构来给寄存器类型的变量赋值。,定义形式如:regw-1:0data1,data2,.datan;例如:regp_out;/一个标量寄存器reg3:0m,n;/两个4位寄存器reg15:0data;/16位的寄存器类型,3、参数型用来指定一个标识符来代替一个常量,常用在信号位宽定义,延迟时间定义等,可以增加可读性,方便程序更改。格式:parameter标识符1=表达式1,标识符2=表达式2,标识符n=表达式n;如:parameterwidth=9;,4、数组类型(特例:存储器类型)memory数据类型常用于寄存器文件、ROM和RAM建模等,是寄存器的二维数组形式,它是reg型的扩展,一般格式:regn-1:0存储器名N-1:0;其中n为宽度,N寄存器组的深度。如:reg7:0mem_rom124:0;注意:regmemN-1:0表示N个一位的寄存器组regN-1:0a;表示一个N位的寄存器变量a,如何选择正确的数据类型?,输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输出口(output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输入/输出口(inout)只可以由网络连接驱动,但它本身只能驱动网络连接。如果信号变量是在过程块(initial块或always块)中被赋值的,必须把它声明为寄存器类型变量,选择数据类型时常犯的错误,在过程块中对变量赋值时,忘了把它定义为寄存器类型(reg)或已把它定义为连接类型了(wire)把实例的输出连接出去时,把它定义为寄存器类型了把模块的输入信号定义为寄存器类型了。这是经常犯的三个错误!,选择数据类型时常犯的错误举例,修改前:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;regc,d;rego2andu1(o2,c,d);always(aorb)if(a)o1=b;elseo1=0;endmodule,修改后:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;/regc,d;/rego2rego1;andu1(o2,c,d);always(aorb)if(a)o1=b;elseo1=0;endmodule,例:,2.4.5运算符和表达式,下表以优先级顺序列出了Verilog操作符。注意“与”操作符的优先级总是比相同类型的“或”操作符高。本章将对每个操作符用一个例子作出解释。,最高,最低,优先级,1.操作符类型+加-减*乘/除%模将负数赋值给reg或其它无符号变量使用2的补码算术。如果操作数的某一位是x或z,则结果为x在整数除法中,余数舍弃模运算中使用第一个操作数的符号,例如:a=4b010;b=4b0010a+ba*ba/ba%b注意:在算术运算中,有一个操作数为不确定状态,则运算结果都为不确定状态。,2.逻辑操作符,!notb=8b01010011;c=a|b;/a零扩展为8b00001011,4.关系操作符大于=大于等于)格式:数值所有数值向左或右移动响应的位数,其空缺位补0例a=5b10101b=a3,8.拼接运算符可以将多个操作数的某些位连接起来成为一个新的操作数,进行拼接时,每个操作数必须是确定位宽。在拼接运算时,拼接的操作数按照顺序罗列出来,其间用逗号隔开。例:a=1b1,b=2b10,c=4b1010X=a,b,cY=a,b,2b01Z=a,b,32b11,9.条件运算符条件运算符是三目的运算符,格式为:?例:B=(a=2b01)?c:d;q=(sel)?a:b;,2.5Verilog行为建模,行为建模:强调的是行为,它说明电路的功能。即是强调电路的输入/输出功能。但是该行为与实现无关,也就是对如何实现在行为域中隐蔽起来。行为级建模包括:initial语句和always语句。,2.5.1行为描述模块,行为描述主要包括:过程语句过程赋值语句语句块时序控制数据流控制,1、过程语句initial语句格式:initialbegin执行语句1;执行语句2;end,说明:一个模块中可以包含多个initial语句,所有语句都是从0时刻开始执行,而且只能执行一次。initial语句常用于测试文本中信号的初始化,生成输入仿真波形,监测信号变化等。initial语句也可以使用fork-join语句。,例:reg1:0a,b;regc;initialbegina=1;b=0;#10begina=2;b=3;end#10begina=0;b=2;endendinitialc=1;,always语句always语句通常配合事件的表示式使用。所谓事件就是一接线或缓存器发生状态改变。例如:信号出现正沿、负沿或是数值改变时,区块内的语句即被执行。格式:always(事件表达式1or事件表达2or.or事件表达式n)beginend,事件表达式中特定值的改变always(clk)q=d;/当clk值改变时,执行q=d时钟信号的正沿触发always(posedgeclk)q=d;/当clk正沿触发时,执行q=d时钟信号的负沿触发always(negedgeclk)q=d;/当clk负沿触发时,执行q=d,时钟信号或一个异步事件always(posedgeclkornegedgeclr)beginif(!clr)q=1b0;/清0elseq=d;/赋值end,其它事件触发always(aorborc)y=a|b|c;一个模块可以有多个always语句,每个always语句只要有相应的触发事件产生,对应执行相应的语句,与书写的先后顺序无关。例:always(posedgeclkorposedgerst)beginif(rst)/高电平复位信号counter=4b0000;elsecounter=counter+1;/开始计数always(counter)display(“thecounteris=%d”,counter)end,同步D触发器的always语句modulesy_d_ff(clk,d,q,q_b);inputclk,d;outputq,q_d;regq;assignq_b=q;always(posedgeclk)/时钟上升沿触发beginq=d;endendmodule,2、赋值语句:赋值符号左边是赋值目标,右边是表达式连续赋值语句连续赋值用于数据流行为建模。在连续赋值语句中常用“assign”关键字。assign赋值语句执行将数值赋给线网,可以完成门将描述,也可以更高的抽象角度对线网电路进行描述,多用于组合逻辑电路的描述。格式:assign赋值目标线网=表达式;,例:assigna=b|c;assignc,sum3:0=a3:0+b3:0+c_in;assignc=min(a,b);说明:式子左边的“赋值目标线网”只能是线网型变量,不能是寄存器型变量。式子右边表达式的操作数可以是线网,也可以是寄存器,还可以是函数。一旦右边的任何一个操作数变化,左边表达式重新计算,再进行新的一次赋值。,2、赋值语句过程赋值语句的更新对象是寄存器、整数、实数等,一般出现在initial和always语句中。阻塞赋值非阻塞赋值连续赋值语句中,任何一个操作数的变化都会重新计算赋值表达式,重新进行赋值。,过程赋值阻塞赋值阻塞式(blocking)的操作符为“=”modulebloc(clk,b,c);inputclk,b;outputc;wireclk,b;wirea;always(posedgeclk)begina=b+1;c=a;endendmodule,“阻塞赋值“可以看作一步进程:当没有其它可以打断赋值的描述时,估计等式右边的值并赋予左边。其完成后,才进行下一条语句的执行在同一个always块里面,阻塞赋值结果将一直持续下去直到赋值结束。使用阻塞语句可能会得到意想不到的结果。,过程赋值非阻塞赋值非阻塞式(non-blocking)的操作符为“=”modulebloc(clk,b,c);inputclk,b;outputc;wireclk,b;wirea;always(posedgeclk)begina=b+1;c=a;endendmodule,“非阻塞赋值”非阻塞赋值在赋值开始时计算表达式右边的值,到了本次仿真周期结束时才更新被赋值变量,且也许其它语句的同时赋值。不影响其赋值结果非阻塞赋值为寄存器数据类型而设,所以只能被允许在程序块里面出现,比如initial块和always块。不允许持续性赋,当为时序逻辑建模,使用“非阻塞赋值”。当为锁存器(latch)建模,使用“非阻塞赋值”。当用always块为组合逻辑建模,使用“阻塞赋值”当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用“非阻塞赋值”。不要在同一个always块里面混合使用“阻塞赋值”和“非阻塞赋值”。不要在两个或两个以上always块里面对同一个变量进行赋值。使用$strobe以显示已被“非阻塞赋值”的值。不要使用0延迟的赋值。,建议:,例:assigna=b|c;assignc,sum3:0=a3:0+b3:0+c_in;assignc=min(a,b);说明:式子左边的“赋值目标线网”只能是线网型变量,不能是寄存器型变量。式子右边表达式的操作数可以是线网,也可以是寄存器,还可以是函数。一旦右边的任何一个操作数变化,左边表达式重新计算,再进行新的一次赋值。,3、语句块顺序块顺序块中的语句按书写顺序执行,由begin-end标识。格式:beginbegin块名执行语句1;快内变量、参数定义;执行语句2;执行语句1;执行语句3;执行语句2;endend,快名是可选的,是一个块的标识名快内可以根据需要定义变量,声明参数,但这些只能在块内使用。顺序块内的语句是按照语句的书写顺序执行,,并行块并行块中的语句并行执行,由fork-jion标识。格式:forkfork块名执行语句1;快内变量、参数定义;执行语句2;执行语句1;执行语句3;执行语句2;joinjoin,例如:beginfork#10dout=2b00;#10dout=2b00;#20dout=2b01;#20dout=2b01;#30dout=2b10;#30dout=2b10;#40dout=2b11;#40dout=2b11;endjoin,在块语句中,语句由上而下顺序执行,当执行最后一行指令时,仿真时间为100个时间单位。在并行语句中,所有指令同时执行,执行最后一行指令的时间为第40个时间单位。,4、时序控制简单延迟控制遇到这一语句和真正执行这一语句之间的延迟时间initialbegin#10clk=clk;/每隔十秒,信号翻转一次end,敏感事件触发只有当某一事件发生时,才允许语句继续向下执行modulecounter(clk,rest,cou);inputclk,rest;outputcou;reg7:0cou;always(posedgeclk)beginif(rest)cou=0;elsecou=cou+1;endendmodule,电平敏感的时序控制遇到敏感表中的时序情况,执行语句。reg7:0cou;always(aorborc)beginif(rest)cou=0;elsecou=cou+1;endendmodule,2.5.2条件语句,1、if语句用于判断给定的条件是否满足,根据判断的结果,执行相应的操作。语句格式:if()beginendelsebeginend,if()beginendelseif()beginendelseif()beginend,if()beginif()beginendelsebeginendendelsebeginif()beginendelsebeginendend,条件表达式可以是逻辑表达式或关系表达式。条件表达式还可以是操作数。如果操作数是0、z、x,等价于逻辑假,反之为逻辑真。if(rest)等价于if(reset=1b1)if(!rest)等价于if(reset=1b0)if-else可以嵌套使用,在嵌套使用中,必须注意其配对,一般用begin-end块语句进行整合在一起。,例:8位计数器模块modulecounter(qout,reset,clk);output7:0qout;inputclk,reset;reg7:0qout;always(posedgeclk)beginif(reset)qout=0;elseqout=qout+1;endendmodule,例:设计14进制计数器(要求同步时钟下同步复位)modulecounter(qout,reset,clk);output3:0qout;inputclk,reset;reg3:0qout;always(posedgeclk)beginif(reset)qout=0;elseif(qout=13)qout=0;elseqout=qout+1;endendmodule,例:同步置数、同步清零的计数器modulecount(out,data,load,reset,clk);output7:0out;input7:0data;inputload,clk,reset;reg7:0out;always(posedgeclk)/clk上升沿触发beginif(!reset)out=8h00;/同步清0,低电平有效elseif(load)out=data;/同步预置elseout=out+1;/计数endendmodule,3-8译码器电路,例:3-8译码器,modulesample_reg(clk,rst,din,dout);inputclk,rst;input3:0din;output3:0dout;reg3:0data;always(posedgeclkornegedgerst)beginif(!rst)begindata=4b0;endelsebegindata=din;endendassigndout=data;endmodule,例:数据采样模块,例:4-1的选通数据输出,其输出数据位32位,(使用if-else语句),if-else表达了一个条件选择的设计意图,它与条件运算符有重要的区别:条件运算符可以出现在一个表达式中,而这个表达式可以使用在过程赋值中或者连续赋值中,可进行行为建模,也可进行门级建模if-else只能出现在always、initial块语句,或者函数与任务中,一般只能在行为建模中使用。练习:1、用if-else语句编写一个2-4译码器,要求在时钟上升沿触发。2、同步时钟下异步复位的11进制的计数器,moduledecode2_4(clk,din,dout);inputclk;input1:0din;output3:0dout;wireclk;wire1:0din;reg3:0dout;always(posedgeclk)beginif(din=2b00)dout=4b0001;elseif(din=2b01)dout=4b0010;elseif(din=2b10)dout=4b0100;elseif(din=2b11)dout=4b1000;endendmouule,2.case语句if-else语句提供选择操作,但数目较多,使用起来不方便,而case语句是一种多分支选择语句。语句格式case(控制表达式)分支表达式1:语句1;分支表达式2:语句2;分支表达式n:语句n;default:默认语句;endcasecase括弧内的表达式称为控制表达式,通常表示为控制信号的某些位。default项可有可无,一个case语句里只准有一个default项。,例:用case语句实现4位数据的4选1电路。,每一个case语句分项的分支表达式的值必须互不相同,否则就会出现问题,即是同一个表达式,将出现多种方案,而产生矛盾。执行完case分项后的语句,则跳出该case语句结构,终止case语句执行。case语句的所有表达式值的位宽必须相等,只有这样才能进行对应位的比较。针对表达式不确定值X和高阻态Z的情况,提供逐为比较和执行的操作语句如casex和casez。,例:8-3编码器(用条件语句实现,再用case语句),BCD码七段数码管显示译码器(共阴极显示)moduledecode4_7(decodeout,indec);output6:0decodeout;input3:0indec;reg6:0decodeout;always(indec)begincase(indec)/用case语句进行译码4d0:decodeout=7b1111110;4d1:decodeout=7b0110000;4d2:decodeout=7b1101101;4d3:decodeout=7b1111001;4d4:decodeout=7b0110011;4d5:decodeout=7b1011011;4d6:decodeout=7b1011111;4d7:decodeout=7b1110000;4d8:decodeout=7b1111111;4d9:decodeout=7b1111011;default:decodeout=7bx;endcaseendendmodule,modulelookup(out,a,b,clk);output3:0out;input1:0a,b;inputclk;reg3:0out;reg3:0address;always(posedgeclk)beginaddress=a,b;case(address)4h0:out=4b0000;4h1:out=4b0000;4h2:out=4b0000;4h3:out=4b0000;4h4:out=4b0000;,4h5:out=4b0001;4h6:out=4b0010;4h7:out=4b0011;4h8:out=4b0000;4h9:out=4b0010;4ha:out=4b0100;4hb:out=4b0110;4hc:out=4b0000;4hd:out=4b0011;4he:out=4b0110;4hf:out=4b1001;default:out=bx;endcaseendendmodule,例:查找表方式实现22乘法,casez语句:casez与case语句语法结构的执行过程完全一样。唯一不同的在于其状况表示:当出现Z及?时,其状况判定课当成不介意,亦出现z或?位时不做比较。,具有优先权的41的选择器modulemux_casez(out,a,b,c,d,select);outputout;inputa,b,c,d;input3:0select;regout;always(selectoraorborcord)begincasez(select)4b?1:out=a;4b?1?:out=b;4b?1?:out=c;4b1?:out=d;endcaseendendmodule,casex语句:casex与case语句语法结构的执行过程完全一样。唯一不同的在于其状况表示:当出现Z及?或X时,其状况判定课当成不介意,亦出现z或?或z位时不做比较。,作业,4,2.5.3循环语句,循环语句只能用在initial、always块中。VerilogHDL有四种循环语句:forfoeeverrepeatwhile,1、for语句语句格式:for(表达式1;表达式;表达式3)语句;说明:表达式1是初始条件表达式,表达式2是循环终止条件,表达式3是改变循环控制变量的赋值语句语句执行过程,modulevoter7(pass,vote);outputpass;input6:0vote;reg2:0sum;integeri;regpass;always(vote)beginsum=0;for(i=0;i=6;i=i+1)/for语句if(votei)sum=sum+1;elseif(sum2)pass=1;/若超过4人赞成,则pass=1elsepass=0;endendmodule,【例】用for语句描述的七人投票表决器,modulemu

温馨提示

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

评论

0/150

提交评论