第5讲 Verilog HDL行为建模方法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

硬件描述语言
30
repeat循环
• 关键字repeat用来表示这种循环。repeat的功能是执行固 定次数的循环,它不能像while循环那样根据逻辑表达式来 确定循环是否继续进行。repeat循环的次数必须是一个常 量、一个变量或者一个信号。如果循环重复次数是变量或 者信号,循环次数是循环开始执行时变量或者信号的值, 而不是循环执行期间的值。
计算机科学与技术系
f=ab …
Verilog硬件描述语言 Verilog HDL
主讲 陈付龙
2015年
第5讲 Verilog HDL行为建模方法
硬件描述语言
2
学习目标
1. 结构化过程always和initial 2. 定义阻塞(blocking)和非阻塞(non-blocking)过程性赋值语句。 3. 理解行为级建模中基于延迟的时序控制机制。学习使用一般延迟、内嵌赋值 延迟和零延迟。 4. 理解行为级建模中基于事件的时序控制机制。学习使用一般事件控制、命名 事件控制和事件OR(或)控制。 5. 在行为级建模中使用电平敏感的时序控制机制。 6. 使用if和else解释条件语句。 7. 使用case,casex和casez语句讲解多路分支。 8. 理解while,for,repeat和forever等循环语句。 9. 定义顺序块和并行块语句。 10. 理解命名块和命名块的禁用。 11. 在设计实例中进行行为级建模。 硬件描述语言
硬件描述语言
14
• 常规延迟控制 常规延迟控制位于赋值语句的左边,用于指 定一个非零延迟值。
硬件描述语言
15
• 内嵌赋值延迟控制 除了可以将延迟控制置于赋值语句之前,还可以将它嵌入 到赋值语句中,放在赋值符的右边。这种延迟方式的效果 与常规延迟赋值是完全不同的。
硬件描述语言
16
• 零延迟控制 在同一仿真时刻,位于不同always和initial块中的过程语句有可能被同时 计算,但是执行(赋值)顺序是不确定的,与使用的仿真器类型有关 。在这种情况下,零延迟控制可以保证带零延迟控制的语句将在执行 时刻相同的多条语句中最后执行,从而避免发生竞争。但需要注意的 是,如果存在多条带有零延迟的语句,则它们之间的执行顺序也将是 不确定的。
3
5.1 结构化过程语句
• 在Verilog中有两种结构化的过程语句:initial语句和always 语句,它们是行为级建模的两种基本语句。其他所有的行 为语句只能出现在这两种结构化过程语句里。 • 与C语言不同,Verilog在本质上是并发而非顺序的。Verilog 中的各个执行流程(进程)并发执行,而不是顺序执行的 。 • 每个initial语句和always语句代表一个独立的执行过程,每 个执行过程从仿真时间0开始执行,并且这两种语句不能 嵌套使用。
硬件描述语言
18
• 命名事件控制 Verilog语言提供了命名事件控制机制。用户可以在程序中 声明event(事件)类型的变量,触发该变量,并且识别 该事件是否已经发生。命名事件由关键字event声明,它 不能保存任何值。事件的触发用符号-> 表示;判断事件是 否发生使用符号@来识别。
硬件描述语言
硬件描述语言
4
initial语句
• 所有在initial语句内的语句构成了一个initial块。initial块从仿真0 时刻开始执行,在整个仿真过程中只执行一次。 • 如果一个模块中包括了若干个initial块,则这些initial块从仿真0 时刻开始并发执行,且每个块的执行是各自独立的。 • 如果在块内包含了多条行为语句,那么需要将这些语句组成一 组,一般是使用关键字begin和end将它们组合为一个块语句; 如果块内只有一条语句,则不必使用begin和end。 • 由于initial块语句在整个仿真期间只能执行一次,因此它一般被 用于初始化、信号监视、生成仿真波形等目的。
硬件描述语言
29
for循环
• for循环使用关键字for来表示,它由三个部分组成: 1.初始条件; 2.检查终止条件是否为真; 3.改变控制变量的过程赋值语句。 • for循环语句因此它的写法较while循环更为紧凑。但是要 注意,while循环比for循环更为通用,并不是在所有情况 下都能使用for循环来代替while循环。
硬件描述语言
5
硬件描述语言
6
• 在变量声明的同时进行初始化
• 同时进行端口/数据声明和初始化
硬件描述语言
7
always语句
• always语句包括的所有行为语句构成了一个always语句块。该always语 句块从仿真0时刻开始顺序执行其中的行为语句;在最后一条执行完 成后,再次开始执行其中的第一条语句,如此循环往复,直至整个仿 真结束。 • always语句通常用于对数字电路中一组反复执行的活动进行建模。例 如时钟信号发生器,每半个时钟周期时钟信号翻转一次。在现实电路 中只要电源接通,时钟信号发生器从时刻0就有效,一直工作下去。
• 采用阻塞赋值完成
硬件描述语言
13
5.3 基于延迟的时序控制
• Verilog提供了三种时序控制方法:基于延迟的时序控制、基于事件的时 序控制和电平敏感的时序控制。 • 基于延迟的时序控制出现在表达式中,它指定了语句开始执行到执行完 成之间的时间间隔。其格式如下:
• 延迟值可以是数字、标识符或表达式,需要在延迟值前加上关键字#。 对于过程赋值,Verilog提供了三种类型的延迟控制:常规延迟控制、赋 值内嵌延迟控制和零延迟控制。
硬件描述语言
27
casex/casez
• case语句还有两个变形:casex和casez。 • casez语句将条件表达式或候选项表达式中的z作为无关值, 所有值为z的位也可以用“?”来代表,即对非x的位置 • casex语句将条件表达式或候选项表达式中的x作为无关值。 • casex和casez的使用可以让我们在case表达式中只对非x或非z 的位置进行比较。casez的使用与casex的使用类似。
硬件描述语言
8
5.2 过程赋值语句
• 过程赋值语句的更新对象是寄存器、整数、实数或时间变量。 这些类型的变量在被赋值后,其值将保持不变,直到被其他过 程赋值语句赋予新值。 • 用法:
• 过程赋值语句的左侧值可以是: 1. reg,整型数、实型数、时间寄存器变量或存储器单元。 2. 上述各种类型的位选(例如,addr [ 0 ])。 3. 上述各种类型的域选(例如,addr [ 31 : 16 ])。 上面三种类型的拼接。 • Verilog包括两种类型的过程赋值语句:阻塞赋值和非阻塞赋值 语句
硬件描述语言
12
• 使用非阻塞赋值来避免竞争
产生了竞争的情况:a = b和b = a,具体执行顺序的先后取决于 所使用的仿真器,因此这段代 码达不到交换a和b值的目的 。 在每个时钟上升沿到来的时候, 仿真器读取每个操作数的值, 进而计算表达式的值并保存在 临时变量中;当赋值的时候, 仿真器将这些保存的值赋予非 阻塞赋值语句的左侧变量。
硬件描述语言
28
5.7 循环语句
• Verilog语言中有四种类型的循环语句:while,for,repeat和forever。 这些循环语句的语法与C语言中的循环语句相当类似。循环语句只能 在always或initial块中使用,循环语句可以包含延迟表达式。 • while循环 • while循环使用关键字while来表示。while循环执行的中止条件是while 表达式的值为假。如果遇到while语句时while表达式的值已经为假, 那么循环语句一次也不执行。
10
• 非阻塞赋值使用“<=”作为赋值符。
x = 0与y = 1同时执行 仿真0时刻执行
仿真时刻15执行
仿真时刻10执行 仿真0时刻执行
注意:不要在同一个always块中混合使用阻塞和非阻塞赋值语句。 硬件描述语言
11
• •
非阻塞赋值语句的应用 对程序:
• 有如下的特点: 1.在每个时钟上升沿到来时读取in1,in2,in3和reg1,计算右侧表达式的值; 2.对左值的赋值由仿真器调度到相应的仿真时刻,延迟时间由语句中内嵌的延迟 值确定。在本例中,对reg1的赋值需要等一个时间单位,对reg2的赋值需要等到 时钟信号下降沿到来的时刻,对reg3的赋值需要等一个时间单位; 3.每个赋值操作在被调度的仿真时刻完成。注意,对左侧变量的赋值使用的是由 仿真器保存的表达式“旧值”。在本例中,对reg3赋值使用的是reg1的“旧值” ,而不是在此之前对reg1赋予的新值,reg1的“旧值”是在赋值事件调度时由仿 真器保存的。
尽量不要使用零延迟控制 具有零延迟,语句被最后执行,仿 真0时刻结束时,x和y的值都为1, 但它们的执行顺序是不确定的。
硬件描述语言
17
5.4 基于事件的时序控制
• 在Verilog中,事件是指某一个寄存器或线网变量的值发生了变化。 Verilog提供了4种类型的事件控制:常规事件控制、命名事件控制、 OR(或)事件控制和电平敏感时序控制。 • 常规事件控制 事件控制使用符号@来说明,语句继续执行的条件是信号的值发生变化 、发生正向跳变和负向跳变。关键字posedge用于指明正向跳变, negedge用于指明负向跳变。
19
• OR事件控制 有时,多个信号或者事件中发生的任意一个变化都能够触 发语句或语句块的执行。在Verilog语言中,可以使用“或 ”表达式来表示这种情况。由关键词“or”连接的多个事 件名或者信号名组成的列表称为敏感列表。
• 在跳变沿敏感的触发器中,也可以使用关键词“,” 来代替 “or” 。
硬件描述语言
25
• case语句类似于多路选择器,下面使用case 语句实现四选一多路选择器。
硬件描述语言
26
• case语句逐位比较表达式的值和候选项的值,每 一位的值可能是0,1,x或z。上例中只考虑0和1 的情况,将x和z的情况归结为default。我们也可 以将这部分进行单独的说明,如下:
硬件描述语言
23
硬件描述语言
24
5.7 多路分支语句— —case
• 当条件语句中选项的数目很多时,使用if-else语句就会很不方便 ,这时可以使用case语句来解决这个问题。case语句使用关键字 case,endcase和default来表示。语法如下:
• case语句中的每一条分支语句都可以是一条语句或一组语句。 多条语句需要使用关键字begin和end组合为一个块语句。在执 行时,首先计算条件表达式的值,然后按顺序将它和各个候选 项进行比较,如果和全部候选项都不相等,则执行 default_statement语句。注意,default_statement语句是可选的 ,而且在一条case语句中不允许有多条default_statement。另外 ,case语句可以嵌套使用。
• 仿真器连续监视count_enable的值。如果其值为0,则不 执行后面的语句,仿真会停顿下来;如果其值为1,则 在20个时间单位之后执行这条语句。如果count_enable 始终为1,那么count将每20个时间单位加1。
硬件描述语言
22
5.6 条件语句
• 条件语句用于根据某个条件来确定是否执行其后的语句, 关键字if和else用于表示条件语句。Verilog语言共有三种类 型的条件语句,用法如下:
硬件描述语言
9
阻塞赋值语句
• 阻塞赋值语句使用“=”作为赋值符,在一个begin-end块中表现为串行 行为。
x = 0执行完成之后,才会执行y = 1 仿真0时刻执行
仿真时刻15执行
仿真时刻25执行
ห้องสมุดไป่ตู้
1.如果右侧表达式的位宽较宽,则将保留从最低位开始的右侧值,把超过 左侧位宽的高位丢弃; 2.如果左侧位宽大于右侧位宽,则不足的高位补0; 硬件描述语言
硬件描述语言
20
• 如果组合逻辑块语句的输入变量很多,那么编写敏感列表 会很繁琐并且容易出错。针对这种情况,Verilog提供了另 外两个特殊的符号:@*和@(*),它们都表示对其后语句 块中的所有输入变量的变化是敏感的。
硬件描述语言
21
5.5 电平敏感时序控制
• Verilog同时也允许使用另外一种形式表示的电平敏感时 序控制(即后面的语句和语句块需要等待某个条件为真 才能执行)。Verilog语言用关键字wait来表示等待电平 敏感的条件为真。
相关文档
最新文档