当前位置:
文档之家› 第6章 Verilog HDL设计进阶
第6章 Verilog HDL设计进阶
5
第6章 Verilog HDL设计进阶
6.1.3
进一步了解阻塞和非阻塞式赋值的内在规律
6
第6章 Verilog HDL设计进阶
所有的阻塞与非阻塞赋值语句都必须在一个 延时中完成。
阻塞赋值在 延时前就已经按照顺序方式完成所有的赋值更新。 但是所有的非阻塞赋值这时刚进入并完成赋值的第一阶段,且必须 在 延时后同时完成赋值。 可以换个角度来考虑。当过程一启动,到执行完过程中所有类型的
例6-2中,对Q1的多次赋值是允许的,最终Q1获得表达式
C∧A的值。
4
第6章 Verilog HDL设计进阶
说明:
假设A与B在同一时刻从0变化到1。例6-3与例6-4都讲启动过程。 例6-3中最终Q的值是1
例6-4中,3条语句是同时赋值的,因此Q得到的值是M1与M2在A、 B变动以前的值0。
带进位位的循环
不带进位位的循环:循环左移、循环右移
带进位位的循环:带进位位的循环左移、
带进位位的循环右移
24
第6章 Verilog HDL设计进阶
2、普通移位指令特点: 逻辑左移、 算术左移
0 C OPRD
逻辑右移:
0 OPRD C
算术右移:
OPRD C
25
第6章 Verilog HDL设计进阶
always
#10 clock=~clock; //产生周期为20的脉冲
initial #1000 $finish;
endmodule
第6章 Verilog HDL设计进阶
6.3
移位寄存器之Verilog HDL设计
1、移位指令分类
普通移位指令: 逻辑左移、逻辑右移
算术左移、算术右移
循环移位:不带进位位的循环
(3)完成赋值,即实现目标变量的更新。
对于阻塞赋值,这三条是并成一步完成的,即一旦执行,目标变量立即更新。 在同一过程结构中,允许对同一变量多次赋值。
类似于软件语言里面的顺序赋值特点。
1
第6章 Verilog HDL设计进阶
6.1.2
格式:
过程中的非阻塞式赋值
目标变量名 <= 驱动表达式; 在一个串行块中,一条非阻塞型赋值语句的执行,并不影响块中其它语句 的执行。 非阻塞赋值的步骤: ①首先计算出“驱动表达式”的值。(立即完成的,不耗时的)。 ②进入步骤(2)的赋值阶段:等待其它所有的非阻塞语句。程序要执行到 结尾才开始进入步骤(3)。 ③目标变量的更新。所有语句同时被更新。
(* synthesis, probe_port,keep *) reg [7:0] REG8 ;
31
第6章 Verilog HDL设计进阶
6.3.2 移位模式可控的8位移位寄存器设计
32
(接下页)
第6章 Verilog HDL设计进阶
(接上页)
33
第6章 Verilog HDL设计进阶
34
第6章 Verilog HDL设计进阶
"initial"块和"always"块等过程块中。 在同一过程结构中,允许对同一目标变量多次赋值。目标变量最终接 受最接近过程结束的那个驱动源的数据。
阻塞与非阻塞都不允许在作为并行语句的连续赋值语句assign中 3 对同一变量赋值
第6章 Verilog HDL设计进阶
举例:
例6-1中,对Q1的多次赋值是错误的。因为3条assign语句是 并行执行的,Q1的值无法确定。
第6章 Verilog HDL设计进阶
第六章 Verilog HDL 设计进阶
6.1
格式:
过程语句中的赋值语句
过程中的阻塞式赋值
6.1.1
目标变量名 = 驱动表达式; “阻塞”是在当前的赋值语句完成前,阻塞或停止其它语句的执行。
阻塞赋值的步骤:
(1)计算出“驱动表达式”的值。 (2)向“目标变量”进行赋值操作。
6.3.4 使用循环语句设计乘法器
循环语句分类:
for语句
repeat语句 while语句 forever语句
35
第6章 Verilog HDL设计进阶
:
在测试模块中一般用于对时钟的描述,但更多的
是用于对硬件功能模块的行为描述。
功能模块的行为描述是由过程块构成的,但是每
个过程块是由过程语句所引导的,因而每个功能模 块的行为至少存在一个always过程语句。
举例:
module clock_gen(output reg clock); initial clock =1'b0';
一个模块中可以包含多个initial与always 语句,代 表多个过程块的存在,它们之间互相独立,并行运行。
12
1.initial语句
1. initial块从仿真0时刻开始执行,在整个仿真过程中只执行一 次; 2. initial块内部的语句是顺序执行的; 3.如果一个模块里包含多个initial块,则这些initial块从仿真0时 刻开始并发执行,且每个块的执行是各自独立的 4.作用:一般用于初始化、信号监视、生成仿真波形等目的。 5. initial是一条主要面向模拟仿真的过程语句,通常不被综合 工具所接受。
移出去的位到哪里去了。此例中是一到移到QB里面去了。
空出来的位谁来补。此例中没有说,也就是保持。
30
第6章 Verilog HDL设计进阶
(* synthesis, probe_port *) reg [7:0] REG8 ; 因为REG8是中间变量不是端口信号,因此没有仿真信号。为 了也能看到REG8的变化过程。在其定义是前面加上 (* synthesis, probe_port *) 因为REG8信号有可能在综合是被优化掉。因此还需要加上keep 来“保持属性:
module stimulusinitial; reg x,y,a,b,m; 举例: initial begin m=1'b0; $display($time,"m=%b",m); end initial begin #5 a=1'b1; $display($time,"a=%b ",a); #25 b=1'b0; $display($time,"b=%b",b); end initial begin #10 x=1'b0; $display($time,"x=%b",x); #25 y=1'b1; $display($time,"y=%b",y); end initial #50 $finish; endmodul
3、不带进位位的循环移位特点:
循环左移:
循环右移:
C
OPRD
OPRD
C
4、带进位位的循环移位特点: 带进位位的循环左移: 带进位位的循环右移:
C
OPRD
OPRD
C
26
第6章 Verilog HDL设计进阶
Verilog中的移位
<< 左移 A<<n >> 右移 A>>n
移位运算时,移出的空位用‘0’来填补 左移是先补后移,右移是先移后补。 Verilog 2001增加了有符号数的左移<<<与右移>>>。 有符号数的右移,空出的位用符号位填补。有符号数的左移与无符号数 的左移规律一样的。 举例: 4’b1001<<2=6’100100 4’b1001>>4 = 4’b0000 4’b1001<<1 = 5’b10010 1<<6 = 32’b1000000 4’b1001>>1= 4’b0100
#0 #5 # 10 # 30 # 35
m=0 a=1 x=0 b=0 y=1
2.always语句
1. always语句为一无限循环语句 过程只有两种工作状态:执行状态、等待状态
2.过程中的顺序语句具有明显的顺序和并行双重性
在一个always中,10条语句与100条语句的执行时间是一样的。 3.过程语句本身是并行语句
不完整的条件语句会产生时序电路
完整的条件语句可能构成组合电路,也可能构成时序电路。
在例4-1中删除最后两条语句,会在输出口含反馈线路
第6章 Verilog HDL设计进阶
注意: 如果case语句的条件语句中未能“历数”所有条件时,即时使用了default 语句也有可能在综合后的电路中依然出现锁存器。 因为在default语句中未能将在case语句中出现过的所有赋值语句都在 default语句中指明其操作。 举例: module case_test(x,y,m,p,q,j,A,B,C,D,S1,S0); input x,y,m,p,q,j, S1,S0; output A,B,C,D; reg A,B,C,D; always@(x,y,m,p,q,j,S1,S0) begin case ({S1,S0}) 2’B00:A<= x & y; 2’B01:B<=m; 2’B10:C<=p|q; 2’B11:D<=~j; Default:A=0; endcase end endmodule
同一模块中,不同的过程结构是并行运行的。即两个或者多个always语句
是 并行的。 4.一个过程中只允许描述对应于一个时钟信号的同步时序逻辑 一个过程中只描述针对同一时钟的同步时序逻辑。举例4-19,需要两个 always过程来描述两个时钟信号。 不要在同一过程中混用阻塞与非阻塞赋值。 5. 注意不完整条件语句与时序电路的关系
2
第6章 Verilog HDL设计进阶
非阻塞赋值特点
在begin-eng串行块语句中,各条非阻塞过程赋值语句对应的“赋值表 达式”同时开始计算。 在过程块结束时,才将结果赋值给各个“被赋值变量”。 可理解为先同时采样,最后一起赋值。 非阻塞赋值不允许用于连续赋值。