VHDL时间控制和赋值语句.ppt
《VHDL时间控制和赋值语句.ppt》由会员分享,可在线阅读,更多相关《VHDL时间控制和赋值语句.ppt(108页珍藏版)》请在三一办公上搜索。
1、1,第6章行为描述(二):时间控制 和赋值语句,6.1 时间控制 6.2 赋值语句,2,6.1 时 间 控 制时间控制可以用来对过程块中各条语句的执行时间(时序)进行控制。时间控制可以分为两类:(1)延时控制:为行为语句的执行指定一个延时时间的时间控制方式。(2)事件控制:为行为语句的执行指定触发事件的时间控制方式。其中事件控制方式又可以分成两类:边沿触发事件控制 电平敏感事件控制,3,6.1.1 延时控制延时控制的格式为:#行为语句;或#;其中:符号“#”是延时控制的标识符;“”是直接指定的延迟时间量,它是以多少个仿真时间单位的形式给出的,可以是一个立即数、变量或表达式。,4,1.第一种形式
2、的延时控制语句在上面给出的第一种延时控制格式中,的后面跟着一条行为语句。在这种情况下,仿真进程在遇到这条带有延时控制的行为语句后并不立即执行行为语句指定的操作,而是要延迟等待到“”所指定的时间量过去后才真正开始执行行为语句指定的操作,如例6-1所示的程序。,5,【例6-1】第一种形式的延时控制语句。module clk_gen(clk);output clk;reg clk;initialbeginclk=0;/语句S1#10 clk=1;/语句S2#20 clk=0;/语句S3#30 clk=1;/语句S4endendmodule,串行块内共有四条赋值语句,其中语句S1没有时间控制部分,而语
3、句S2、S3和S4带有延时控制。,6,表6.1给出了例6-1在进行仿真时的时序以及输出信号clk的变化情况:,7,2.第二种形式的延时控制语句延时控制的第二种格式中,在“”后面没有出现任何行为语句,而只有一个语句结束符号“;”。在这种情况下,仿真进程在遇到这条延时控制语句后不执行任何操作,而是进入一种等待状态,等到过了由“”所指定的时间量后仿真流程,结束这条延时控制语句的执行。这种形式的延时语句出现在串行块和并行块中时产生的作用是不同的,下面我们举例说明。,8,【例6-2】第二种形式的延时控制语句使用于串行块。module clk_gen(clk);output clk;reg clk;ini
4、tial begin/串行块clk=0;/语句S1#10 clk=1;/语句S2#10;/语句S3#10 clk=0;/语句S4#30 clk=1;/语句S5endendmodule,9,表6.2给出了例6-2所示代码进行仿真时的程序控制流程和输出变化情况:,10,在例6-2的执行中我们可以看出:第二种形式的延时控制语句在串行块中的作用是使该控制语句后的下一条语句的执行时刻延迟了指定的时间量。因此,如下语句:begin#10;a=b;end 将等价于下面这一条语句:#10 a=b;下面我们给出另一个例子来说明第二种形式的延时控制语句在并行块中使用的情况。,11,【例6-3】第二种形式的延时控制
5、语句使用于并行块。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;/语句P5joinendmodule,12,在这种情况下延时控制语句P3既没有产生具体的操作,又没有对并行块仿真执行的时序产生影响,所以在上例中有没有延时控制语句P3对于要实现的功能不会产生任何影响。如果我们将例6-3中的延时控制语句P3改为“#40;”,那么情况如何?,13,在介绍了如上两种形式的延时控制语句后,还必须对语法定义中的“”这一项进行说
6、明。“”这一项还可以是一个变量或表达式,而不必将其局限于某一立即数,比如:initialbegin:SEQ_1parameter DELAY_TIME=50;#DELAY_TIME out_1=0;/第一条赋值语句#(DELAY_TIME/2)out_2=1;/第二条赋值语句end,14,当“”是由一个变量或由一个表达式表示时,有可能出现该变量或表达式的值为负值以及取值为x或z的情况。Verilog语法规定:如果代表延时时间的变量或表达式的值为x或z,那么该延时控制等效于零时延控制;如果代表延时时间的变量或表达式的值为负值,则以该负值的二进制补码值作为实际的延时量。,15,6.1.2 边沿触发
7、事件控制事件控制方式是时间控制的另一种方式。在这种时间控制方式下,行为语句的执行需要由指定事件的发生来触发,该事件被称为“触发事件”。在always语句块格式中所使用的敏感事件列表就是一种事件控制。事件控制方式不仅能用于always语句块,而且还可以用于其它的行为语句。事件控制方式又可以进一步分成两类:边沿触发事件控制和电平敏感事件控制。,16,1.边沿触发事件控制这一类时间控制方式在指定的信号变化时刻,也就是在指定的信号的跳变边沿才触发语句的执行;而当信号处于稳定状态时则不会触发语句的执行。边沿触发事件控制的语法格式可以为如下几种:第一种:()行为语句;第二种:();第三种:(or or o
8、r)行为语句;第四种:(or or or);,符号“”是边沿触发事件控制的标识符,“事件表达式”代表着触发语句执行的触发事件;而“行为语句”则指出了触发事件所要触发执行的具体操作,17,1)事件表达式事件表达式可以是如下三种形式之一:。posedge negedge 其中,“”可以是任何数据类型的标量或矢量。,18,2)语法格式下面讨论前面给出的边沿触发事件控制的四种语法格式:(1)边沿触发事件控制的第一种语法格式:()行为语句;这种语法格式的敏感事件列表内只包含了一个触发事件,只有当这个指定的触发事件发生之后,后面的行为语句才能启动执行;,19,【例6-4】时钟脉冲计数器。module cl
9、k_counter(clk,count_out);input clk,output count_out;reg 3:0 count_out;initialcount_out=0;/给count_out赋初值0always(posedge clk)count_out=count_out+1;/在clk的每个正跳变边沿count_out增加1endmodule,所指定的触发事件是时钟信号“clk”发生正跳变。因此在执行这条事件控制语句时,仿真进程将等待时钟“clk”正跳变的发生,然后为计数寄存器“count_out”增值。,20,(2)边沿触发事件控制的第二种语法格式:();这种格式的事件控制语句
10、的执行过程与延时控制语句中没有行为语句的情况类似,仿真进程在遇到这条事件控制语句后会进入等待状态,直到指定的触发事件发生后才结束等待状态,退出该事件控制语句的执行并开始下一条语句的执行。比如例6-5中程序所示。,21,【例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);/*等待,直到时钟发生正跳变后退出
11、等待状态,继续执行下一条语句*/pos_edge_time=$time;(negedge clk);/*等待,直到时钟发生负跳变后退出等待状态,继续执行下一条语句*/neg_edge_time=$time;,22,(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(The clk stay in High leve
12、l 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,23,(3)边沿触发事件控制的第三种语法格式:(or or or)行为语句;在仿真进程遇到这种格式的边沿触发事件控制语句时如果所有的触发事件都没有发生,则仿真进程就会进入等待状态,直到其中的某一个触发事件发生后才启动执行后面给出的行为语句,仿真进程继续向下进行。例如例6-6给出的initial语句块所示。,24,
13、【例6-6】边沿触发事件控制语句的例子。initialbegina=1;(posedge clk1 or negedge clk2 or b)a=b;end只要发生了这三个触发事件中的任一个,赋值语句“a=b;”的执行就被启动。程序实现的功能是:给a赋初值1,然后等到clk1发生正跳变或clk2发生负跳变或信号b发生跳变时,将b的逻辑值赋值给a。,25,(4)边沿触发事件控制的第四种语法格式:(or or or);仿真进程在遇到这条事件控制语句后会进入等待状态,直到敏感事件列表所包含的多个触发事件中的任何一个得到发生后才结束等待状态,退出该事件控制语句并开始执行该事件控制语句后的下一条语句。,
14、26,【例6-7】连续监测信号a或b发生变化的时间。module display_information_of_change(a,b);input a,b;wire a,b;always/always过程块,重复进行监测begin(a or b);/*等待,直到a或b发生变化后退出等待状态,并开始下一条语句的执行*/$display(One of a and b changed in time:%t,$time);endendmodule,27,可以看出,例6-7中begin-end串行块内的两条语句可以用如下一条语句替换:(a or b)$display(One of a and b cha
15、nged in time:%t,$time);,28,2.敏感事件列表在always过程块中的使用always过程块可以带有事件控制。带有事件控制的always过程块既可以实现组合逻辑又可以实现时序逻辑;在用于实现这两种不同逻辑功能种类时,always过程块内的敏感事件列表会具有不同的特点。下面分别加以讨论。1)用always过程块实现组合逻辑功能(1)事件表达式内不能包含“posedge”和“negedge”关键词,也就是说敏感事件列表中的事件表达式只能是前面所述的第一种事件表达式形式。,上面给出的第一个特点是因为组合逻辑电路的输出是由输入电平所决定的,输入不同的跳变方式对输出不会产生任何影
16、响,因此敏感事件列表中的事件表达式不能是其余两种对跳变边沿加以指定的形式。,29,(2)组合逻辑的所有输入信号都要作为“”出现在敏感事件列表中。是因为组合逻辑电路的输入输出关系在每个时刻都应该是严格成立的,也就是说,无论什么时刻输入发生了变化,在输出端都应该立即有反应。如果某个输入信号没有出现在敏感事件列表中,那么过程块就没有办法检测到该信号的变化,这个输入信号对输出的影响就不能实现,这样就不能在任意时刻保证组合逻辑的输入输出关系。,30,【例6-8】不能正确实现三输入与门的模块。module three_input_and(a,b,c,out);input a,b,c;/三个输入a,b,co
17、utput out;reg out;always(a or b)/敏感事件列表中只包含了两个输入:a,bbeginout=a&b&c;endendmodule,31,【例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)/敏感事件列表中包含了所有输入beginout=a&b&c;endendmodule,32,下面再举一个用always过程块实现组合逻辑功能的例子。【例6-10】利用敏感事件列表来对组合逻辑建模。module
18、 selective_adder_and_multiplier(a,b,sel,y);input a,b,sel;output y;wire3:0 a,b;reg7:0 y;always(a or b or sel)beginif(sel=0)y=a+b;else if(sel=1)y=a*b;endendmodule,always过程块中的敏感事件列表内包含了所有的输入信号,当任何一个输入发生变化都能及时地对输出进行更新。,33,2)用always过程块实现时序逻辑功能(1)事件表达式可以是事件表达式三种形式中的任何一种,也就是说所采用的事件表达式既可以是带有“posedge”或“neged
19、ge”关键词的事件表达式,也可以是只包含“信号名”的事件表达式。,34,(2)不要求所有的输入信号都出现在敏感事件列表的“信号名”中。这是由于时序逻辑电路逻辑状态的改变只发生在某个或某几个时钟输入信号的变化边沿,而在其它输入信号发生变化时电路逻辑状态保持不变。所以这时事件控制只需对这几个时钟输入信号进行监测就可以了,没有必要把其它输入信号也放入敏感事件列表中。,35,下面我们举几个例子来说明敏感事件列表在描述时序逻辑功能时的使用。【例6-11】时钟下降沿触发的D触发器。module d_ff(q,clk,d);input clk,d;output q;reg q;always(negedge
20、clk)begin q=d;endendmodule,always过程块的敏感事件列表包含了事件表达式“negedge clk”。这个事件表达式带有“negedge”关键词,它指出该D触发器状态的改变发生在clk信号的负跳变边沿,在其余时刻D触发器状态将保持不变。,36,【例6-12】同时由两个时钟沿:clk1上升沿和clk2下降沿进行控制的8位移位寄存器。module 8bits_shift_register(d_in,d_out,clk1,clk2);input clk1,clk2,d_in;output d_out;reg d_out;/d_out保存1bitreg1:7 data;/r
21、eg1:7保存其余7bitsreg1:4 i;/i用于循环计数always(posedge clk1 or negedge clk2)begind_out=data1;for(i=1;i7;i=i+1)datai=datai+1;data7=d_in;endendmodule,37,3)always过程块实现组合和时序混合的逻辑功能要实现组合和时序混合的逻辑功能,我们可以在一个模块中建立多个并行结构来实现。用一个或多个带有事件控制的always过程块来实现时序逻辑部分的功能;再用连续赋值语句或另外一个(或多个)always过程块来实现组合逻辑部分功能。在这种情况下,每一个always过程块只实
22、现了一类逻辑,而我们现在要讨论的是用同一个always过程块来实现组合和时序混合的逻辑功能的情况。,38,在组合逻辑和时序逻辑混合的情况下,模块逻辑状态和输出发生变化时刻要同时受时钟信号跳变沿和某些输入控制信号的控制,典型的例子是带有异步置位(清零)控制输入的时钟边沿触发器。比如一个带有异步清零控制输入位clr的时钟上升沿T触发器,其输入输出真值表如表6.4所示。,39,真值表的第1行说明:当清零信号clr为1时,无论其它输入信号和触发器当前状态如何(用“?”表示“任何状态”),触发器状态(也就是输出q)将始终为0;真值表的第2行到第5行说明了清零信号clr为0时,T触发器处于正常工作状态:若
23、在时钟上升沿输入t=0则触发器状态保持不变,而如果在时钟上升沿输入t=1则触发器的状态将发生翻转。,40,因此在输入clr为0时,触发器的逻辑功能是普通的时序逻辑,其状态和输出在时钟上升沿发生变化;而在输入clr变为1时,T触发器的输出立即变为0,这时的逻辑功能就是关于控制信号clr的组合逻辑。我们可以用一个always过程块来实现这种混合的逻辑功能,如例6-13所示。,41,【例6-13】带有异步清零位clr(高电平有效)的时钟上升沿T触发器。module asyn_clear_Tff(clk,clr,t,q);input clk,clr,t;output q;reg q;always(po
24、sedge clk or posedge clr)beginif(clr=1)q=0;else if(t=1)q=q;endendmodule,可以看出:在实现组合和时序混合逻辑时,always语句的敏感事件列表内要包含时序逻辑部分的时钟信号和组合逻辑部分的输入控制信号。clk和 clr就出现在敏感事件列表中。这两个信号中的任何一个发生变化都会启动语句块的执行:根据控制信号clr的逻辑电平取值,分别实现组合逻辑和时序逻辑,42,虽然可以利用一个always过程块来实现组合逻辑功能或者混合的逻辑功能,但必须注意到always过程块主要是为了对时序逻辑建模而引入的一种描述方式。所以在实际硬件设计工
25、作中应该尽量使用结构描述方式来描述组合逻辑,这样可以使综合后的结果更加接近实际硬件的结构。,43,6.1.3 电平敏感事件控制(wait语句)“电平敏感事件控制”是与“边沿触发事件控制”对应的另一种事件控制类别。与边沿触发事件控制不同,在电平敏感事件控制方式下启动语句执行的触发条件是某一个指定的条件表达式为真。电平敏感事件控制用关键词“wait”来表示。它可以有如下三种形式:wait(条件表达式)语句块;wait(条件表达式)行为语句;wait(条件表达式);,44,电平敏感事件控制的第一种形式中包含了一个语句块,它可以是串行块(begin-end块)或并行块(fork-join块)。在这种事
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 时间 控制 赋值 语句

链接地址:https://www.31ppt.com/p-5452187.html