FPGA现代数字系统设计.ppt

上传人:小飞机 文档编号:5431411 上传时间:2023-07-06 格式:PPT 页数:216 大小:1.82MB
返回 下载 相关 举报
FPGA现代数字系统设计.ppt_第1页
第1页 / 共216页
FPGA现代数字系统设计.ppt_第2页
第2页 / 共216页
FPGA现代数字系统设计.ppt_第3页
第3页 / 共216页
FPGA现代数字系统设计.ppt_第4页
第4页 / 共216页
FPGA现代数字系统设计.ppt_第5页
第5页 / 共216页
点击查看更多>>
资源描述

《FPGA现代数字系统设计.ppt》由会员分享,可在线阅读,更多相关《FPGA现代数字系统设计.ppt(216页珍藏版)》请在三一办公上搜索。

1、第二章 Verilog硬件描述语言,2.1 基本概念2.2 Verilog HDL基本结构2.3 模块与声明2.4 数据类型与运算符号2.5 行为建模2.6 Verilog-2001设计规则Verilog 基本模块,怎样设计复杂的数字系统?,现代的设计方法:选用合适的EDA仿真工具;选用合适电路图输入和HDL编辑工具;逐个编写可综合HDL模块;逐个编写HDL测试模块;逐个做Verilog HDL电路逻辑访真;编写Verilog HDL总测试模块;做系统电路逻辑总仿真;,2.1 基本概念,现代的设计方法(续):选用合适的基本逻辑元件库和宏库 租用或购买必要的IP核;选用合适的综合器;进行综合得到

2、门级电路结构;布局布线,得到时延文件;后仿真;定型,FPGA编码或ASIC投片,为什么要用硬件描述语言来设计?,电路的逻辑功能容易理解;便于计算机对逻辑进行分析处理;把逻辑设计与具体电路的实现分成两个独立的阶段来操作;逻辑设计与实现的工艺无关;逻辑设计的资源积累可以重复利用;可以由多人共同更好更快地设计非常复杂的逻辑电路(几十万门以上的逻辑系统)。,学习内容,术语定义硬件描述语言特点Verilog历史如何从抽象级(levels of abstraction)理解电路设计Verilog描述,术语定义,硬件描述语言HDL:描述电路硬件结构及电路时序的一种编程语言。仿真器:读入HDL并进行解释及执行

3、的一种软件。抽象级:描述风格的详细程度,如行为级结、构级、门级。自下而上的设计流程:一种先构建底层单元,然后由底层单元构造更大的系统的设计方法。自顶向下的设计流程:一种设计方法,先用高抽象级构造系统,然后再设计下层单元。RTL级:寄存器传输级(Register Transfer Level),用于设计的可综合的一种抽象级。逻辑综合:在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。,Verilog的用途,Verilog的主要应用包括:ASIC和FPGA工程师编写可综合的RTL代码在高抽象级进行系统仿真,完成系统结构开发编写系统仿真的测试代码,硬件描述语言特点,

4、Verilog HDL 较多的第三方工具的支持 语法结构比VHDL简单 学习起来比VHDL容易 仿真工具比较好使 测试激励模块容易编写,Verilog HDL 的发展历史,有哪几种HDL语言?各有什么特点?,VHDL-比VerilogHDL早几年成为I EEE标准;-语法/结构比较严格,因而编写出的 模块风格比较清晰;-比较适合由较多的设计人员合作完成 的特大型项目(一百万门以上)。,两者建模能力的比较,抽象级,Verilog既是一种行为描述的语言也是一种结构描述语言。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别包括:,系统说明-设计文档/算法描述RTL/功能级-Veril

5、og门级/结构级-Verilog版图/物理级-几何图形,行为综合综合前仿真逻辑综合综合后仿真版图,在抽象级上需要进行折衷,系统说明-设计文档/算术描述RTL/功能级-Verilog门级/结构级-Verilog版图/物理级-几何图形,详细程度 低 高,输入/仿真速度 高 低,Verilog可以在三种抽象级上进行描述,行为级 用功能块之间的数据流对系统进行描述 在需要时在函数块之间进行调度赋值。RTL级/功能级用功能块内部或功能块之间的数据流和控制信号描述系统基于一个已定义的时钟的周期来定义系统模型结构级/门级用基本单元(primitive)或低层元件(component)的连接来描述系统以得到更

6、高的精确性,特别是时序方面。在综合时用特定工艺和低层元件将RTL描述映射到门级网表,设计工程师在不同的设计阶段采用不同的抽象级首先在行为级描述各功能块,以降低描述难度,提高仿真速度。在综合前将各功能模块进行RTL级描述。用于综合的库中的大多数单元采用结构级描述。Verilog还有一定的晶体管级描述能力及算法级描述能力,有关Verilog HDL的几个重要基本概念,综合:通过工具把用Verilog HDL描述的模块自动转换为用门级电路网表表示的模块的过程。寄存器传输级Verilog HDL模块:也可称为RTL(Verilog)HDL模块。它是符合特定标准和风格的描述状态转移和变化的 Verilo

7、g HDL模块。能用综合器把它转换为门级逻辑。Verilog HDL测试模块:用Verilog HDL描述的模块,可以用来产生测试信号序列并可以接收被测试模块的信号,用于验证所设计的模块是否能正常运行,往往不可综合成具体门级电路。,4)Verilog HDL顶层(测试)模块:同上。布局布线:把用综合器自动生成的门级网表(EDIF)通过运行一个自动操作的布局布线工具,使其与具体的某种FPGA或某种ASIC工艺库器件对应起来,并加以连接的过程。Verilog HDL后仿真测试模块:同3)、4),但被测试的模块至少是一个门级描述的或用具体FPGA(ASIC)库器件(带时间延迟信息)描述的结构型Ver

8、ilog HDL 模块。,2.2 Verilog HDL 基本结构,语言本身提供了各种层次抽象的表述,可以用详细程度有很大差别的的多层次模块组合来描述一个电路系统。行为级:技术指标和算法的Verilog描述RTL级:逻辑功能的Verilog描述门级:逻辑结构的Verilog描述开关级:具体的晶体管物理器件的描述,Verilog HDL 的抽象级别,行为级:有关行为和技术指标模块,容易理解RTL级:有关逻辑执行步骤的模块,较难理解门级:有关逻辑部件互相连接的模块,很难理解开关级:有关物理形状和布局参数的模块,非常难理解,抽象级别和综合与仿真的关系,行为仿真:行为的验证和验证模块分割的合理性前仿真

9、:即 RTL级仿真,检查有关模块逻辑执行步骤是否正确。逻辑综合:把RTL级模块转换成门级。后仿真:用门级模型做验证,检查门的互连逻辑其功能是否正确。布局布线:在门级模型的基础上加上了布线延时布局布线后仿真:与真实的电路最接近的验证。,行为级和RTL级,module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always(sl or a or b)if(!sl)out=a;else out=b;endmodule,a,b,sl,out,这个行为的描述并没有说明如果输入 a 或 b是三态的(高阻时)输出应该是什么,但有具体结构的真实电路是

10、有一定的输出的。RTL模块的数据流动必须基于时钟。RTL模块在每个时钟的沿时刻,其变量的值必定是精确的。RTL模块是可综合的,它是行为模块的一个子集合。,结构级,module muxtwo(out,a,b,sl);input a,b,sl;output out;not u1(ns1,sl);and#1 u2(sela,a,nsl);and#1 u3(selb,b,sl);or#2 u4(out,sela,selb);endmodule,out,模块基本结构,module module_name/模块名(port_list);/端口声明列表 input;/输入声明 output;/输出声明 re

11、g;/寄存器类型声明 wire;/线网类型声明parameter;/参数声明/主程序代码 gate level assign level initial always(posedge clk or negedge reset)UDP structure sub_module u(out,input1,input1)/被调用子模块 function taskendmodule,2.3模块与声明,模块命名 模块的命名规则 模块端口连接规则 模块划分 信号命名 端口声明 参数声明变量声明,模块命名,1、模块的命名规则将模块的英文名称的各个单词首字母组合起来,形成3-5个字符缩写。例:Built-in

12、 Self Test模块 命名为BISTArithmatic Logical Unit模块 命名为ALU若模块的英文名称只有一个单词,可取该单词中的前三个字母。例:Transceivers 模块 命名为TRS,模块之间的接口信号的命名 所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写Req是Reque

13、st的缩写。两个缩写的第一个字母都大写便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。模块上下层次间信号的命名也遵循本规定,模块内部信号 模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;单词除常用的缩写方法外,如:Clock-Clk,Write-Wr,Read-Rd等),一律取该单词的前几个字母(如:Frequency-Freq,Variable-Var 等);每个缩写单词的第一个字母大写;若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);举例:SdramWrEn_n;FlashAddrLatchEn;,2、模块端口连接规则模块调用另一模块时

14、有两种连接方式:1)按端口顺序连接:底层模块定义时声明的端口顺序与上层模块相应的连接端口顺序保持一致。2)按端口名称连接,被调用的底层模块和上层模块是通过端口名称进行连接。,3、模块划分,信号命名,系统级信号的命名。系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd

15、_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。,端口声明,输入端口:input 端口名;模块从外界读取数据的接口,是连线类型输出端口:output 端口名;模块向外界传输数据的接口,是连线或寄存器型输入输出端口:inout 端口名;可读取数据也可接收数据的端口,数据是双向的,是连线型,变量声明,声明变量的数据类型后,不能再进行更改在VerilogHDL中只要在使用前声明即可声明后的变量、参数不能再次重新声明声明后的数据使用时的配对数据必须和声明的数据类型一致,2.4.5“include

16、”和“define”,“include”是调用某个目录下的文件添加到这个程序中“define”是编译指令中用作全局变量声明,代码编写风格,1、分节编写2、注释 单行注释以“/”多行注释以“/*”开始,以“*/”结束。3、程序编写说明,Verilog 模块由两部分组成:端口信息和内部功能。module block1(a,b,c,d,e);input a,b,c;output d,e;assign d=a|(b endmodule,小结,a,b,c,d,e,从上面的例子可以看出:-Verilog模块结构完全嵌在module和endmodule声明语句之间;-每个Verilog程序包括四个主要部分:

17、端口定义、I/O说明、内部信号声明、功能定义。,Verilog 模块的结构由在module和endmodule 关键词之间的四个主要部分组成:-端口信息:module block1(a,b,c,d);-输入/输出说明:input a,b,c;output d;-内部信号:wire x;-功能定义:assign d=a|x;assign x=(b endmodule,请在下面的空格中填入适当的符号 使其成为右图的Verilog 模块:module block1(a,b,);input,;d,;assign d=a|(b _,编写Verilog HDL模块的练习,a,b,c,d,e,请在下面的空格

18、中填入适当的符号 使其成为右图的Verilog 模块:module block1(a,b,c,d,e);input a,b,c;output d,e;assign d=a|(b endmodule,a,b,c,e,d,2.4数据类型与运算符,数字声明数值逻辑常量数据类型整数型实数型时间型数据类型线网性寄存器型参数数组类型字符串型运算符和表达式,基本常识,关键字?,标识符?,空白符?,关键字:在verilog HDL内部已经使用的词称为关键字或保留字。,标识符:用于定义模块名、端口名、连线、信号名等。标识符可以是任意一组字母、数字、$符号下划线的组合,但标识符第一个字符必须是字母或者下划线,且字

19、符不能多于1024个。此外还区分大小写。,空白符:空白符由空格、换行等组成,仅仅用于分隔标识符,在编译中被忽略。,数字声明,数字的表达方式:位宽用十进制数表示数值的位数进制用于设定数字的基底,一般为h、b、d、o等数值填入有效的4种格式的数字其数字包括高阻态和不确定值当数值位宽大于指定大小时,截去高位注意:在数字中可以加入负号,通常负号要出现在位宽之前,如出现在格式和数值间则是错误的。缺省位宽时,默认为32位数据,数字的表示方法,数值逻辑,Verilog的四种逻辑值:(0、1、X、Z),0、低、伪、逻辑低、地、VSS、负插入,1、高、真、逻辑高、电源、VDD、正插入,X、不确定:逻辑冲突无法确

20、定其逻辑值,HiZ、高阻抗、三态、无驱动源,常量数据类型,1、整数型关键字是integer进行声明,是一种通用的寄存器数据类型2、实数型关键字是real进行声明3、时间型使用$time进行声明时间变量,数据类型,1.Nets(网络连线):由模块或门驱动的连线。驱动端信号的改变会立刻传递到输出的连线上。例如:右图上,selb的改变,会自动地立刻影响或门的输出。,连接类型变量的种类:在为不同工艺的基本元件建立库模型的时候,常常需要用不同的连接类型来与之对应,使其行为与实际器件一致。常见的有以下几种。如果不明确地说明连接是何种类型,应该是指 wire 类型。例:wire 7:0a,b;/位宽为8的w

21、ire型变量a和b,综合编译器不支持的net类型,2.寄存器(register)类型变量register 型变量能保持其值,直到它被赋于新的值。register 型变量常用于行为建模,产生测试的激励信号。常用行为语句结构来给寄存器类型的变量赋值。,定义形式如:reg w-1:0data1,data2,.datan;例如:reg p_out;/一个标量寄存器reg3:0m,n;/两个4位寄存器reg15:0data;/16位的寄存器类型,3、参数型用来指定一个标识符来代替一个常量,常用在信号位宽定义,延迟时间定义等,可以增加可读性,方便程序更改。格式:parameter 标识符1=表达式1,标识

22、符2=表达式2,标识符n=表达式n;如:parameter width=9;,4、数组类型(特例:存储器类型)memory数据类型常用于寄存器文件、ROM和RAM建模等,是寄存器的二维数组形式,它是reg型的扩展,一般格式:reg n-1:0 存储器名N-1:0;其中n为宽度,N寄存器组的深度。如:reg 7:0mem_rom124:0;注意:reg memN-1:0表示N个一位的寄存器组 regN-1:0a;表示一个N位的寄存器变量a,如何选择正确的数据类型?,输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输出口(output)可以由寄存器或网络连接驱动,但它本身

23、只能驱动网络连接。输入/输出口(inout)只可以由网络连接驱动,但它本身只能驱动网络连接。如果信号变量是在过程块(initial块 或 always块)中被赋值的,必须把它声明为寄存器类型变量,选择数据类型时常犯的错误,在过程块中对变量赋值时,忘了把它定义为寄存器类型(reg)或已把它定义为连接类型了(wire)把实例的输出连接出去时,把它定义为寄存器类型了把模块的输入信号定义为寄存器类型了。这是经常犯的三个错误!,选择数据类型时常犯的错误举例,修改前:module example(o1,o2,a,b,c,d);input a,b,c,d;output o1,o2;reg c,d;reg o

24、2 and u1(o2,c,d);always(a or b)if(a)o1=b;else o1=0;endmodule,修改后:module example(o1,o2,a,b,c,d);input a,b,c,d;output o1,o2;/reg c,d;/reg o2 reg o1;and u1(o2,c,d);always(a or b)if(a)o1=b;else o1=0;endmodule,例:,运算符和表达式,下表以优先级顺序列出了Verilog操作符。注意“与”操作符的优先级总是比相同类型的“或”操作符高。本章将对每个操作符用一个例子作出解释。,最高,最低,优先级,1.操作

25、符类型+加-减*乘/除%模将负数赋值给reg或其它无符号变量使用2的补码算术。如果操作数的某一位是x或z,则结果为x 在整数除法中,余数舍弃 模运算中使用第一个操作数的符号,例如:a=4b010;b=4b0010a+ba*ba/ba%b注意:在算术运算中,有一个操作数为不确定状态,则运算结果都为不确定状态。,2.逻辑操作符,!not&and|or,逻辑操作符的结果为一位1,0或x。逻辑操作符只对逻辑值运算。如操作数为全0,则其逻辑值为false如操作数有一位为1,则其逻辑值为true若操作数只包含0、x、z,则逻辑值为x,逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,

26、逻辑反操作值为1。,3.按位操作符,非&与|或异或 同或 同或,当两个操作数位数不同时,位数少的操作数零扩展到相同位数。非是单目操作数的,其他都是双目操作数。,a=4b1011;b=8b01010011;c=a|b;/a零扩展为 8b00001011,4.关系操作符大于=大于等于=小于等于其结果是逻辑1、逻辑0或不确定x。如果有优先级的,则先考虑优先级,再进行比较,5.等式运算符(1)逻辑等=(2)逻辑不等!=位宽不一样的时候,要右对齐。若操作数有一位不确定,返回值为X。(3)case等(=)(4)case等(!=)这是对操作数进行逐位比较,不存在X的返回值,6.缩减运算符 缩减与(&)缩减与

27、非(&),缩减或(|),缩减或非(|),缩减异或(),缩减同或()。这类操作符对操作数有左向右进行操作缩减运算符只要一个操作数例a=4b1101&a=1&1&1&0&1=0,7.移位运算符左移()格式:数值所有数值向左或右移动响应的位数,其空缺位补0例a=5b10101b=a3,8.拼接运算符 可以将多个操作数的某些位连接起来成为一个新的操作数,进行拼接时,每个操作数必须是确定位宽。在拼接运算时,拼接的操作数按照顺序罗列出来,其间用逗号隔开。例:a=1b1,b=2b10,c=4b1010X=a,b,cY=a,b,2b01Z=a,b,32b11,9.条件运算符 条件运算符是三目的运算符,格式为:

28、?例:B=(a=2b01)?c:d;q=(sel)?a:b;,2.5 Verilog 行为建模,行为建模:强调的是行为,它说明电路的功能。即是强调电路的输入/输出功能。但是该行为与实现无关,也就是对如何实现在行为域中隐蔽起来。行为级建模包括:initial语句和always语句。,行为描述模块,行为描述主要包括:过程语句过程赋值语句语句块时序控制数据流控制,1、过程语句initial语句 格式:initial begin 执行语句1;执行语句2;end,说明:一个模块中可以包含多个initial语句,所有语句都是从0时刻开始执行,而且只能执行一次。initial语句常用于测试文本中信号的初始化

29、,生成输入仿真波形,监测信号变化等。initial语句也可以使用fork-join语句。,例:reg1:0a,b;reg c;initial begin a=1;b=0;#10 begin a=2;b=3;end#10 begin a=0;b=2;end end initial c=1;,always语句 always语句通常配合事件的表示式使用。所谓事件就是一接线或缓存器发生状态改变。例如:信号出现正沿、负沿或是数值改变时,区块内的语句即被执行。格式:always(事件表达式1 or 事件表达2 or.or 事件表达式n)begin end,事件表达式中特定值的改变 always(clk)q

30、=d;/当clk值改变时,执行q=d 时钟信号的正沿触发 always(posedge clk)q=d;/当clk正沿触发时,执行q=d时钟信号的负沿触发 always(negedge clk)q=d;/当clk负沿触发时,执行q=d,时钟信号或一个异步事件 always(posedge clk or negedge clr)begin if(!clr)q=1b0;/清0 else q=d;/赋值 end,其它事件触发 always(a or b or c)y=a|b|c;一个模块可以有多个always语句,每个always语句只要有相应的触发事件产生,对应执行相应的语句,与书写的先后顺序无关

31、。例:always(posedge clk or posedge rst)begin if(rst)/高电平复位信号 counter=4b0000;else counter=counter+1;/开始计数 always(counter)display(“the counter is=%d”,counter)end,同步D触发器的always语句 module sy_d_ff(clk,d,q,q_b);input clk,d;output q,q_d;reg q;assign q_b=q;always(posedge clk)/时钟上升沿触发 begin q=d;endendmodule,2、赋

32、值语句:赋值符号左边是赋值目标,右边是表达式连续赋值语句 连续赋值用于数据流行为建模。在连续赋值语句中常用“assign”关键字。assign赋值语句执行将数值赋给线网,可以完成门将描述,也可以更高的抽象角度对线网电路进行描述,多用于组合逻辑电路的描述。格式:assign 赋值目标线网=表达式;,例:assign a=b|c;assign c,sum3:0=a3:0+b3:0+c_in;assign c=min(a,b);说明:式子左边的“赋值目标线网”只能是线网型变量,不能是寄存器型变量。式子右边表达式的操作数可以是线网,也可以是寄存器,还可以是函数。一旦右边的任何一个操作数变化,左边表达式

33、重新计算,再进行新的一次赋值。,2、赋值语句过程赋值语句的更新对象是寄存器、整数、实数等,一般出现在initial和always语句中。阻塞赋值非阻塞赋值连续赋值语句中,任何一个操作数的变化都会重新计算赋值表达式,重新进行赋值。,过程赋值阻塞赋值阻塞式(blocking)的操作符为“=”module bloc(clk,b,c);input clk,b;output c;wire clk,b;wire a;always(posedge clk)begin a=b+1;c=a;endendmodule,“阻塞赋值“可以看作一步进程:当没有其它可以打断赋值的描述时,估计等式右边的值并赋予左边。其完成

34、后,才进行下一条语句的执行在同一个always块里面,阻塞赋值结果将一直持续下去直到赋值结束。使用阻塞语句可能会得到意想不到的结果。,过程赋值非阻塞赋值 非阻塞式(non-blocking)的操作符为“=”module bloc(clk,b,c);input clk,b;output c;wire clk,b;wire a;always(posedge clk)begin a=b+1;c=a;endendmodule,“非阻塞赋值”非阻塞赋值在赋值开始时计算表达式右边的值,到了本次仿真周期结束时才更新被赋值变量,且也许其它语句的同时赋值。不影响其赋值结果非阻塞赋值为寄存器数据类型而设,所以只能

35、被允许在程序块里面出现,比如initial块和always块。不允许持续性赋,当为时序逻辑建模,使用“非阻塞赋值”。当为锁存器(latch)建模,使用“非阻塞赋值”。当用always块为组合逻辑建模,使用“阻塞赋值”当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用“非阻塞赋值”。不要在同一个always块里面混合使用“阻塞赋值”和“非阻塞赋值”。不要在两个或两个以上always块里面对同一个变量进行赋值。使用$strobe以显示已被“非阻塞赋值”的值。不要使用0延迟的赋值。,建议:,例:assign a=b|c;assign c,sum3:0=a3:0+b3:0+c_in;ass

36、ign c=min(a,b);说明:式子左边的“赋值目标线网”只能是线网型变量,不能是寄存器型变量。式子右边表达式的操作数可以是线网,也可以是寄存器,还可以是函数。一旦右边的任何一个操作数变化,左边表达式重新计算,再进行新的一次赋值。,3、语句块顺序块 顺序块中的语句按书写顺序执行,由begin-end标识。格式:begin begin 块名 执行语句1;快内变量、参数定义;执行语句2;执行语句1;执行语句3;执行语句2;end end,快名是可选的,是一个块的标识名快内可以根据需要定义变量,声明参数,但这些只能在块内使用。顺序块内的语句是按照语句的书写顺序执行,,并行块 并行块中的语句并行执

37、行,由fork-jion标识。格式:fork fork 块名 执行语句1;快内变量、参数定义;执行语句2;执行语句1;执行语句3;执行语句2;join join,例如:begin fork#10 dout=2b00;#10 dout=2b00;#20 dout=2b01;#20 dout=2b01;#30 dout=2b10;#30 dout=2b10;#40 dout=2b11;#40 dout=2b11;end join,在块语句中,语句由上而下顺序执行,当执行最后一行指令时,仿真时间为100个时间单位。在并行语句中,所有指令同时执行,执行最后一行指令的时间为第40个时间单位。,4、时序控

38、制简单延迟控制遇到这一语句和真正执行这一语句之间的延迟时间 initial begin#10 clk=clk;/每隔十秒,信号翻转一次 end,敏感事件触发只有当某一事件发生时,才允许语句继续向下执行 module counter(clk,rest,cou);input clk,rest;output cou;reg7:0cou;always(posedge clk)begin if(rest)cou=0;else cou=cou+1;end endmodule,电平敏感的时序控制遇到敏感表中的时序情况,执行语句。reg7:0cou;always(a or b or c)begin if(re

39、st)cou=0;else cou=cou+1;end endmodule,2.5.2 条件语句,1、if语句 用于判断给定的条件是否满足,根据判断的结果,执行相应的操作。语句格式:if()begin end else begin end,if()begin end else if()begin end else if()begin end,if()begin if()begin end else begin end end else begin if()begin end else begin end end,条件表达式可以是逻辑表达式或关系表达式。条件表达式还可以是操作数。如果操作数是0、

40、z、x,等价于逻辑假,反之为逻辑真。if(rest)等价于if(reset=1b1)if(!rest)等价于if(reset=1b0)if-else可以嵌套使用,在嵌套使用中,必须注意其配对,一般用begin-end块语句进行整合在一起。,例:8 位计数器模块module counter(qout,reset,clk);output7:0 qout;input clk,reset;reg7:0 qout;always(posedge clk)begin i f(reset)qout=0;else qout=qout+1;endendmodule,例:设计14进制计数器(要求同步时钟下同步复位)

41、module counter(qout,reset,clk);output3:0 qout;input clk,reset;reg3:0 qout;always(posedge clk)begin i f(reset)qout=0;else if(qout=13)qout=0;else qout=qout+1;endendmodule,例:同步置数、同步清零的计数器module count(out,data,load,reset,clk);output7:0 out;input7:0 data;input load,clk,reset;reg7:0 out;always(posedge clk

42、)/clk 上升沿触发 begin if(!reset)out=8h00;/同步清0,低电平有效 else if(load)out=data;/同步预置 else out=out+1;/计数 endendmodule,3-8译码器电路,例:3-8译码器,module sample_reg(clk,rst,din,dout);input clk,rst;input 3:0 din;output 3:0 dout;reg 3:0 data;always(posedge clk or negedge rst)beginif(!rst)begin data=4b0;end else begin dat

43、a=din;endend assign dout=data;endmodule,例:数据采样模块,例:4-1的选通数据输出,其输出数据位32位,(使用if-else语句),if-else表达了一个条件选择的设计意图,它与条件运算符有重要的区别:条件运算符可以出现在一个表达式中,而这个表达式可以使用在过程赋值中或者连续赋值中,可进行行为建模,也可进行门级建模if-else只能出现在always、initial块语句,或者函数与任务中,一般只能在行为建模中使用。练习:1、用if-else语句编写一个2-4译码器,要求在时钟上升沿触发。2、同步时钟下异步复位的11进制的计数器,module deco

44、de2_4(clk,din,dout);input clk;input 1:0din;output 3:0 dout;wire clk;wire 1:0din;reg 3:0 dout;always(posedge clk)begin if(din=2b00)dout=4b0001;else if(din=2b01)dout=4b0010;else if(din=2b10)dout=4b0100;else if(din=2b11)dout=4b1000;endendmouule,2.case语句 if-else语句提供选择操作,但数目较多,使用起来不方便,而case语句是一种多分支选择语句。语

45、句格式 case(控制表达式)分支表达式1:语句1;分支表达式2:语句2;分支表达式n:语句n;default:默认语句;endcasecase括弧内的表达式称为控制表达式,通常表示为控制信号的某些位。default项可有可无,一个case语句里只准有一个default项。,例:用case语句实现4位数据的4选1电路。,每一个case语句分项的分支表达式的值必须互不相同,否则就会出现问题,即是同一个表达式,将出现多种方案,而产生矛盾。执行完case分项后的语句,则跳出该case语句结构,终止case语句执行。case语句的所有表达式值的位宽必须相等,只有这样才能进行对应位的比较。针对表达式不确

46、定值X和高阻态Z的情况,提供逐为比较和执行的操作语句如casex和casez。,例:8-3编码器(用条件语句实现,再用case语句),BCD 码七段数码管显示译码器(共阴极显示)module decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec;reg6:0 decodeout;always(indec)begin case(indec)/用case 语句进行译码 4d0:decodeout=7b1111110;4d1:decodeout=7b0110000;4d2:decodeout=7b1101101;4d3:decod

47、eout=7b1111001;4d4:decodeout=7b0110011;4d5:decodeout=7b1011011;4d6:decodeout=7b1011111;4d7:decodeout=7b1110000;4d8:decodeout=7b1111111;4d9:decodeout=7b1111011;default:decodeout=7bx;endcaseendendmodule,module lookup(out,a,b,clk);output3:0 out;input1:0 a,b;input clk;reg3:0 out;reg3:0 address;always(po

48、sedge clk)begin address=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;end

49、case endendmodule,例:查找表方式实现22 乘法,casez语句:casez与case语句语法结构的执行过程完全一样。唯一不同的在于其状况表示:当出现Z及?时,其状况判定课当成不介意,亦出现z或?位时不做比较。,具有优先权的41的选择器module mux_casez(out,a,b,c,d,select);output out;input a,b,c,d;input3:0 select;reg out;always(select or a or b or c or d)begin casez(select)4b?1:out=a;4b?1?:out=b;4b?1?:out=c;

50、4b1?:out=d;endcase endendmodule,casex语句:casex与case语句语法结构的执行过程完全一样。唯一不同的在于其状况表示:当出现Z及?或X时,其状况判定课当成不介意,亦出现z或?或z位时不做比较。,作业,2.62.82.14,循环语句,循环语句只能用在initial、always块中。VerilogHDL有四种循环语句:forfoeeverrepeatwhile,1、for语句 语句格式:for(表达式1;表达式;表达式3)语句;说明:表达式1是初始条件表达式,表达式2是循环终止条件,表达式3是改变循环控制变量的赋值语句语句执行过程,module voter

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号