《Verilog HDL数字系统设计-原理、实例及仿真》课件第4章_第1页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第4章_第2页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第4章_第3页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第4章_第4页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第4章_第5页
已阅读5页,还剩62页未读, 继续免费阅读

下载本文档

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

文档简介

第4章行为级建模方法4.1行为级建模程序结构4.2过程结构语句4.3语句块4.4时序控制4.5赋值语句4.6分支语句4.7循环语句

4.1行为级建模程序结构

行为级建模是指对信号采用行为级的描述(不是结构级的描述)方法来建模。行为级的描述常用于复杂数字逻辑系统的设计中,也就是通过行为级建模把一个复杂的系统分解成可操作的若干个模块,每个模块之间的逻辑关系通过行为模块的仿真加以验证。这样就把一个大的系统合理地分解为若干个较小的子系统,然后将每个子系统用可综合风格的VerilogHDL模块(门级结构或RTL级、算法级、系统级的模块)加以描述。同时,行为级建模也可以用来生成仿真测试信号,对已设计模块进行检测。通过下面的例子,读者可对行为级建模方式有个初步的概念。

例如:一位全加器的行为级建模。通过该例,应建立以下概念:

(1)只有寄存器类型的信号才可以在always和initial语句中进行赋值,类型定义通过reg语句实现;

(2)采用行为级描述方式,即直接采用“+”来描述加法,{Count,Sum}表示对位数的扩展,因为两个1 bit相加,产生的和有两位,低位放在Sum变量中,进位放在Count中;

(3) always语句一直重复执行,由敏感列表(always语句括号内的变量)中的变量触发;

(4) always语句从0时刻开始;

(5)在begin和end之间的语句是顺序执行的,属于串行语句。

4.2过程结构语句

每个过程块是由过程语句(initial或always)和语句块组成的,过程块中有下列部件:过程赋值语句——赋值语句和过程连续赋值语句;时序控制——控制块的执行及块中的语句时序;高级结构(循环,条件语句等)——描述块的功能。

VerilogHDL中的多数过程模块都从属于以下两种过程语句:

initial说明语句;

always说明语句;一个程序模块可以有多个initial和always过程块。每个initial和always说明语句在仿真的一开始即执行。initial语句常用于仿真中的初始化,initial语句只执行一次,而always语句则是不断地重复执行,直到仿真过程结束。always过程语句是可综合的,在可综合的电路设计中广泛采用。4.2.1initial语句

initial语句的语法格式如下:

initial

语句块

其中,语句块的格式为

<块定义语句1>

时间控制1行为语句1;

…

时间控制n行为语句n;

<块定义语句2>

initial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次,参见图4.1。initial语句通常用于仿真模块中对激励信号的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所支持。图4.1initial语句执行顺序

【例4.1】用initial语句在仿真开始时对各变量进行初始化。

【例4.2】用initial语句对存储器进行初始化。4.2.2always语句

always过程块是由always过程语句和语句块组成的,其语法格式如下:

always@<敏感信号表达式>

语句块

其中,语句块的格式为

<块定义语句1>

时间控制1行为语句1;

…

时间控制n行为语句n;

<块定义语句2>以上的格式中:

(1)关键词always表明了该过程块是一个“always过程块”。

(2) @<敏感信号表达式>是可选项,有敏感事件列表的语句块被称为“由事件控制的语句块”,它的执行要受敏感事件的控制。

(3)“时间控制”用来对过程块内各条语句的执行时间进行控制,它可以是任何一种时间控制方式。

(4)语句块中的行为语句可以是如下语句中的一种:过程赋值语句(阻塞型或非阻塞型)、过程连续赋值语句、if条件分支语句、case条件分支语句、循环控制语句(forever、repeat、while、for循环控制语句)、wait等待语句、disable中断语句、事件触发语句、任务调用语句(用户定义的任务或系统任务)。图4.2always语句执行顺序

【例4.3】always语句示例(1)。

always#half_periodareg=~areg;

这个例子生成了一个周期为period(=2*half_period)的无限延续的信号波形,常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。

【例4.4】always语句示例(2)。

4.3语句块

语句块是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以省略。下面分别介绍顺序语句块和并行语句块。4.3.1顺序语句块

顺序语句块(begin-end)的语句按给定次序顺序执行。每条语句中的时延值与其前面语句执行的模拟时间相关。一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。顺序语句块的语法格式如下:图4.3激励波形4.3.2并行语句块

并行语句块(fork-join)内的语句是同时执行的,即程序流程控制一进入到该并行块,块内语句就开始同时执行;块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时刻而言的;延迟时间是用来给赋值语句提供执行时序的;当按时间顺序排序在最后的语句执行完后,或一个disable语句执行时,程序流程控制跳出该程序块。

【例4.5】

并行语句块举例。4.3.3顺序语句块和并行语句块的混合使用

顺序语句块和并行语句块的混合使用有以下两种情况:

(1)当顺序语句块和并行语句块属于不同的过程块(initial或always过程块)时,顺序语句块和并行语句块是并行执行的。

【例4.6】顺序语句块和并行语句块的混合使用示例(1)。图4.4例4.6的激励波形

(2)当顺序语句块和并行语句块嵌套在同一条过程块内时,内层语句块可以看做外层语句块中的一条普通语句,内层语句块在什么时候得到执行是由外层语句块的规则所决定的;内层语句块开始执行后,其内部各条语句的执行要遵守内层语句块的规则。

【例4.7】顺序语句块和并行语句块的混合使用示例(2)。

4.4时序控制

时序控制可以用来对过程块中各条语句的执行时间(时序)进行控制。VerilogHDL提供了两种类型的时序控制。

(1)延时控制:为行为语句的执行指定一个延迟时间。

(2)事件控制:为行为语句的执行指定触发事件时间。事件控制分为两种,即电平敏感事件触发和边沿敏感事件触发。4.4.1延时控制

延时控制的语法格式如下:

#<延迟时间>行为语句;

或

#<延迟时间>;

其中,符号“#”是延时控制的标识符,<延迟时间>是指定的延迟时间量,它是以多个仿真时间单位的形式给出的。

【例4.8】延时控制方式一。

【例4.9】延时控制方式二。4.4.2电平敏感事件触发

电平敏感事件控制方式下启动语句执行的触发条件是指定的条件表达式为真(1)。电平敏感事件控制用关键词“wait”来表示,有以下3种所示:

wait(条件表达式)语句块;

wait(条件表达式)行为语句;

wait(条件表达式);

【例4.10】电平敏感事件控制举例。第三种形式中的wait后没有包含语句块或行为语句,在这种形式下,当仿真进程执行到该wait控制语句条件表达式的值为“真”时,立即结束该wait控制语句的执行,仿真进程继续向下进行。这种形式的电平敏感事件控制常常对顺序语句中各条语句的执行时序进行控制。

程序执行到以下语句时将暂停,直到reset变为真(值为1)时,立即结束该wait控制语句,继续执行后面的语句。

wait(reset);4.4.3边沿敏感事件触发

在边沿敏感事件触发的事件控制方式下,行为语句的执行需要由指定事件的发生来触发,也就是在指定信号的跳变边沿才触发语句的执行,而当信号处于稳定状态时则不会触发语句的执行。

边沿敏感事件控制的语法格式有以下4种:例如:

【例4.11】边沿敏感事件计数器。

【例4.12】二选一多路选择器。

4.5赋值语句

赋值语句可以分为连续赋值语句和过程赋值语句。连续赋值语句是数据流描述方式的赋值语句,而过程赋值语句则是行为描述方式的赋值语句。

过程赋值语句是最常见的赋值形式,等号左侧是赋值目标,右侧是表达式。它有以下几个特点:

(1)过程赋值语句只出现在initial和always语句块内。

(2)过程赋值语句只能给寄存器变量赋值。

(3)赋值表达式的右端可以是任何表达式。

【例4.13】过程赋值语句赋值操作的一般形式。4.5.1连续赋值语句

连续赋值语句用来驱动线网型变量,这一线网型变量必须已经事先定义过。只要输入端操作数的值发生变化,该语句就重新计算并刷新赋值结果,我们可以使用连续赋值语句来描述组合逻辑,而不需要用门电路和互连线。连续赋值语句的语法格式如下:

assignnet_value=expression(表达式);其中:net_value为线网型(wire)变量,expression为赋值操作表达式,可以是常量、由运算符(如逻辑运算符、算术运算符)参与的表达式。例如:

wire[3:0]Z,a,b; //线网说明

assignZ=a&b; //连续赋值语句,给Z赋值

连续赋值语句执行时,只要等号右端的操作数上有事件发生(操作数值的变化),右端表达式即被计算,如果结果值有变化,新结果就赋给等号左端的线网型变量。4.5.2阻塞赋值语句

阻塞赋值的操作符是等号(=),例如:

b=a;

阻塞赋值语句在执行时,先计算右侧表达式的值,然后赋值给等号左端目标,在完成整个赋值之前不能被其他语句打断。也就是说,前面的赋值语句没有完成之前,后面的语句不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。

【例4.14】阻塞赋值语句示例。图4.5阻塞赋值仿真波形4.5.3非阻塞赋值语句

非阻塞赋值的操作符是符号“<=”,例如:

b<=a;

非阻塞过程赋值只能用于寄存器赋值。非阻塞赋值在所在块结束之后才能真正完成赋值操作,如例4.15中,b的值并不是立刻改变的。

【例4.15】非阻塞赋值语句示例。图4.6非阻塞赋值仿真波形

4.6分支语句

4.6.1if-else语句

if语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。VerilogHDL语言提供了三种形式的if语句。

1.第一种形式

if(条件表达式)块语句

说明:

(1)当条件表达式为逻辑真和逻辑1时执行块语句,其他情况下(如为0、x、z)均为条件不成立;

(2)一条没有else语句的if语句映射到硬件上,会形成一个锁存器。例如:

always@(enableordada)

if(enbale)

out=data;

data与out的关系参见表4.1。表4.1if条件表达式的真值表

【例4.16】if-else语句示例。

3.第三种形式

【例4.17】模为60的BCD码计数器。4.6.2case语句

case分支语句是另一种用来实现多路分支选择控制的语句。case分支语句通常用于微处理器指令译码功能的描述和有限状态机的描述。它有case、casez和casex三种形式。其语法格式如下:

【例4.18】一个名为

encod8_3的8-3普通编码器。这个例子描述了一个名为encod8_3

的8-3普通编码器,实现了8位输入、3位输出,在某一时刻只有一个输入被转换为二进制码。

VerilogHDL针对电路的特性还提供了case语句的另外两种形式:casez和casex。其中casez语句忽略比较表达式两边的z部分,casex语句忽略比较表达式两边的x部分和z部分,即在表达式进行比较时,不将该位的状态考虑在内。这样,在case语句表达式进行比较时,就可以灵活地设置对信号的某些位进行比较。例如:

4.7循环语句

4.7.1forev

温馨提示

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

最新文档

评论

0/150

提交评论