时间控制和赋值语句_第1页
时间控制和赋值语句_第2页
时间控制和赋值语句_第3页
时间控制和赋值语句_第4页
时间控制和赋值语句_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 行为描述(二):时间控制和赋值语句 第第6章行为描述章行为描述(二二):时间控制和赋值语句:时间控制和赋值语句 6.1 时间控制时间控制 6.2 赋值语句赋值语句 第6章 行为描述(二):时间控制和赋值语句 6.1 时时 间间 控控 制制时间控制可以用来对过程块中各条语句的执行时间(时序)进行控制。时间控制可以分为两类:(1) 延时控制:为行为语句的执行指定一个延时时间的时间控制方式。(2) 事件控制:为行为语句的执行指定触发事件的时间控制方式。其中事件控制方式又可以分成两类:边沿触发事件控制和电平敏感事件控制。第6章 行为描述(二):时间控制和赋值语句 6.1.1 延时控制延时控制延

2、时控制的格式为:# 行为语句;或 # ;其中:符号“#”是延时控制的标识符;“”是直接指定的延迟时间量,它是以多少个仿真时间单位的形式给出的,可以是一个立即数、变量或表达式。第6章 行为描述(二):时间控制和赋值语句 1. 第一种形式的延时控制语句第一种形式的延时控制语句的后面跟着一条行为语句。在这种情况下,仿真进程在遇到这条带有延时控制的行为语句后并不立即执行行为语句指定的操作,而是要延迟等待到“”所指定的时间量过去后才真正开始执行行为语句指定的操作,如例6-1所示的程序。第6章 行为描述(二):时间控制和赋值语句 【例例6-1】第一种形式的延时控制语句。module clk_gen(clk

3、);output clk;reg clk;initialbeginclk=0; /语句S1#10 clk = 1; /语句S2#20 clk = 0; /语句S3#30 clk = 1; /语句S4endendmodule第6章 行为描述(二):时间控制和赋值语句 表 6.1 例 6-1 进行仿真时的程序控制流程和输出信号 clk 的变化情况 时 间 程序控制流程 输出 clk 0 进入串行块,进入 S1, 执行 S1 后进入 S2 0 10 退出 S2 后进入 S3 1 30 退出 S3 后进入 S4 0 60 退出 S4,退出串行块 1 第6章 行为描述(二):时间控制和赋值语句 2. 第

4、二种形式的延时控制语句第二种形式的延时控制语句在“”后面没有出现任何行为语句,而只有一个语句结束符号“;”。仿真进程在遇到这条延时控制语句后不执行任何操作,而是进入一种等待状态,等到过了由“”所指定的时间量后仿真流程,结束这条延时控制语句的执行。这种形式的延时语句出现在串行块和并行块中时产生的作用是不同的,下面我们举例说明。第6章 行为描述(二):时间控制和赋值语句 【例例6-2】第二种形式的延时控制语句使用于串行块。module clk_gen(clk);output clk;reg clk;initial begin /串行块clk=0; /语句S1#10 clk = 1; /语句S2#1

5、0 ; /语句S3#10 clk = 0; /语句S4#30 clk = 1; /语句S5endendmodule第6章 行为描述(二):时间控制和赋值语句 表 6.2 例 6-2 仿真时的程序控制流程和输出信号 clk 的变化情况 时 间 程序控制流程 输出 clk 0 进入串行块,然后进入 S1, 退出 S1 后进入 S2 0 10 退出 S2, 进入 S3(进入延时) 1 20 (延时结束)退出 S3, 进入 S4 不变,仍为 1 30 退出 S4,进入 S5 0 60 退出 S5,退出串行块 1 第6章 行为描述(二):时间控制和赋值语句 在例6-2的执行中我们可以看出:第二种形式的延

6、时控制语句在串行块中的作用是使该控制语句后的下一条语句的执行时刻延迟了指定的时间量。因此,如下语句:begin#10 ; a=b ; end 将等价于下面这一条语句:#10 a=b; 下面我们给出另一个例子来说明第二种形式的延时控制语句在并行块中使用的情况。第6章 行为描述(二):时间控制和赋值语句 【例例6-3】第二种形式的延时控制语句使用于并行块。module clk_gen(clk);output clk;reg clk;initial fork/并行块clk=0;/语句P1#10 clk = 1;/语句P2#10 ;/语句P3#20 clk = 0;/语句P4#30 clk = 1;/

7、语句P5joinendmodule第6章 行为描述(二):时间控制和赋值语句 程序控制流程是在执行时间最长的那条语句(语句P5)执行完毕后(t30时刻)才退出fork-join并行块。表 6.3 例 6-3 所示代码以及将其修改后的代码在进行仿真时的执行情况 时间 程序控制流程(修改前) 输出 clk(修改前) 程序控制流程(修改后) 输出 clk(修改后) 0 同时进入 P1P5,退出 P1 0 同时进入 P1P5,退出 P1 0 10 同时退出 P2,P3 1 退出 P2 1 20 退出 P4 0 退出 P4 0 30 退出 P5,退出并行块 1 退出 P5 1 40 已离开并行块 退出

8、P3,然后退出并行块 不变,仍为 1 第6章 行为描述(二):时间控制和赋值语句 ”这一项还可以是一个变量或表达式,而不必将其局限于某一立即数,比如:initialbegin : SEQ_1parameter DELAY_TIME=50 ;#DELAY_TIME out_1=0; /第一条赋值语句#(DELAY_TIME / 2) out_2=1; /第二条赋值语句end第6章 行为描述(二):时间控制和赋值语句 当“”是由一个变量或由一个表达式表示时,有可能出现该变量或表达式的值为负值以及取值为x或z的情况。Verilog语法规定:如果代表延时时间的变量或表达式的值为x或z,那么该延时控制等

9、效于零时延控制;如果代表延时时间的变量或表达式的值为负值,则以该负值的二进制补码值作为实际的延时量。第6章 行为描述(二):时间控制和赋值语句 6.1.2 边沿触发事件控制边沿触发事件控制事件控制方式是时间控制的另一种方式。在这种时间控制方式下,行为语句的执行需要由指定事件的发生来触发,该事件被称为“触发事件”。在always语句块格式中所使用的敏感事件列表就是一种事件控制。事件控制方式不仅能用于always语句块,而且还可以用于其它的行为语句。事件控制方式又可以进一步分成两类:边沿触发事件控制和电平敏感事件控制。第6章 行为描述(二):时间控制和赋值语句 1. 边沿触发事件控制边沿触发事件控

10、制这一类时间控制方式在指定的信号变化时刻,也就是在指定的信号的跳变边沿才触发语句的执行;而当信号处于稳定状态时则不会触发语句的执行。边沿触发事件控制的语法格式可以为如下几种:第一种: () 行为语句;第二种: () ; 第三种: ( or or or) 行为语句;第四种: ( or or or) ; 第6章 行为描述(二):时间控制和赋值语句 符号“”是边沿触发事件控制的标识符,“事件表达式”代表着触发语句执行的触发事件;而“行为语句”则指出了触发事件所要触发执行的具体操作。第6章 行为描述(二):时间控制和赋值语句 1) 事件表达式事件表达式可以是如下三种形式之一: 。 posedge 。

11、negedge 。其中,“”可以是任何数据类型的标量或矢量。(1) 第一种事件表达式形式:代表的触发事件是“”所指定的信号发生了某种逻辑变化。它是信号除了保持稳定态以外的任意一种变化过程。比如语句: (reg_a) reg_b=reg_a;第6章 行为描述(二):时间控制和赋值语句 (2) 第二种事件表达式形式:在“”前面加上了一个关键词“posedge”。这种形式代表的触发事件是“”所指定的信号发生了正跳变。所谓“正跳变”就是发生如下逻辑转换中的一种:0 x0z01x1z1比如语句: (posedge reg_a) reg_b=reg_a;第6章 行为描述(二):时间控制和赋值语句 (3)

12、第三种事件表达式形式:在“”前面加上了一个关键词“negedge”。这种形式代表的触发事件是“”所指定的信号发生了负跳变。所谓“负跳变”就是发生如下逻辑转换中的一种:1x1z10 x0z0比如语句: (negedge reg_a) reg_b=reg_a;第6章 行为描述(二):时间控制和赋值语句 2) 语法格式(1) 边沿触发事件控制的第一种语法格式: () 行为语句;这种语法格式的敏感事件列表内只包含了一个触发事件,只有当这个指定的触发事件发生之后,后面的行为语句才能启动执行;在仿真进程中遇到这种带有事件控制的行为语句时,如果指定的触发事件还没有发生,则仿真进程就会停留在此处等待,直到指定

13、触发事件发生之后再启动执行后面的行为语句,仿真进程继续向下进行。第6章 行为描述(二):时间控制和赋值语句 【例例6-4】时钟脉冲计数器。module clk_counter(clk,count_out);input clk,output count_out;reg 3:0 count_out;initial count_out=0; /给count_out赋初值0always ( posedge clk ) count_out=count_out+1;/在clk的每个正跳变边沿count_out增加1endmodule第6章 行为描述(二):时间控制和赋值语句 (2) 边沿触发事件控制的第二

14、种语法格式: () ; 这种语法格式与前面的第一种语法格式一样只指定了一个触发事件,但是在这种格式中没有行为语句来指定触发事件发生时要执行的操作。第6章 行为描述(二):时间控制和赋值语句 【例例6-5】用于测定输入时钟正电平,负电平持续时间以及时钟周期的模块。module clk_time_mea(clk );input clk;time pos_edge_time,neg_edge_time;time high_last_time,low_last_time,last_time;initial begin (posedge clk) ; /* 等待,直到时钟发生正跳变后退出等待状态,继续执

15、行下一条语句 */pos_edge_time=$time; (negedge clk) ; /* 等待,直到时钟发生负跳变后退出等待状态,继续执行下一条语句 */neg_edge_time=$time;第6章 行为描述(二):时间控制和赋值语句 (posedge clk) ; /* 等待,直到时钟再次正跳变后退出等待状态,继续执行下一条语句 */last_time=$time- pos_edge_time ;high_last_time= neg_edge_time pos_edge_time ;low_last_time= last_time- high_last_time;$display

16、(“The clk stay in High level for:%t”,high_last_time );$display(“The clk stay in Low level for:%t”,low_last_time );$display(The clk signal Period is :%t,last_time ); endendmodule 第6章 行为描述(二):时间控制和赋值语句 (3) 边沿触发事件控制的第三种语法格式: ( or or or ) 行为语句; 只要这些触发事件中的任何一个得到发生,就启动行为语句的执行。【例例6-6】边沿触发事件控制语句的例子。 initial

17、 begin a=1; (posedge clk1 or negedge clk2 or b) a=b; end第6章 行为描述(二):时间控制和赋值语句 (4) 边沿触发事件控制的第四种语法格式: ( or or or ) ;仿真进程在遇到这条事件控制语句后会进入等待状态,直到敏感事件列表所包含的多个触发事件中的任何一个得到发生后才结束等待状态,退出该事件控制语句并开始执行该事件控制语句后的下一条语句。第6章 行为描述(二):时间控制和赋值语句 【例例6-7】连续监测信号a或b发生变化的时间。module display_information_of_change(a,b);input a,

18、b;wire a,b;always /always过程块,重复进行监测 begin (a or b ); /* 等待,直到a或b发生变化后退出等待状态, 并开始下一条语句的执行 */ $display (One of a and b changed in time:%t,$time); endendmodule第6章 行为描述(二):时间控制和赋值语句 例6-7中begin-end串行块内的两条语句可以用如下一条语句替换: (a or b ) $display (One of a and b changed in time:%t,$time) ; 第6章 行为描述(二):时间控制和赋值语句 2

19、. 敏感事件列表在敏感事件列表在always过程块中的使用过程块中的使用always过程块可以带有事件控制。带有事件控制的always过程块既可以实现组合逻辑又可以实现时序逻辑;在用于实现这两种不同逻辑功能种类时,always过程块内的敏感事件列表会具有不同的特点。下面分别加以讨论。1) 用always过程块实现组合逻辑功能 (1) 事件表达式内不能包含“posedge”和“negedge”关键词。 。 因为组合逻辑电路的输出是由输入电平所决定的,输入不同的跳变方式对输出不会产生任何影响,因此敏感事件列表中的事件表达式不能是其余两种对跳变边沿加以指定的形式。 第6章 行为描述(二):时间控制和

20、赋值语句 (2) 组合逻辑的所有输入信号都要作为“”出现在敏感事件列表中。组合逻辑电路的输入输出关系在每个时刻都应该是严格成立的,也就是说,无论什么时刻输入发生了变化,在输出端都应该立即有反应。第6章 行为描述(二):时间控制和赋值语句 【例例6-8】不能正确实现三输入与门的模块。module three_input_and(a,b,c,out);input a,b,c ; /三个输入a,b,coutput out;reg out;always (a or b) /敏感事件列表中只包含了两个输入: a,b begin out=a & b & c; endendmodule第6章

21、 行为描述(二):时间控制和赋值语句 【例例6-9】正确实现三输入与门的模块。module three_input_and (a,b,c,out);input a,b,c ; /三个输入a,b,coutput out;reg out;always (a or b or c) /敏感事件列表中包含了所有输入 begin out=a & b & c; endendmodule第6章 行为描述(二):时间控制和赋值语句 【例例6-10】利用敏感事件列表来对组合逻辑建模。module selective_adder_and_multiplier(a,b,sel,y);input a,b

22、,sel;output y;wire3:0 a,b;reg7:0 y;always (a or b or sel) begin if (sel=0) y = a + b; else if(sel=1) y = a * b; endendmodule第6章 行为描述(二):时间控制和赋值语句 2) 用always过程块实现时序逻辑功能(1) 事件表达式可以是事件表达式三种形式中的任何一种,也就是说所采用的事件表达式既可以是带有“posedge”或“negedge”关键词,也可以是只包含“信号名” 的事件表达式。 (2) 不要求所有的输入信号都出现在敏感事件列表的“信号名”中。这是由于时序逻辑电路

23、逻辑状态的改变只发生在某个或某几个时钟输入信号的变化边沿,而在其它输入信号发生变化时电路逻辑状态保持不变。第6章 行为描述(二):时间控制和赋值语句 【例例6-11】时钟下降沿触发的D触发器。module d_ff(q,clk,d);input clk,d;output q;reg q;always ( negedge clk) begin q=d; endendmodule 第6章 行为描述(二):时间控制和赋值语句 【例例6-12】同时由两个时钟沿:clk1上升沿和clk2下降沿进行控制的8位移位寄存器。module 8bits_shift_register(d_in,d_out,clk1

24、,clk2);input clk1,clk2,d_in;output d_out;reg d_out; /d_out保存1bitreg1:7 data; / reg1:7保存其余7bitsreg1:4 i ; / i用于循环计数always ( posedge clk1 or negedge clk2) begin d_out=data1; for ( i=1;i7;i=i+1) datai=datai+1; data7=d_in; endendmodule第6章 行为描述(二):时间控制和赋值语句 3) always过程块实现组合和时序混合的逻辑功能可以在一个模块中建立多个并行结构来实现。用

25、一个或多个带有事件控制的always过程块来实现时序逻辑部分的功能;再用连续赋值语句或另外一个(或多个)always过程块来实现组合逻辑部分功能。在组合逻辑和时序逻辑混合的情况下,模块逻辑状态和输出发生变化时刻要同时受时钟信号跳变沿和某些输入控制信号的控制,典型的例子是带有异步置位(清零)控制输入的时钟边沿触发器。比如一个带有异步清零控制输入位clr的时钟上升沿T触发器,其输入输出真值表如表6.4所示。第6章 行为描述(二):时间控制和赋值语句 第6章 行为描述(二):时间控制和赋值语句 【例例6-13】带有异步清零位clr(高电平有效)的时钟上升沿T触发器。module asyn_clear

26、_Tff(clk,clr,t,q);input clk,clr,t;output q;reg q;always (posedge clk or posedge clr) begin if(clr=1) q=0; else if(t=1) q=q; endendmodule第6章 行为描述(二):时间控制和赋值语句 可以看出:在实现组合和时序混合逻辑时,always语句的敏感事件列表内要包含时序逻辑部分的时钟信号以及组合逻辑部分的输入控制信号。虽然可以利用一个always过程块来实现组合逻辑功能或者混合的逻辑功能,但必须注意到always过程块主要是为了对时序逻辑建模而引入的一种描述方式。所以在

27、实际硬件设计工作中应该尽量使用结构描述方式(连续赋值语句、模块实例、原语实例等语句)来描述组合逻辑,这样可以使综合后的结果更加接近实际硬件的结构。第6章 行为描述(二):时间控制和赋值语句 6.1.3 电平敏感事件控制电平敏感事件控制(wait语句语句)与边沿触发事件控制不同,在电平敏感事件控制方式下启动语句执行的触发条件是某一个指定的条件表达式为真。电平敏感事件控制用关键词“wait”来表示。它可以有如下三种形式: wait (条件表达式) 语句块; wait (条件表达式) 行为语句; wait (条件表达式);第6章 行为描述(二):时间控制和赋值语句 在这种事件控制语句形式下,语句块启

28、动执行的触发条件是:条件表达式的值为“真(逻辑1)”。如果当仿真进程执行到这条电平敏感事件控制语句时条件表达式的值是“真”,那么语句块立即得到执行;否则语句块要一直等到条件表达式变为“真”时再开始执行。比如如下语句: wait (enable=1) begin d=a & b; d=d | c; end第6章 行为描述(二):时间控制和赋值语句 电平敏感事件控制的第二种形式中包含了一条行为语句,在这种事件控制语句形式下,行为语句启动执行的触发条件与前面第一种形式下的触发条件相同。两者之间惟一不同之处在于:这里启动的是一条行为语句的执行,而在第一种形式下启动的是一个语句块的执行。比如:w

29、ait (enable=1) d= (a&b) | c ;第6章 行为描述(二):时间控制和赋值语句 第三种形式中没有包含行为语句或语句块。如果当仿真进程执行到该wait控制语句时条件表达式的值是“真”,那么立即结束该wait事件控制语句的执行,仿真进程继续往下进行;而如果当仿真进程执行到这条wait控制语句时条件表达式的值不是“真”,则仿真进程进入等待状态,一直等到条件表达式取值变为“真”时才退出等待状态同时结束该wait语句的执行,仿真进程继续进行。 这种形式的电平敏感事件控制常常用来对串行块中各条语句的执行时序进行控制。beginwait (enable=1);d=a&b

30、;d=d | c;end第6章 行为描述(二):时间控制和赋值语句 注意这种形式的wait语句在串行结构(串行块)中才能实现时序控制功能。在使用电平敏感事件控制语句(wait语句)时,要注意体会它与上一小节所介绍的“边沿触发事件控制”的区别:以“”开头的边沿触发事件控制只对信号的跳变边沿敏感,它给出的触发事件是指定的信号跳变边沿;以“wait”开头的电平敏感事件控制只对信号的电平敏感,它给出的触发事件是指定的信号稳定逻辑状态。第6章 行为描述(二):时间控制和赋值语句 【例例6-14】电平敏感事件控制与边沿触发事件控制的比较。module level_and_edge_sensitive_co

31、mpare( flag1,flag2 );output flag1,flag2;reg enable,flag1,flag2;initial /第一个initial过程块,用于产生enable信号 begin flag1=1; flag2=1; enable=1; #10 enable=0; #10 enable=1; #10 $finish; end第6章 行为描述(二):时间控制和赋值语句 initial /第二个initial过程块,用于实现电平敏感事件控制 begin #10 ; wait(enable=1) flag1=flag1;/若触发条件成立,flag1翻转 endinitia

32、l /第三个initial过程块,用于实现边沿触发事件控制 begin #10 ; (posedge enable) flag2=flag2;/若触发条件成立,flag2翻转 endendmodule 第6章 行为描述(二):时间控制和赋值语句 图6.1 例6-14所示模块仿真执行时产生的波形第6章 行为描述(二):时间控制和赋值语句 6.2 赋赋 值值 语语 句句6.2.1 过程赋值语句的基本格式过程赋值语句的基本格式 在过程块中只能使用过程赋值语句,同时过程赋值语句也只能用在过程块中。过程赋值语句的基本格式为: 其中是“=”或“=”之一,它们分别代表了阻塞型赋值和非阻塞型赋值类型。第6章

33、行为描述(二):时间控制和赋值语句 过程赋值语句只能用于对寄存器类的变量(寄存器reg、整型integer、实型real或时间型time变量)进行赋值操作。在经过过程赋值后,上面的这些变量的取值将保持不变,直到另一条过程赋值语句对变量重新赋值为止。过程赋值操作的具体目标可以是:(1) reg,integer,real,time型变量(标量或矢量)。(2) 上述类型变量的某一位或某几位(在矢量情况下)。(3) 存储器类,只能对某地址单元的整个字进行赋值,不能对其中某些位单独进行赋值。(4) 上述几个变量用连接运算符“,”拼接起来构成的寄存器整体。第6章 行为描述(二):时间控制和赋值语句 【例例

34、6-15】过程赋值语句赋值操作的各种目标变量形式。reg a;reg 0:7 b;integer i;reg0:7 mem_10:1023 ;initialbegina=0;/对一个1位寄存器a赋值i=356;/对一个整型变量i赋值b2=1b1;/对8位寄存器b的第3位赋值b0:3=4b1111;/对8位寄存器b的前4位赋值mem_1200=8hfd;/对存储器mem_1的第201个存储单元进行赋值a,b=9b101110110;/对用连接运算符构成的一个整体进行赋值end 第6章 行为描述(二):时间控制和赋值语句 过程赋值语句右端的赋值表达式可以是任何合法的表达式。比如: reg c; #

35、10 c=a&(b);根据对被赋值变量产生作用的优先级差别,可以将过程赋值语句分为如下两种类型: 普通过程赋值语句(简称过程赋值语句)。 过程连续赋值语句。其中普通过程赋值语句又可以根据赋值操作执行时的不同时序特点分成阻塞型过程赋值语句和非阻塞型过程赋值语句。第6章 行为描述(二):时间控制和赋值语句 6.2.2 过程赋值的两种延时方式过程赋值的两种延时方式各种过程赋值语句都可以带有时间控制,过程赋值语句中可以出现延时控制形式的时间控制和事件控制形式的时间控制。根据时间控制部分在过程赋值语句中出现的位置,可以把过程赋值语句中的时间控制方式分为如下两类: 外部时间控制方式。 内部时间控制

36、方式。第6章 行为描述(二):时间控制和赋值语句 1. 外部时间控制方式外部时间控制方式如果时间控制部分出现在整个过程赋值语句的最左端,也就是出现在赋值目标变量的左边,那么这种时间控制方式就是外部时间控制方式。在外部时间控制方式下,过程赋值语句在仿真时是这样执行的:仿真进程遇到这条带有时间控制的过程赋值语句后,首先要延迟等待由时间控制部分指定的延时时间量,或者是要等待到指定触发事件发生后,才开始计算右端的赋值表达式并将其取值赋给左端被赋值变量。比如语句:#5 a=b; 第6章 行为描述(二):时间控制和赋值语句 在仿真执行时就相当于如下几条语句的执行:initial begin #5; /先延

37、时 a=b; /再求b值并将其赋值给a end第6章 行为描述(二):时间控制和赋值语句 【例例6-16】外部时间控制方式。module timing_control_out_mode(b,c,d,clk,enable);input clk,enable;output b,c,d;reg b,c,d;initial /此过程块用于对输出进行初始化 fork b=0; c=0; d=0; join第6章 行为描述(二):时间控制和赋值语句 initial /此过程块用于对输出进行赋值,其中包含了外部时间控制 fork #5 b=b; /语句S1 (posedge clk) c=c; /语句S2

38、wait (enable) d=d; /语句S3 joinendmodule第6章 行为描述(二):时间控制和赋值语句 图6.2 例6-16模块在进行仿真时的输入输出波形t403530201050dcbenableclk第6章 行为描述(二):时间控制和赋值语句 在外部时间控制方式下还有一种特殊情况,那就是当外部时间控制所指定的延时时间为零时的情况,我们称这种情况下的时间控制为“显式零延时控制”。 #0 a=b;上面这条语句的执行过程与不具有延时控制的赋值语句“a=b;”的执行过程是很相似的:在语句开始执行后,它们都是首先计算表达式b 的取值,再对变量a进行赋值;同时两条语句的开始执行时刻、表

39、达式计算时刻和变量赋值时刻都是相同的。第6章 行为描述(二):时间控制和赋值语句 但是,上面这条语句在执行时序上还是与语句“a=b;”的执行时序存在着微妙的差别:在显示零延时控制下,赋值语句内赋值表达式的计算以及变量的赋值操作是在当前仿真时刻的末尾进行的,也就是说要等到这一时刻其它正常操作完成后才进行的。而赋值语句“a=b;”内的表达式计算和变量赋值操作则是在赋值语句开始执行后立即进行的,并不需要等待同一时刻的其它操作完成后才进行。比如如下语句:initial begin a = 0; /语句S1 b = 0; /语句S2 endinitial begin #0 a = 1; /语句S3 #0

40、 b = 1; /语句S4 end第6章 行为描述(二):时间控制和赋值语句 2. 内部时间控制方式内部时间控制方式时间控制部分出现在“赋值操作符”和“赋值表达式”之间。这种情况下的时间控制称为“内部时间控制方式”。在内部时间控制方式下,过程赋值语句是这样执行的:仿真进程遇到带有内部时间控制的过程赋值语句后,立即计算赋值语句中“赋值表达式”的值,然后进入时间控制部分指定的等待状态,一直等到指定的延时时间量过去之后或者是指定的触发事件得到发生之后再将赋值表达式的取值赋给左端的被赋值变量。比如语句: a = #5 b;第6章 行为描述(二):时间控制和赋值语句 它在执行时就相当于如下几条语句的执行

41、:initialbegintemp=b; /先求b的值#5; /再延时a=temp; /延时结束后再进行赋值操作end第6章 行为描述(二):时间控制和赋值语句 【例例6-17】过程赋值语句中的内部时间控制方式。module timing_control_inner_mode(a,b,c,d,clk,enable);input a,clk,enable;output b,c,d;reg b,c,d;initial /此过程块用于对输出进行初始化 fork b=0; c=0; d=0; join第6章 行为描述(二):时间控制和赋值语句 initial /此模块用于对输出进行赋值,其中包含了内部

42、时间控制 fork b=#5 a; /语句S1 c=(posedge clk) a ; /语句S2 d= wait (enable) a ; /语句S3 joinendmodule第6章 行为描述(二):时间控制和赋值语句 图6.3 例6-17所示模块在进行仿真时的输入输出波形t4030201050dcbenableclka第6章 行为描述(二):时间控制和赋值语句 6.2.3 阻塞型过程赋值阻塞型过程赋值以赋值操作符“”来标识的赋值操作称为“阻塞型过程赋值(Blocking Assign-ment)”。阻塞型过程赋值语句特点如下:(1) 串行块(begin-end语句块)中的各条阻塞型过程赋

43、值语句将以它们在顺序块中的先后排列次序依次得到执行;而fork-join并行块中的各条阻塞型过程赋值语句则是同时得到执行的。第6章 行为描述(二):时间控制和赋值语句 (2) 阻塞型过程赋值语句的执行过程是:首先计算右端赋值表达式的取值,然后立即将计算结果赋值给“=”左端的被赋值变量。阻塞型过程赋值的这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达式的值并立即将其结果赋给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句所阻塞,只有在当前这条阻塞型过程赋值语句所对应的赋值操作执行完毕后下一条语句才能开始执行。第6章 行为描述(二):时间控制和赋值语句

44、initialbegina=0; /语句S1a=1; /语句S2end第6章 行为描述(二):时间控制和赋值语句 【例例6-18】阻塞型过程赋值语句带有延时控制时的情况。initialbegina=0; /语句S1a=#5 1; /语句S2a=#10 0; /语句S3a=#15 1; /语句S4end第6章 行为描述(二):时间控制和赋值语句 图6.4 带有延时控制的阻塞型过程赋值产生的波形t302015100a5initial过程块执行时间段第6章 行为描述(二):时间控制和赋值语句 6.2.4 非阻塞型过程赋值非阻塞型过程赋值以赋值操作符“=”来标识的赋值操作称为“非阻塞型过程赋值(Non

45、blocking Assignment)”。非阻塞型过程赋值语句的特点是:(1) 在begin-end串行语句块中,一条非阻塞型过程赋值语句的执行不会阻塞下一条语句的执行,也就是说在本条非阻塞型过程赋值语句对应的赋值操作执行完毕之前,下一条语句也可以开始执行。第6章 行为描述(二):时间控制和赋值语句 (2) 仿真进程在遇到非阻塞型过程赋值语句后首先计算其右端赋值表达式的值,然后要等到当前仿真时间步结束时再将该计算结果赋值给赋值变量。为了了解非阻塞型过程赋值语句的上述两个特点,我们可以观察如下语句:initialbeginA = B; /语句S1B = A; /语句S2end第6章 行为描述(

46、二):时间控制和赋值语句 如果非阻塞型过程赋值语句带有外部延时控制,则它的执行相当于在指定的延时之后执行一条不带时间控制的非阻塞型过程赋值语句。并且这条非阻塞型过程赋值语句不会阻塞其后面语句的执行。第6章 行为描述(二):时间控制和赋值语句 【例例6-19】带有外部延时控制的非阻塞型过程赋值语句。initial /过程块1begin#5 a = b; /语句S1#10 c = d; /语句S2end第6章 行为描述(二):时间控制和赋值语句 上面的过程块1相当于如下的过程块2:initial /过程块2fork begin /语句块1 #5; a=b; end begin /语句块2 #10;

47、 c=d; endjoin第6章 行为描述(二):时间控制和赋值语句 图6.5 带有外部延时控制的非阻塞型过程赋值语句的执行时序t151005abcd第6章 行为描述(二):时间控制和赋值语句 如果非阻塞型过程赋值语句带有内部延时控制,则仿真进程在遇到这种赋值语句后将立即计算语句右端赋值表达式的值,然后进入延时控制部分所指定的等待状态,直到退出等待状态时刻所在时间步的末尾才执行赋值操作,将已计算得到的赋值表达式结果值赋给被赋值变量。例如如下语句:a=#10 b;就是一条带有内部延时控制的非阻塞型过程赋值语句。在开始执行这条语句后,首先立即计算赋值表达式“b”的值(在t0时刻),然后等待10个单

48、位时间的延时量,一直等到延时结束时刻(t=10时刻)所在时间步的末尾才将计算得到的赋值表达式取值结果赋给变量a。第6章 行为描述(二):时间控制和赋值语句 【例例6-20】非阻塞型过程赋值语句带有延时控制的情况。initial begin a = 0; /语句S1 a = #5 1; /语句S2 #10 a = 0; /语句S3 a =#25 1; /语句S4 end第6章 行为描述(二):时间控制和赋值语句 图6.6 带有延时控制的非阻塞型过程赋值产生的波形2520initial过程块执行时间段t151005a第6章 行为描述(二):时间控制和赋值语句 【例例6-21】同时使用阻塞型过程赋值

49、语句和非阻塞型过程赋值语句。reg a,b,c;initial begin a=0; /语句S1 a=1; /语句S2 b=a; /语句S3 #5; /等待一定的时延 c=a; /语句S4 end第6章 行为描述(二):时间控制和赋值语句 6.2.5 连续赋值语句连续赋值语句Verilog HDL语言中的连续赋值语句与过程块一样也是一种行为描述语句。它主要用来对组合逻辑电路的行为进行描述。连续赋值语句只能用来对连线型变量进行驱动(赋值),而不能对寄存器型变量进行赋值,它可以采取如下两种格式:(1) 显式连续赋值语句:连线型变量类型 连线型变量位宽 连线型变量名;assign #(延时量) 连线

50、型变量名 = 赋值表达式;第6章 行为描述(二):时间控制和赋值语句 (2) 隐式连续赋值语句:连线型变量类型(赋值驱动强度)连线型变量位宽 #(延时量) 连线型变量名= 赋值表达式;第6章 行为描述(二):时间控制和赋值语句 “延时量”的基本格式如下:#(delay1,delay2,delay3)其中delay1,delay2和delay3都是一个数值,其中的“delay1”指明了连线型变量转移到“1”状态时的延时值(称为上升延时);“delay2”指明了连线型变量转移到“0”状态时的延时值(称为下降延时);“delay3”指明了连线型变量转移到“高阻(z)”状态时的延时值(称为关断延时)。

51、在实际使用中“延时量”也可以省略为由一个或二个延时值构成,这种情况下三种延时值(“上升延时值”、“下降延时值”和“关断延时值”)的确定准则是: 若只给出一个延时值,则这个延时值将同时代表“上升延时值”、“下降延时值”和“关断延时值”。第6章 行为描述(二):时间控制和赋值语句 如果只给出了两个延时值,那么这两个延时值将分别代表“上升延时值”和“下降延时值”,而“关断延时值”将由给出的两个延时值中较小的那一个指定。 如果“延时量”这一项缺省,则默认所有的延时值都为0。“赋值表达式”内可以包含连线型、寄存器或函数调用等任何数据类型的操作数,同时也可以包含任何操作符。例6-22给出了一个显式连续赋值

52、语句的例子。第6章 行为描述(二):时间控制和赋值语句 【例例6-22】显式连续赋值语句。module and_cont_assignment (z,x,y);input 3:0 x,y;output 3:0 z; wire 3:0 z, x, y; / 连线型变量说明assign #(1.5, 1.0, 2.0) z = x & y; /连续赋值语句endmodule第6章 行为描述(二):时间控制和赋值语句 例6-22中连续赋值语句的赋值目标是连线型变量z,它的位宽为4位。连续赋值语句指定用表达式“x & y”的取值对连线型变量z 进行连续驱动。其中指定的延时量为“(1.5

53、,1.0,2.0)”,它指明了从信号x或y发生变化时刻到变量z被更新时刻之间的延时时间量:上升延时为1.5个时间单位,下降延时为1个时间单位,关断延时为2个时间单位。连续赋值语句中并未出现“驱动强度”这一项,所以连线型变量z受到的驱动强度是缺省的“(strong1,strong0)”。例6-23则给出了一个隐式连续赋值语句的例子,它描述了与例6-22相同的硬件行为。第6章 行为描述(二):时间控制和赋值语句 【例例6-23】隐式连续赋值语句。module and_cont_assignment(z,x,y);input 3:0 x,y;output 3:0 z; wire 3:0 x, y;

54、/ 输入连线型变量说明wire 3:0 #(1.5,1.0,2.0) z = x & y; /隐式连续赋值语句endmodule第6章 行为描述(二):时间控制和赋值语句 在实际使用中,连续赋值语句的赋值目标可以是如下几种: (1) 标量连线型变量。如wire a,b;assign a = b;(2) 向量连线型变量。如wire 7:0 a,b;assign a = b;(3) 向量连线型变量中的某一位。如wire 7:0 a,b;assign a3 = b3 ; (4) 向量连线型变量中的某几位。如: wire 7:0 a,b; assign a3:2 = b3:2;第6章 行为描述

55、(二):时间控制和赋值语句 (5) 上面几种类型的任意拼接运算结果。如wire a,c;wire 2:1 b;assign a,c = b ;在需要对多个连线型变量进行连续赋值时,还可以采用如下形式的连续赋值语句,它可以实现对多个变量进行连续赋值:assign out_and = a&b;out_or = a|b;out_xor = ab;out_not_a = a;out_not_b = b;第6章 行为描述(二):时间控制和赋值语句 上述语句是下面5条独立的连续赋值语句的简化形式:assign out_and = a&b;assign out_or = a|b;assign

56、 out_xor = ab;assign out_not_a = a;assign out_not_b = b;正如“连续赋值”这一名称所表述的含义,连续赋值语句对连线型变量(wire)进行的是连续的驱动。与寄存器型变量类型不同,连线型变量(除了trireg类型外)没有数据保持能力,只有在被连续驱动后才能取得确定值(而寄存器型变量只要在某一时刻得到一次过程赋值后就能一直保持其取值),若一个连线型变量没有得到任何连续驱动则它的取值将为不定态“x”。连续赋值就是实现对连线型变量进行连续驱动的一种方法(还有一种进行连续驱动的方法是由某个模块输出端来对连线型变量进行驱动,这归类于结构描述方式)。第6章

57、 行为描述(二):时间控制和赋值语句 一个连线型变量一旦被连续赋值语句赋值后,赋值语句右端赋值表达式的值将始终对被赋值连线型变量产生驱动(连续驱动)。在仿真执行时,只要右端赋值表达式内的任一操作数发生变化,就会立即触发对被赋值连线型变量的更新操作:重新计算赋值表达式的取值,然后将计算得到的结果赋值给被赋值连线型变量。也就是说赋值表达式内各个信号的变化将随时被反映到赋值表达式和被赋值变量的取值上。比如例6-24所示的模块实现了用输入信号a,b的“按位或”运算结果对连线型变量c进行连续驱动。a或b在任意时刻发生的变化将立即被反映到变量c的取值上。例6-24所示模块和例6-25所示的用过程赋值语句描

58、述的模块是等价的。第6章 行为描述(二):时间控制和赋值语句 【例例6-24】连续赋值语句的例子。module or_by_cont_assignment(c,a,b);input a,b;output c;assign c=a|b;endmodule第6章 行为描述(二):时间控制和赋值语句 【例例6-25】与例624等价的描述。module or_by_proc_assignment(c,a,b);input a,b;output c;reg c;initial/initial过程块用于对c赋初值beginc=x;endalways (a or b)/always过程块用于更新c的取值c=

59、a|b;endmodule第6章 行为描述(二):时间控制和赋值语句 在仿真执行时,例6-25所示模块中的always过程块将对输入a和b进行监测,每当a或b的取值发生变化时,过程赋值语句都将通过always的循环控制,启动一次对c的赋值操作过程; 而当a和b的取值没有发生变化时,always过程块内的语句得不到执行,输出c将保持原有取值。所以例6-25描述的硬件行为特征是与例6-24所描述的行为特征相一致的。但这种描述方式显然没有例6-24中的描述那么简单明了。如果连续赋值语句带有延时(#delay),则在仿真执行时,只要右端赋值表达式中的任一信号发生变化,都将立即对赋值表达式进行重新计算,

60、然后进入延时等待状态,等到指定的延时时间过去后再将计算得到的赋值表达式取值结果赋值给被赋值连线型变量。第6章 行为描述(二):时间控制和赋值语句 例如,下面这条连续赋值语句:assign #5 a = b; 指定的驱动方式就是:当b的值发生变化时,立即对赋值表达式“b”的取值进行计算(也就是对b的取值进行采样,但不是立即将其赋值给a),然后进入“5”指定的延时等待状态,直到过了5个时间单位的延时时间后(相对于b值变化时刻的5个单位时间的延时)才对a执行赋值操作,赋值表达式取值的计算结果(b发生变化后的采样值)赋值给a。图6.7给出了这条连续赋值语句在仿真执行时的时序图。第6章 行为描述(二):时间控制和赋值语句 图6.7 连续赋值语句“assign #5 a=b;”执行时的时序图ax2

温馨提示

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

评论

0/150

提交评论