第三、四讲 Verilog HDL 行为语句
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明: ● 块名即该”块”的名字,一个标识符。 ● 如果有块名,则reg型变量、integer型变量、real型变量等可在语句 块内部声明。带块名的语句块可被引用。
例如: / /产生波形: begin #2 S t r e a m = 1; #5 S t r e a m = 0; #3 S t r e a m = 1; #4 S t r e a m = 0; #2 S t r e a m = 1; #5 S t r e a m = 0; end 说明: 假定顺序语句块在第10个时间单位开始执行。两个时间单位后第1 条语句执行,即第12个时间单位。此执行完成后,下1条语句在第1 7 个时间单位执行(延迟5个时间单位)。然后下1条语句在第2 0个时间单 位执行,以此类推。
end
(四) 条件语句
Verilog HDL中有两类条件语句:
If-else语句
case语句
If-else语句
if 语句是用来判定所给定的条件是否满足,根据判定的 结果(真或假)决定执行给出的两种操作之一。
Verilog HDL语言提供了三种形式的 if 语句。
(1) if(表达式)
语句; 例如: if ( a > b ) out1 = int1;
reg a,b;
例如://产生波形 parameter APPLY_DELAY = 5; reg[ 7 : 0 ] port _ A; initial begin port _ A = 'h20 ; #APPLY_DELAY Port_A= 'hF2; #APPLY_DELAY Port_A= 'h41; #APPLY_DELAY Port_A= 'h0A; end 执行时,port_A的值如下:
说明:posedge,negedge为边沿触发的两个关键字
※每一个always 过程最好只由一种类型的敏感信号来触发, 而不要将边沿敏感型和电平敏感型信号列在一起。
例如:
always @(posedge clk or negedge clr) //两个敏感信号都是边沿型 always @(a or b) //两个敏感信号都是电平型
例如: if(a>b) begin out1<=int1; out2<=int2; end else begin out1<=int2; out2<=int1; end
3) 允许一定形式的表达式简写方式。
例如: if(expression) 等同与 if( expression == 1 ) if(!expression) 等同与 if( expression != 1 )
该串行语句块执行过程中产生的波形:
(三) 赋值语句(重点)
Verilog HDL中有两类赋值语句:
连续赋值语句
过程赋值语句
连续赋值语句
以关键字assign 开头的为连续赋值语句,主要用于对wire型变量进行 赋值。 例如: assign c=a&b; 说明:在上面的赋值语句中,a、b、c三个变量皆为wire型变量,a和b的 任何变化,都将随时反应到c上来。 例如:用连续赋值语句构成一个4位的全加器 module adder_4(a,b,ci,sum,co); input[3:0] a,b; input ci; output[3:0]sum; output co; assign {co,sum}=a+b+ci; endmodule
(2)非阻塞赋值方式
赋值符号为“ < =”。 说明:1)非阻塞赋值符“ <= ”与小于等于符“<= ”看起来是一样的,但意义 完全不同,小于等于符是关系运算符,用于比较大小。而非阻塞赋值符用于 赋值操作。 2)非阻塞赋值方式的特点是:在整个过程块结束时才完成赋值操作。
reg b,c; always @( posedge clk ) begin b=a; c=b; end
最好不要这样用: always @(posedge clk or a )
※边沿触发的always块常常描述时序行为,电平触发的 always块常常用来描述组合逻辑的行为,一个模块中可以有 多个always块,它们都是并行运行着的。因此多个always块 并没有前后之分。
例如://时序电路: always @(negedge clk)
module nblock(c,b,a,clk); input clk,a; output c,b; reg c,b; always @(posedge clk)
*
begin
b=a; c=b; end endmodule
begin
b<=a; c<=b; end endmodule
仿真结果比较:
block模块:
第六章 Verilog HDl 行为语句
Verilog HDL 行为语句
Verilog HDl 行为语句主要包括:
(一) 过程语句
(二) 块语句 (三) 赋值语句 (四) 条件语句
(五) 循环语句
(六) 编译向导语句
(一) 过程语句
在行为建模时,通常使用过程语句。
Verilog HDL中有两类过程语句: Initial过程语句 always过程语句
initial 过程语句
一、作用与特点:
initial语句主要用于初始化和波形生成,initial 过程块中的语句顺序执行且仅 执行一次。
二、语法格式:
initial 语句;
或:
initial begin 语句1; 语句2; ..... 语句n; end
例如:reg Yurt; initial Yurt = 2;
initial begin a=0;b=0; end
always 过程语句
一、特点:
always语句后跟着的语句是否执行,则要看它的触发条件是否满足, 如满足则运行该语句一次,如不断满足则不断地循环执行。
二、语法格式:
always <时序控制> <语句>;
说明: (1) 不带延时控制的always语句:由于always语句是重复执行的,因此下 面的always语句将在0时刻无限循环,这时会发生仿真死锁。 如:always clock = ~ clock; (2) 带延时控制的always语句: 如:always #100 clock = ~ clock; //产生一个50M的时钟。 (3) 带事件控制的always语句:
6)在case语句中,控制表达式与分支表达式的值之间的比较是一种全等
பைடு நூலகம்
比较(===),必须保证两者的对应位全等。
例如:
reg [3:0] a; reg [9:0] result; case(a) 4’d0: result = 10 'b0111111111; 4’d1: result = 10 'b1011111111; 4’d2: result = 10 'b1101111111; 4’d3: result = 10 'b1110111111; 4’d4: result = 10 'b1111011111; 4’d5: result = 10 'b1111101111; 4’d6: result = 10 'b1111110111; 4’d7: result = 10 'b1111111011; 4’d8: result = 10 'b1111111101; 4’d9 : result = 10 'b1111111110; default: result =10 'bx; endcase
“b=c=a”
0 0 0
1 1 1
0 0 0
1 1 1
nblock模块:
“b=a
c =b”
0 0 0 0
1 1 0
0
1 1 0
0
1
(1)阻塞赋值方式
赋值符号为“=”。 阻塞赋值语句执行的过程是:首先计算右端赋值表达式的取值,然 后立即将计算结果赋值给“=”左端的被赋值变量。如果在一个块语句中,有 多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不 能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。
CLK b a D Q c
说明: clk信号的上升沿到来时,将发生如下的变化:b取a的值,c取b的值(即等于a), 对应实际的硬件电路,只用一个触发器来寄存a的值,又输出给b和c。
reg b,c; always @( posedge clk ) begin b<=a; c<=b; end
说明:
CLK a D Q D Q c
begin
if(clr = 1) Q=D;
else
end
Q=0;
说明:此过程语句描述了一个时钟下降沿触发,带低电平有效同步 清零端的一个D触发器。
(二) 块语句
块语句通常用来将两条或多条语句组合在一起,使其在格式上看更象一 条语句。
Verilog HDL中有两类块语句: 串行块begin_end语句 并行块fork_join语句(不讲)
b
当clk信号的上升沿到来时,b就等于a,c就等于b,对应实际的硬件电路,这里用到 了两个触发器。要注意:赋值是在“always”块结束后执行的,c应为原来b的值。
练习:比较下面两例在结果上有什么不同? initial begin A<=B; initial
begin
A=B; B=A; end
B<=A;
(3) if(表达式1)
语句1;
else else
........
if(表达式2) if(表达式3)
语句2; 语句3;
(2) if(表达式)
语句1 ;
else
语句2; 例如: if(a>b) out1 = int1; else out1 = int2;
else if else
(表达式m) 语句m;
语句n;
always @ (敏感信号表达式 ) 块语句
敏感信号表达式 :
又称事件控制器,即当该表达式中变量的值改变时,就会引发块 内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有 信号,它们中间需要用关键字 or 连接 。 敏感信号可以分为两种类型:边沿敏感型、电平敏感型 @(a) @(a or b) @(posedge clock) @(negedge clock) //当电平信号a的值发生变化 //当电平信号a或者b的值发生变化 //当边沿信号clock的上升沿到来时 //当边沿信号clock的下降沿到来时
//连续赋值语句
过程赋值语句
过程赋值语句多用在过程语句当中,一般用于对reg型变量进行 赋值。 过程赋值有阻塞赋值和非阻塞赋值两种方式。
*
module block(c,b,a,clk); input clk,a; output c,b; reg c,b; always @(posedge clk)
case分支项的一般格式如下:
分支表达式: 缺省项(default项):
语句; 语句;
几点说明:
1) case括弧内的表达式称为控制表达式,case分支项中的表达式称为分
支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这 些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。
2)当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的
语句。如果所有的分支表达式的值都没有与控制表达式的值相匹配的,就 执行default后面的语句。
3) default项可有可无,一个case语句里只准有一个default项。 4)每一个case分项的分支表达式的值必须互不相同,否则就会出现矛盾现象。 5) case语句的所有表达式的值的位宽必须相等,只有这样控制表达式和分支表达 式才能进行对应位的比较。
串行块begin_end
串行块(顺序块)有以下特点: 1) 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才 能执行。 2) 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。 3) 直到最后一条语句执行完,程序流程控制才跳出该语句块。 顺序块的格式如下: begin 语句1; 语句2; ..... 语句n; end 或 begin:块名 块内声明语句 ; 语句1; 语句2; ...... 语句n; end
例如: if(a>b) out1 = int1; else if (a==b) out1 = int2; else out1 = int3;
几点说明:
1) 三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表 达式。系统对表达式的值进行判断,若为0,x,z,按“假”处理,若为1,按 “真”处理,执行指定的语句。 2) 在if和else后面可以有多个操作语句,此时用begin和end这两个关键词 将几个语句包含起来成为一个复合块语句。
case 语句
if语句只有两个分支可供选择,case语句是一种多分支选择语句。
case语句有三种表示方式:
1) case(表达式) <case 分支项> endcase
2) casez(表达式) <case 分支项> endcase 3) casex(表达式) <case 分支项> endcase