虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
一、学习内容
这节主要是学习了赋值语句和块语句两部分。
二、赋值语句
表中只有4种语句不可综合(fork_join ,initial ,’include ,’timescale )。
(1)两类
- 连续赋值语句——assign语句,用于对wire型变量赋值,是描述组合逻辑最常用的方法之一
【例1】 assign c = a&b; //a、b、c均为wire型变量 - 过程赋值语句——用于对reg型变量赋值,有两种方式:
非阻塞(non-blocking)赋值方式:赋值符号为<=,如 b <= a ;
阻塞(blocking)赋值方式:赋值符号为=,如 b = a ;
(2)非阻塞赋值和阻塞赋值的区别
- 非阻塞赋值
always @(posedge clk)begin
b <= a;
c <= b;
end
非阻塞赋值在块结束时才完成赋值操作,c的值比b落后一个时钟周期。
- 阻塞赋值
always @(posedge clk)begin
b = a;
c = b;
end
阻塞赋值在每一条语句结束时即完成赋值操作。在一个语句块中,如果有多条阻塞赋值语句,在前面的赋值语句还没有完成之前,后面的语句就不能被执行,就像被阻塞一样,因此称为阻塞赋值方式,这里的b和c的值一样。
三、块语句
用来将两条或多条语句组合在一起,使其在格式上更像一条语句,以增加程序的可读性。块语句有两种:begin_end语句——标识顺序执行的语句;fork_join语句——标识并行执行的语句
(1)顺序块
块内的语句是顺序执行的;每条语句的延迟时间是相对于前一条语句的仿真时间而言的;直到最后一条语句执行完,程序流程控制才跳出该顺序块。
begin begin
语句1; 块内声明语句;
语句2; 或 语句1;
... ...
语句n; 语句n;
end end
注:块内声明语句可以是参数声明、reg型变量声明、integer型变量声明、real型变量声明语句。
begin
b = a;
c = b;//实际上是a的值给了c
end
begin
b = a;
#10 c = b;//在两条赋值语句间延时10个时间单位
end
注:这里的标识符“#”表示延时,在模块调用中“#”表示参数传递。
【例2】用顺序块和延时控制组合产生一个时序波形
parameter d =50;
reg [7:0] r;
begin
#d r = 'h35;
#d r = 'hE2;
#d r = 'h00;
#d r = 'hF7;
#d r -> end_wave;//触发事件end——wave
end
注:每条语句的延时时间d是相对前一条语句的仿真时间而言的,按顺序执行
(2)并行块
块内的语句是同时执行的;块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间而言的;延迟时间用于给赋值语句提供时序;当按时间排序在最后的语句执行完或一个disable语句执行时,程序流程控制跳出该并行块。
fork fork
语句1; 块内声明语句;
语句2; 或 语句1;
... ...
语句n; 语句n;
join join
注:块内声明语句可以是参数声明、reg型变量声明、integer型变量声明、real型变量声明语句、time型变量声明语句和事件(event)说明语句。
【例 3】
reg [7:0] r;
fork
#50 r = 'h35;
#100 r = 'hE2;
#150 r = 'h00;
#200 r = 'hF7;
#250 r -> end_wave;//触发事件end——wave
join
注:在fork-join块内,各条语句可不按照顺序给出,因为块内语句是同时执行的,不分先后。
四、思考和小结
(1)思考
- 逻辑运算符与按位逻辑运算符有什么不同?
- 阻塞赋值与非阻塞赋值的区别
- 哪些块语句是不可综合的?
(2)小结
作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。