FPGA教程.doc_第1页
FPGA教程.doc_第2页
FPGA教程.doc_第3页
FPGA教程.doc_第4页
FPGA教程.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

第1节 Verilog HDL语言简介Verilog HDL语言简介Verilog HDL和VHDL是目前世界上最流行的两种硬件描述语言(HDL:Hardware Description Language),均为IEEE标准,被广泛地应用于基于可编程逻辑器件的项目开发。二者都是在20世纪80年代中期开发出来的,前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发,后者由美国军方研发。HDL语言以文本形式来描述数字系统硬件结构和行为,是一种用形式化方法来描述数字电路和系统的语言,可以从上层到下层来逐层描述自己的设计思想。即用一系列分层次的模块来表示复杂的数字系统,并逐层进行验证仿真,再把具体的模块组合由综合工具转化成门级网表,接下去再利用布局布线工具把网表转化为具体电路结构的实现。目前,这种自顶向下的方法已被广泛使用。概括地讲,HDL语言包含以下主要特征: HDL语言既包含一些高级程序设计语言的结构形式,同时也兼顾描述硬件线路连接的具体结构。 通过使用结构级行为描述,可以在不同的抽象层次描述设计。HDL语言采用自顶向下的数字电路设计方法,主要包括3个领域5个抽象层次。 HDL语言是并行处理的,具有同一时刻执行多任务的能力。这和一般高级设计语言(例如C语言等)串行执行的特征是不同的。 HDL语言具有时序的概念。一般的高级编程语言是没有时序概念的,但在硬件电路中从输入到输出总是有延时存在的,为了描述这一特征,需要引入时延的概念。HDL语言不仅可以描述硬件电路的功能,还可以描述电路的时序。 2.1.1 Verilog HDL语言的历史1983年,Gateway Design Automation(GDA)硬件描述语言公司的Philip Moorby首创了Verilog HDL。后来Moorby成为Verilog HDL-XL的主要设计者和Cadence公司的第一合伙人。1984至1986年,Moorby设计出第一个关于Verilog HDL的仿真器,并提出了用于快速门级仿真的XL算法,使Verilog HDL语言得到迅速发展。1987年Synonsys公司开始使用Verilog HDL行为语言作为综合工具的输入。1989年Cadence公司收购了Gateway公司,Verilog HDL成为Cadence公司的私有财产。1990年初,Cadence公司把Verilog HDL和Verilog HDL-XL分开,并公开发布了Verilog HDL。随后成立的OVI(Open Verilog HDL International)组织负责Verilog HDL的发展并制定有关标准,OVI由Verilog HDL的使用者和CAE供应商组成。1993年,几乎所有ASIC厂商都开始支持Verilog HDL,并且认为Verilog HDL-XL是最好的仿真器。同时,OVI推出2.0版本的Verilong HDL规范,IEEE则将OVI的Verilog HDL2.0作为IEEE标准的提案。1995年12月,IEEE制定了Verilog HDL的标准IEEE1364-1995。目前,最新的Verilog语言版本是2000年IEEE公布的Verilog 2001标准,其大幅度地提高了系统级和可综合性能。2.1.2 Verilog HDL的主要能力Verilog HDL既是一种行为描述语言,也是一种结构描述语言。如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互连的结构模块。这意味着利用Verilog语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。下面列出的是Verilog语言的主要功能: 可描述顺序执行或并行执行的程序结构; 用延迟表示式或事件表达式来明确地控制过程的启动时间; 通过命名的事件来触发其他过程里的激活行为或停止行为; 提供了条件和循环等程序结构; 提供了可带参数且非零延续时间的任务程序结构; 提供了可定义新的操作符的函数结构; 提供了用于建立表达式的算术运算符、逻辑运算符和位运算符; 提供了一套完整的表示组合逻辑基本元件的原语; 提供了双向通路和电阻器件的描述; 可建立MOS器件的电荷分享和衰减模型; 可以通过构造性语句精确地建立信号模型; 表2-1给出Verilog HDL的表述能力。 表2-1 Verilog HDL语言能力总结此外,Verilog HDL语言还有一个重要特征就是:和C语言风格有很多的相似之处,学习起来比较容易。2.1.3 Verilog HDL和VHDL的区别 Verilog HDL和VHDL都是用于逻辑设计的硬件描述语言。VHDL在1987年成为IEEE标准,Verilog HDL则在1995年才成为IEEE标准,这是因为前者是美国军方组织开发的,而后者则是从民间公司转化而来,要成为国际标准就必须放弃专利。相比而言,Verilog HDL具有更强的生命力。 Verilog HDL和VHDL的相同点在于:都能形式化地抽象表示电路的行为和结构;支持逻辑设计中层次与范围的描述;可以简化电路行为的描述;具有电路仿真和验证机制;支持电路描述由高层到低层的综合转换;与实现工艺无关;便于管理和设计重用。 但Verilog HDL和VHDL又有各自的特点,由于Verilog HDL推出较早,因而拥有更广泛的客户群体、更丰富的资源。Verilog HDL还有一个优点就是容易掌握,如果具有C语言学习的基础,很快就能够掌握。而VHDL需要Ada编程语言基础,一般需要半年以上的专业培训才能够掌握。传统观点认为Verilog HDL在系统级抽象方面较弱,不太适合特大型的系统。但经过Verilog 2001标准的补充之后,系统级表述性能和可综合性能有了大幅度提高。当然,这两种语言也仍处于不断完善的过程中,都在朝着更高级描述语言的方向前进。2.1.4 Verilog HDL设计方法1. 自下而上的设计方法 自下而上的设计是传统的设计方法,是从基本单元出发,对设计进行逐层划分的过程。这种设计方法与用电子元件在模拟实现板上建立一个系统的步骤有密切的关系。优、缺点分别如下: 优点 设计人员对这种设计方法比较熟悉;实现各个子模块所需的时间较短。 缺点 对系统的整体功能把握不足;由于必须先对多个子模块进行设计,因此实现整个系统的功能所需的时间长;另外,对设计人员之间相互协作也有较高的要求。 2自上而下的设计方法 自上而下的设计是从系统级开始,把系统划分为基本单元,然后再把基本单元划分为下一层次的基本单元,直到可用EDA元件实现为止。这种方法的优、缺点如下。 优点 在设计周期开始就做好了系统分析;由于设计的主要仿真和调试过程是在高层完成的,所以能够早期发现结构设计上的错误,避免了设计工作的浪费,方便了系统的划分和整个项目的管理,可减少设计人员劳动,避免了重复设计。 缺点 得到的最小单元不标准,且制造成本高。 3混合的设计方法复杂数字逻辑电路和系统设计过程,通常是以上两种设计方法的结合。设计时需要考虑多个目标的综合平衡。在高层系统用自上而下的设计方法实现,而使用自下而上的方法从库元件或以往设计库中调用已有的设计单元。混合设计方法兼有以上两种方法的优点,并且可使用先进的矢量测试方法。第2节 Verilog HDL基本程序结构第2节 Verilog HDL基本程序结构Verilog HDL基本程序结构用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块,是Verilog的基本描述单位。模块描述某个设计的功能或结构以及与其他模块通信的外部接口,一般来说一个文件就是一个模块,但并不绝对如此。模块是并行运行的,通常需要一个高层模块通过调用其他模块的实例来定义一个封闭的系统,包括测试数据和硬件描述。一个模块的基本架构如下: module module_name (port_list) /声明各种变量、信号 reg /寄存器 wire/线网 parameter/参数 input/输入信号 output/输出信号 inout/输入输出信号 function/函数 task/任务 /程序代码 initial assignment always assignment module assignment gate assignment UDP assignment continous assignment endmodule 说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句用于定义设计的功能和结构。说明部分可以分散于模块的任何地方,但是变量、寄存器、线网和参数等的说明必须在使用前出现。一般的模块结构如下: module () endmodule 其中,用来指定数据对象为寄存器型、存储器型、线型以及过程块。可以是initial结构、always结构、连续赋值或模块实例。下面给出一个简单的Verilog模块,实现了一个二选一选择器。例2-1 二选一选择器(见图2-1)的Verilog实现 图2-1 例2-1所示的二选一电路module muxtwo(out, a, b, s1); input a, b, s1; output out; reg out; always (s1 or a or b) if (!s1) out = a; else out = b; endmodule 模块的名字是muxtwo,模块有个端口:三个输入端口a、b和s1,一个输出端口out。由于没有定义端口的位数,所有端口大小都默认为位;由于没有定义端口a, b, s1的数据类型,这3个端口都默认为线网型数据类型。输出端口out定义为reg类型。如果没有明确的说明,则端口都是线网型的,且输入端口只能是线网型的。第3节 VerilogHDL语言的数据类型和运算符第3节 VerilogHDL语言的数据类型和运算符2.3.1 标志符 标志符可以是一组字母、数字、_下划线和$符号的组合,且标志符的第一个字符必须是字母或者下划线。另外,标志符是区别大小写的。下面给出标志符的几个例子:Clk_100MHz diag_state _ce P_o1_02 需要注意的是,Verilog HDL定义了一系列保留字,叫作关键字,具体资料可查阅相关标准。只有小写的关键字才是保留字,因此在实际开发中,建议将不确定是否是保留字的标志符首字母大写。例如:标志符if(关键字)与标志符IF是不同的。 2.3.2 数据类型数据类型用来表示数字电路硬件中的数据存储和传送元素。Verilog HDL中总共有19种数据类型,本书只介绍4个常用的数据类型:wire型、reg型、memory型和parameter型,其他类型将在后续章节中逐步介绍。1wire型 wire型数据常用来表示以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认为wire型。wire型信号可以用做方程式的输入,也可以用做“assign”语句或者实例元件的输出。 wire型信号的定义格式如下: wire n-1:0 数据名1,数据名2,数据名N; 这里,总共定义了N条线,每条线的位宽为n。下面给出几个例子: wire 9:0 a, b, c; / a, b, c都是位宽为10的wire型信号 wire d; 2reg型 reg是寄存器数据类型的关键字。寄存器是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储器的值。reg型数据常用来表示always模块内的指定信号,代表触发器。通常在设计中要由always模块通过使用行为描述语句来表达逻辑关系。在always块内被赋值的每一个信号都必须定义为reg型,即赋值操作符的右端变量必须是reg型。 reg型信号的定义格式如下: reg n-1:0 数据名1,数据名2,数据名N; 这里,总共定义了N个寄存器变量,每条线的位宽为n。下面给出几个例子: reg 9:0 a, b, c; / a, b, c都是位宽为10的寄存器 reg d; reg型数据的缺省值是未知的。reg型数据可以为正值或负值。但当一个reg型数据是一个表达式中的操作数时,它的值被当作无符号值,即正值。如果一个4位的reg型数据被写入-1,在表达式中运算时,其值被认为是+15。 reg型和wire型的区别在于:reg型保持最后一次的赋值,而wire型则需要持续的驱动。 3memory型 Verilog通过对reg型变量建立数组来对存储器建模,可以描述RAM、ROM存储器和寄存器数组。数组中的每一个单元通过一个整数索引进行寻址。memory型通过扩展reg 型数据的地址范围来达到二维数组的效果,其定义的格式如下: reg n-1:0 存储器名 m-1:0; 其中,reg n-1:0定义了存储器中每一个存储单元的大小,即该存储器单元是一个n位位宽的寄存器;存储器后面的m-1:0则定义了存储器的大小,即该存储器中有多少个这样的寄存器。例如: reg 15:0 ROMA 7:0; 这个例子定义了一个存储位宽为16位,存储深度为8的一个存储器。该存储器的地址范围是0到8。 需要注意的是:对存储器进行地址索引的表达式必须是常数表达式。尽管memory型和reg型数据的定义比较接近,但二者还是有很大区别的。例如,一个由n个1位寄存器构成的存储器是不同于一个n位寄存器的。 reg n-1 : 0 rega; / 一个n位的寄存器 reg memb n-1 : 0; / 一个由n个1位寄存器构成的存储器组 一个n位的寄存器可以在一条赋值语句中直接进行赋值,而一个完整的存储器则不行。 rega = 0; / 合法赋值 memb = 0; / 非法赋值 如果要对memory型存储单元进行读写必须要指定地址。例如: memb0 = 1; / 将memeb中的第0个单元赋值为1。 reg 3:0 Xrom 4:1; Xrom1 = 4h0; Xrom2 = 4ha; Xrom3 = 4h9; Xrom4 = 4hf; 4parameter型 在Verilog HDL中用parameter来定义常量,即用parameter来定义一个标志符表示一个常数。采用该类型可以提高程序的可读性和可维护性。 parameter型信号的定义格式如下: parameter 参数名1 = 数据名1; 下面给出几个例子: parameter s1 = 1; parameter 3:0 S0=4h0, S1=4h1, S2=4h2, S3=4h3, S4=4h4; 2.3.3 模块端口 模块端口是指模块与外界交互信息的接口,包括3种类型: input: 模块从外界读取数据的接口,在模块内不可写。 output:模块往外界送出数据的接口,在模块内不可读。 inout:可读取数据也可以送出数据,数据可双向流动。 2.3.4 常量集合Verilog HDL有下列4种基本的数值: 0:逻辑0或“假” 1:逻辑1或“真” x:未知 z:高阻 其中x、z是不区分大小写的。Verilog HDL中的数字由这四类基本数值表示。 Verilog HDL中的常量分为3类:整数型、实数型以及字符串型。下划线符号“_”可以随意用在整数和实数中,没有实际意义,只是为了提高可读性。例如:56等效于5_6。 1整数 整数型可以按如下两种方式书写:简单的十进制数格式以及基数格式。(1)简单的十进制格式 简单的十进制数格式的整数定义为带有一个“+”或“-”操作符的数字序列。下面是这种简易十进制形式整数的例子。 45 十进制数45 -46 十进制数-46 简单的十进制数格式的整数值代表一个有符号的数,其中负数可使用两种补码形式表示。例如,32在6位二进制形式中表示为100000,在7位二进制形式中为0100000,这里最高位0表示符号位;-15在5位二进制中的形式为10001,最高位1表示符号位,在6位二进制中为110001,最高位1为符号扩展位。(2)基数表示格式 基数格式的整数格式为: 长度 基数 数值 长度是常量的位长,基数可以是二进制、十进制、十六进制之一。数值是基于基数的数字序列,且数值不能为负数。下面是一些具体实例: 6b9 6位二进制数 5o9 5位八进制数 9d6 9位十进制数 2实数 实数可以用下列两种形式定义: (1)十进制计数法,例如: 2.0 16539.236 (2)科学计数法 这种形式的实数举例如下,其中e与E相同。 235.12e2 其值为23512 5e-4 其值为0.0005 根据Verilog语言的定义,实数通过四舍五入隐式地转换为最相近的整数。3字符串 字符串是双引号内的字符序列。字符串不能分成多行书写。例如: “counter” 用8位ASCII值表示的字符可看作是无符号整数,因此字符串是8位ASCII值的序列。为存储字符串“counter”,变量需要 位。reg 1: 8*7 Char; Char = counter; 2.3.5 运算符和表达式 在Verilog HDL语言中运算符所带的操作数是不同的,按其所带操作数的个数可以分为三种: 单目运算符:带一个操作数,且放在运算符的右边。 双目运算符:带两个操作数,且放在运算符的两边。 三目运算符:带三个操作数,且被运算符间隔开。Verilog HDL语言参考了C语言中大多数算符的语法和句义,运算范围很广,其运算符按其功能分为下列9类: 1 基本算术运算符 在Verilog HDL中,算术运算符又称为二进制运算符,有下列5种: 加法运算符或正值运算符,如:s1+s2; +5; 减法运算符或负值运算符,如:s1-s2; -5; * 乘法运算符,如s1*5; 除法运算符,如s1/5; % 模运算符,如s1%2; 在进行整数除法时,结果值要略去小数部分。在取模运算时,结果的符号位和模运算第一个操作数的符号位保持一致。例如: 运算表达式 结果 说明 12.5/3 4 结果为4,小数部分省去 12%4 0 整除,余数为0 -15%2 -1 结果取第一个数的符号,所以余数为-1 13/-3 1 结果取第一个数的符号,所以余数为1 注意:在进行基本算术运算时,如果某一操作数有不确定的值X,则运算结果也是不确定值X。 2 赋值运算符 赋值运算分为连续赋值和过程赋值两种。(1)连续赋值 连续赋值语句和过程块一样也是一种行为描述语句,有的文献中将其称为数据流描述形式,但本书将其视为一种行为描述语句。 连续赋值语句只能用来对线网型变量进行赋值,而不能对寄存器变量进行赋值,其基本的语法格式为: 线网型变量类型 线网型变量位宽 线网型变量名; assign #(延时量) 线网型变量名 = 赋值表达式; 例如: wire a; assign a = 1b1; 一个线网型变量一旦被连续赋值语句赋值之后,赋值语句右端赋值表达式的值将持续对被赋值变量产生连续驱动。只要右端表达式任一个操作数的值发生变化,就会立即触发对被赋值变量的更新操作。 在实际使用中,连续赋值语句有下列几种应用: 对标量线网型赋值 wire a, b; assign a = b; 对矢量线网型赋值 wire 7:0 a, b; assign a = b; 对矢量线网型中的某一位赋值 wire 7:0 a, b; assign a3 = b1; 对矢量线网型中的某几位赋值 wire 7:0 a, b; assign a3:0 = b3:0; 对任意拼接的线网型赋值 wire a, b; wire 1:0 c; assign c =a ,b; (2)过程赋值 过程赋值主要用于两种结构化模块(initial模块和always模块)中的赋值语句。在过程块中只能使用过程赋值语句(不能在过程块中出现连续赋值语句),同时过程赋值语句也只能用在过程赋值模块中。过程赋值语句的基本格式为: 其中,是“=”或“ 大于 = 大于等于 小于 =2 ) ? 1 : (a =2时,s=1;当a 0时,s=2;在其余情况,s=0。 6 位运算符 作为一种针对数字电路的硬件描述语言,Verilog HDL用位运算来描述电路信号中的与、或以及非操作,总共有7种位逻辑运算符: 非 & 与 | 或 异或 同或 & 与非 | 或非 位运算符中除了“”,都是二目运算符。位运算对其自变量的每一位进行操作,例如:s1&s2的含义就是s1和s2的对应位相与。如果两个操作数的长度不相等的话,将会对较短的数高位补零,然后进行对应位运算,使输出结果的长度与位宽较长的操作数长度保持一致。例如: s1 = s1; var = ce1 & ce2; 7 移位运算符 移位运算符只有两种:“”(右移),左移一位相当于乘2,右移一位相当于除2。其使用格式为: s1 N 其含义是将第一个操作数s1向左(右)移位,所移动的位数由第二个操作数N来决定,且都用0来填补移出的空位。 在实际运算中,经常通过不同移位数的组合来计算简单的乘法和除法。例如s1*20,因为20=16+4,所以可以通过s14+s12来实现。8 拼接运算符拼接运算符可以将两个或更多个信号的某些位并接起来进行运算操作。其使用格式为:s1, s2, , sn 将某些信号的某些位详细地列出来,中间用逗号隔开,最后用一个大括号表示一个整体信号。 在工程实际中,拼接运算受到了广泛使用,特别是在描述移位寄存器时。例2-3 给出拼接符的Verilog实例 reg 15:0 shiftreg; always ( posedge clk) shiftreg 15:0 = shiftreg 14:0, data_in; 9 一元约简运算符 一元约简运算符是单目运算符,其运算规则类似于位运算符中的与、或、非,但其运算过程不同。约简运算符对单个操作数进行运算,最后返回一位数,其运算过程为:首先将操作数的第一位和第二位进行与、或、非运算;然后再将运算结果和第三位进行与、或、非运算;依次类推直至最后一位。常用的约简运算符的关键字和位操作符关键字一样,仅仅由单目运算和双目运算的区别。例2-4 给出一元简约运算符的Verilog实例reg 3:0 s1; reg s2; s2 = &s1; /&即为一元约简运算符“与” 第4节 Verilog HDL语言的描述语句第4节 Verilog HDL语言的描述语句2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: and nand nor or xor xnor buf not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型 (输出,输入1,输入2,,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; / 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3); endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a end_wave; /语句5,触发事件end_wave end 串行块的执行特点如下: 串行块内的各条语句是按它们在块内的语句逐次逐条顺序执行的,当前一条执行完之后,才能执行下一条。如上例中语句1至语句5是顺序执行的。 块内每一条语句中的延时控制都是相对于前一条语句结束时刻的延时控制。如上例中语句2的时延为2d。 在进行仿真时,整个语句块总的执行时间等于所有语句执行时间之和。如上例中语句块中总的执行时间为5d。 (2)forkjoin,用来组合需要并行执行的语句,被称为并行块。例如: parameter d = 50; reg7:0 r; fork /由一系列延迟产生的波形 # d r = h35 ; /语句1 # 2d r = hE2 ; /语句2 # 3d r = h00 ; /语句3 # 4d r = hF7 ; /语句4 # 5d end_wave; /语句5,触发事件end_wave join 并行块的执行特点为: 并行语句块内各条语句是各自独立地同时开始执行的,各条语句的起始执行时间都等于程序流程进入该语句块的时间。如上例中语句2并不需要等语句1执行完才开始执行,它与语句1是同时开始的。 块内每一条语句中的延时控制都是相对于程序流程进入该语句块的时间而言的。如上例中语句2的延时为2d。 在进行仿真时,整个语句块总的执行时间等于执行时间最长的那条语句所需要的执行时间,如上例中整个语句块的执行时间为5d。 (3)混合使用 在分别对串行块和并行块进行了介绍之后,还需要讨论一下二者的混合使用。混合使用可以分为下面两种情况。 串行块和并行块分别属于不同的过程块时,串行块和并行块是并行执行的。例如一个串行块和并行块分别存在于两个initial过程块中,由于这两个过程块是并行执行的,所以其中所包含的串行语句和并行语句也是同时并行执行的。在串行块内部,其语句是串行执行的;在并行块内部,其语句是并行执行的。 当串行块和并行块嵌套在同一过程块中时,内层语句可以看作是外层语句块中的一条普通语句,内层语句块什么时候得到执行是由外层语句块的规则决定的;而在内层语句块开始执行时,其内部语句怎么执行就要遵守内层语句块的规则。 3时序控制 Verilog HDL提供了两种类型的显示时序控制,一种是延迟控制,在这种类型的时序控制中通过表达式定义开始遇到这一语句和真正执行这一语句之间的延迟时间。另外一种是事件控制,这种时序控制是通过表达式来完成的,只有当某一事件发生时才允许语句继续向下执行。(1)延时控制 延时控制的语法如下: # 延时数 表达式; 延时控制表示在语句执行前的“等待时延”,下面给出一个例子: initial begin #5 clk = clk; end 延时控制只能在仿真中使用,是不可综合的。在综合时,所有的延时控制都会被忽略。(2)事件控制事件控制分为两种:边沿触发事件控制和电平触发事件控制。 边沿触发事件是指指定信号的边沿信号跳变时发生指定的行为,分为信号的上升沿和下降沿控制。上升沿用posedge关键字来描述,下降沿用negedge关键字描述。边沿触发事件控制的语法格式为:第一种:() 行为语句; 第二种:( or or or ) 行为语句; 例2-10 边沿触发事件计数器 reg 4:0 cnt; always (posedge clk) begin if (reset) cnt = 0; else cnt = cnt +1; end 上面这个例子表明:只要clk信号有上升沿

温馨提示

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

评论

0/150

提交评论