欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    [信息与通信]Verilog HDL数字系统设计及其应用袁俊泉第5章.ppt

    • 资源ID:2000676       资源大小:426.50KB        全文页数:60页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [信息与通信]Verilog HDL数字系统设计及其应用袁俊泉第5章.ppt

    第5章 行为描述(一):模块基本结构,5.1 行为描述的结构 5.2 语句块,5.1 行为描述的结构 模块采用行为描述方式时的基本语法格式如下: module () 模块端口说明 参数定义(可选) 数据类型说明 过程块(initial过程块或always过程块,可有一个或多个) 连续赋值语句; 任务定义(task)(可选) 函数定义(function)(可选) endmodule 其中: 端口列表中可以有单个或多个输入、输出或双向端口;这些端口类型要在“模块端口说明”部分进行类型说明。,参数定义用关键词parameter实现,如果模块定义了参数,那么该模块的每个实例可以对该参数进行重新定义,使得该参数值对每一个具体实例是惟一的。 数据类型说明用来对模块中用到的各类变量类型进行说明,如果某个变量没有进行数据类型说明,则它的类型缺省为连线类型(wire)。 过程块是由过程语句initial或always开头的一个语句块,根据这两个不同的关键词,过程块可以被分为“initial过程块”和“always过程块”两种类型。过程块中包含一条或多条行为语句,过程块是行为描述的主要组成部分。 连续赋值语句是由关键词assign来标识的一种赋值语句,它只能对连线型类型(net类型)变量进行驱动,它和语句块一样也是一种行为描述语句。在下一章讨论过程赋值语句时我们将对连续赋值语句一并进行讨论。,任务定义和函数定义部分都是可选的,它们引入的目的是为了描述模块中被多次执行的部分以及为了增强代码的易读性。 上面列出的各个模块组成项可以以任意次序出现,但是端口说明和数据类型说明必须出现在这些端口和数据被引用之前。 与第2章中描述的模块的一般格式定义相比,我们可以看出:在进行行为描述时,模块内不能出现模块实例和原语实例语句(包括用户自定义原语实例),模块内只能存在过程块(initial过程块和always过程块)、连续赋值语句、任务定义(task)和函数定义(function)这四种结构成分。对电路进行行为描述主要是通过过程块和连续赋值语句来进行的,任务和函数的使用也需要在过程块或连续赋值语句中进行调用。本章以及第6、7章将对这几种结构成分进行介绍。,一个行为描述模块中可以同时包含多个过程块和多个连续赋值语句,这些组成成分将以并行方式各自独立地执行;行为描述模块也可以只包含过程块或者只包含连续赋值语句。,5.1.1 过程块 每个过程块是由“过程语句(initial或always)”和语句块所组成的,而语句块主要是由过程性赋值语句(包括“过程赋值语句”和“过程连续赋值语句”)和高级程序语句(包括“条件分支语句”和“循环控制语句”)这两种行为语句构成的。过程块具有如下特点: (1) 在行为描述模块中出现的每个过程块(always过程块或initial过程块)都代表一个独立的进程。 (2) 在进行仿真时,所有initial过程块和always过程块的执行都是从0时刻开始并行地进行的。 (3) 每一个过程块内部的多条语句的执行方式可以是顺序执行的(当块定义语句为begin-end时的情况),也可以是并行执行的(块定义语句为fork-join时的情况)。 (4) always过程块和initial过程块都是不能嵌套使用的。比如下例5-1就是错误的。,【例5-1】错例:嵌套的过程块。 module nested_procedural_block(a,b,c); input a,b; output c; reg a,b,c; initial / initial过程块1 begin c=a; initial /嵌套在initial过程块1内部的initial过程块2 begin c=b; end end endmodule,5.1.2 intial过程块 initial过程块是由过程语句“initial”和语句块组成的,它的格式为: initial 语句块 而“语句块”的格式为: : 块内局部变量说明; 时间控制1 行为语句1; 时间控制n 行为语句n; ,在如上所示的格式中: (1) 过程语句关键词initial表明了该过程块是一个“initial过程块”。 (2) 块定义语句1和块定义语句2构成了一组块定义语句,它们可以是“begin,end”语句组或“fork,join”语句组。这两条块定义语句将它们之间的多条行为语句组合在一起,使之构成一个语句块,并使其在格式上更像一条语句。当语句块中只包含一条行为语句并且不需要定义块名和块内局部变量时,这两条块定义语句可以缺省。 (3) 为可选项,块名可以为语句块创建一个局部作用域。定义了块名的过程块称为“有名块”,在有名块中可以定义局部变量,有名块内部语句的执行可以被disable语句中断。,(4) 块内局部变量说明也是可选项,只有在有名块中才能定义局部变量,并且块内局部变量只能是寄存器类数据类型。 (5) 时间控制用来对过程块内各条语句的执行时间进行控制。它可以是任何一种时间控制方式。关于时间控制我们将在第6章进行详细讨论。,(6) 行为语句可以是如下语句中的一种: 过程赋值语句(阻塞型或非阻塞型过程赋值语句)。 过程连续赋值语句(assign/deassign或force/release语句组)。 if条件分支语句。 case条件分支语句。 循环控制语句(forever,repeat,while,for循环控制语句)。 wait等待语句。 disable中断语句。 事件触发语句(event_trigger)。 任务调用语句(用户自定义的任务或系统任务),我们可以将上面的这些行为语句分成三类:过程性赋值语句、高级程序语句和时间控制语句。其中过程性赋值语句和高级程序语句是过程块的基本组成部分。要注意上面列出的行为语句只能对寄存器类数据变量进行赋值(除force/release过程连续赋值语句以外)。 在进行仿真时,一个initial过程块从模拟0时刻开始执行,它在仿真过程中只执行一次,在执行完一次后该initial过程块就被挂起,不再执行。如果一个模块中存在多个initial过程块,则每个initial过程块都是同时从0时刻开始并行执行的。initial过程块内的多条行为语句可以是顺序执行(语句块是begin-end串行块时)的,也可以是并行执行(语句块是fork-join并行块时)的。,initial过程块的使用主要是面向功能模拟的,它通常不具有可综合性。initial过程块通常用来描述测试模块的初始化、监视、波形生成等功能行为;而在对硬件功能模块的行为描述中,initial过程块常常用来对只需执行一次的进程进行描述,例如它可以用来为寄存器变量赋初值。,【例5-2】initial过程块用于对变量和存储器进行初始化。 module register_initialize (memory); inout areg; inout memory; parameter SIZE=1024; parameter BYTESIZE=8; regBYTESIZE-1:0 memory SIZE-1:0 ; initial /initial过程语句 begin :SEQ_BLK_A /块定义语句,SEQ_BLK_A为块名 integer:index ; /计数变量,为块中的一个局部变量 for(index=0;indexSIZE;index=index+1) memoryindex=0; /对存储器memory进行初始化 areg=0; /对寄存器areg进行初始化 end /块结束标志 endmodule,这个例子的作用是用initial语句在仿真的开始时刻对寄存器变量和存储器进行赋零值操作,从而实现各个变量的初始化。例5-2中的串行块被定义了一个块名“SEQ_ BLK_A”,这是由于为了循环计数需要定义局部变量index,而只有当串行语句块为有名块时才能在块中定义局部变量,所以上例中的块名定义不能缺省。initial过程块中包含了一个begin-end串行语句块。所以对存储器的赋值操作将先于对寄存器的赋值操作进行。这个initial过程块在0 ns时开始执行,并且由于串行块中for循环控制语句和过程赋值语句都没有指定时延,所以对存储器和寄存器的赋值操作都是在0时刻开始和完成的。在完成对寄存器的赋值操作后,initial过程块中所有的语句都已执行完毕,所以initial过程块将结束执行,并且将被永远挂起不再重新执行。,【例5-3】initial过程块用于为电路仿真生成激励波形。 initial begin inputs=b000000; / 初始时刻为0 #10 inputs=b011001; / 10个时间单位后取值改变 #20 inputs=b011011; / 20个时间单位后取值改变 #5 inputs=b011000; / 5个时间单位后取值改变 #10 inputs=b001000; / 20个时间单位后取值改变 end,在例5-3中,我们用initial过程块来生成特定的电路仿真激励信号,和例5-2中的情况一样,initial语句包含了一个串行块。但是在此例中begin-end串行块内的语句是带有时延的,假定initial语句从t=0时刻开始执行,那么首先执行第一条赋值语句,在t=0时刻input的值变为'b000000;由于第二条赋值语句带有延时控制,所以第二条语句的执行是在第一条语句执行结束10个单位时间后(即在t=10时刻)开始的,在t=10时刻input的值变为'b011001;然后再等待20个单位时间后开始第三条赋值语句的执行,依次类推可以知道input取值的变化情况将如表5.1所示。当第五条赋值语句执行完毕后(t=45时刻),initial过程块中所有语句已全部执行完,仿真进程跳出initial过程块,initial语句被永远挂起。,5.1.3 always过程块 always过程块是由“always”过程语句和语句块组成的,它的格式为: always (敏感事件列表) 语句块 其中“语句块”的格式为: : 块内局部变量说明; 时间控制1 行为语句1; 时间控制n 行为语句n; ,(1) 关键词always表明了该过程块是一个“always过程块”。 (2) (敏感事件列表) 是可选项,带有敏感事件列表的语句块被称为“由事件控制的语句块”,它的执行要受敏感事件的控制。(敏感事件列表)的形式为: ( event-expression or event-expression* ) 敏感事件列表是由一个或多个事件表达式(event-expression)构成的,当存在多个事件表达式时要用or将它们组合起来。or用来说明:只要发生了敏感事件列表所列出的多个事件中的任何一个,就将启动后面语句块的执行。敏感事件列表实际上代表了一个事件控制类型的时间控制。我们将在第6章进一步讨论时间控制、事件控制和敏感事件列表。,(3) always过程块中关于 的规定和initial过程块中的情况一样,它们可以是“begin-end”语句组或“fork-join”语句组,由这两组语句组组合成的语句块分别称为串行块和并行块。当过程块中只包含一条语句且不需定义块名与块内局部变量时,块定义语句可以缺省。 (4) 为可选项,对它的规定与initial过程块中的情况一样。定义了块名的过程块称为有名块。 (5) 块内局部变量是可选项,对它的规定与initial过程块中的情况一样。只有在有名块中才能定义局部变量,块内局部变量只能是寄存器类数据类型; (6) 时间控制用来对过程块内各条语句的执行时间进行控制。其作用与initial过程块中的“时间控制”部分的作用是相同的。,(7) 对“行为语句”的规定与上一小节中initial过程块中的情况相同。 从上面的格式定义可以看出,always过程块和initial过程块在格式上的区别主要在于:always过程语句后面可以有一个敏感事件列表,该敏感事件列表的作用是用来激活always过程语句的执行,而initial过程语句的后面则不允许有敏感事件列表。 在进行仿真时,和initial过程块一样,always过程块是从模拟0时刻开始执行的。但是always语句在仿真过程中是不断重复执行的,而不像initial过程块中的语句那样在执行一次后就被挂起,不会再次被执行。并且always过程块内各条语句的真正执行必须由敏感事件列表中列出的事件进行触发才能启动。如果always过程块中的敏感事件列表缺省,则认为触发条件始终被满足,always过程块将无条件地循环执行下去,直到遇到$finish或$stop系统任务为止。,敏感事件列表由一个或多个“事件表达式(event-expression)”构成,事件表达式说明了启动块内语句执行时的触发条件。当存在多个事件表达式时要用关键词or将多个触发条件组合起来。Verilog规定:只要这些事件表达式所代表的多个触发条件中有一个成立,就启动块内语句的执行。例如,在语句: always (a or b or c); begin end,中,always过程块的多个事件表达式分别是信号a,b和c,它们代表的触发条件分别是信号a,b,c发生变化,这三个事件表达式之间以关键词or分隔,这时只要其中一个触发条件被满足,也就是只要信号a,b,c中有一个的值发生变化,begin-end语句块的执行就被触发。而如果信号a,b,c的值都没有发生变化,则任何一个触发条件都没有被满足,begin-end语句块中的语句不被执行;此时由于always过程语句的重复执行的特点,仿真进程将不断地对触发条件进行监测,等待a,b,c信号发生变化。,always过程块的使用主要是对硬件功能模块的行为进行描述,它也可以在测试模块中用来对时钟进行描述。利用always过程块可以实现锁存器和触发器,它也可以用来实现组合逻辑。 在用always过程块实现组合逻辑时要注意将所有的输入信号都列入敏感事件列表中,而在用always过程块实现时序逻辑时却不一定要将所有的输入信号都列入敏感事件列表。敏感事件列表中未包含所有输入信号的情况称为“不完整事件说明(Incomplete Event Specification)”。“不完整事件说明”情况在仿真时可能会引起模拟器的误解。我们可以通过如下两个例子来说明这个问题。,【例5-4】敏感事件列表中未包含所有输入信号的情况。 module three_input_and(f,a,b,c); output f; input a,b,c; reg f; always (a or b) begin f = a & b & c; end endmodule 例5-4描述了一个3输入与门,由于输入c没有出现在敏感事件列表中,所以仿真时当输入信号c发生变化时不会重新计算f值。所以仿真得到的功能并不是一个3输入与门的功能行为,而正确实现3输入与门应该采用例5-5所示的描述方式。,【例5-5】敏感事件列表中包含了所有的输入信号。 module three_input_and(f,a,b,c); output f; input a,b,c; reg f; always (a or b or c) begin f = a & b & c; end endmodule 在使用always过程块时还要注意避免引起仿真死锁状态的发生。因为always语句有重复循环执行的特性,所以当敏感事件列表缺省时,语句块将一直循环执行下去,这就有可能在仿真时产生仿真死锁情况,如例5-6给出的语句所示。,【例5-6】不恰当使用always语句而产生仿真死锁情况的例子。 always begin clk=clk; end 上例中的always语句不带有敏感事件列表,所以begin-end语句块的执行是无条件循环进行的,这样当仿真进程进行到该always过程块后(假设为t0时刻),将开始重复执行块中语句“clk=clk;”,由于该语句没有时间控制部分,该语句每次执行都不需要时延,这样仿真进程将停留在t0时刻不断地循环执行这条语句。这时,仿真就不能往下一时刻继续进行,这就进入了一种仿真死锁状态。 如果例5-6中的语句能加上延时控制,则该always语句将变为一条非常有用的描述语句(见例5-7)。,【例5-7】对例56的改进。 always begin #50 clk=clk; end 例5-7中的赋值语句带有50个单位时间的时延,这样每一次该赋值语句被执行的时刻是不同的,彼此间隔50个单位时间。所以循环就不是停留在t0时刻,而是往前推进的。例5-7可以生成一个周期为100的无限延续的信号波形。,5.2 语 句 块 语句块就是在“initial过程块”或“always过程块”中位于过程语句(initial语句或always语句)后面的,由“块定义语句1”和“块定义语句2”所界定的一组行为语句。“块定义语句1”和“块定义语句2”构成了一对“块定义语句”。 块定义语句分成两种: 一种是“begin-end”语句组,它们用来组合需要顺序执行的语句,由“begin-end”语句组标识的语句块称为“串行块”。 另一种是“fork-join”语句组,它们用来组合需要并行执行的语句。由“fork-join”语句组标识的语句块称为“并行块”。,“块定义语句1”(begin或fork语句)标识了语句块的开始,“块定义语句2”(end或join语句)则标识着语句块的结束。当语句块内只包含一条语句时块定义语句可以缺省。 如果在定义语句块的同时还引入了一个块名,则该语句块可以由这个块名惟一标识,该语句块被称为一个“有名块”。在有名块内可以定义内部寄存器变量,并且可以用“disable”中断语句来中断有名块内语句的执行。同时语句块的块名还提供了惟一标识寄存器的一种方法。 语句块只能出现在行为描述模块中,但它不必非得出现在与过程语句initial或always的结合中,后面我们可以看到:在高级程序语句中以及任务和函数中都可以出现语句块结构。,5.2.1 串行块(begin-end块) 串行块的块定义语句为“begin,end”,串行块中的各条语句按串行方式顺序执行。串行块的格式如下: begin : 块内局部变量说明 时间控制1 行为语句1 时间控制n 行为语句n end 其中,“块内局部变量说明”可以是reg型变量声明语句、integer型变量声明语句及real型变量声明语句。,串行块执行时的特点如下: (1) 串行块内的各条语句是按它们在块内出现的次序逐条顺序执行的,当前面一条语句执行完毕后下一条语句才能开始执行。 (2) 块中每条语句中的延时控制都是相对于前一条语句结束时刻的延时控制。 (3) 在进行仿真时,当遇到串行块时,块中第一条语句随即就开始执行;当串行块中最后一条语句执行完毕时,程序流程控制就跳出串行块,串行块结束执行。整个串行块的执行时间等于其内部各条语句执行时间的总和。,下面给出串行语句块的几个例子。 【例5-8】一个时钟上升沿控制的三位移位寄存器。 module Three_bit_shift_register (clk,d_in,d_out); input clk; input d_in; output d_out; reg reg_a, reg_b, d_out; always (posedge clk) begin d_out=reg_b; reg_b=reg_a; reg_a=d_in; end endmodule,在例5-8的代码内包含了一个begin-end串行块,它属于always过程块的一部分。时钟的上升沿跳变将触发串行块的执行:第一条赋值语句首先执行,将reg_b的值赋给寄存器d_out;执行完第一条语句后,程序流程控制转到第二条语句,开始执行第二条语句,将reg_a的值赋给reg_b;然后执行第三条语句,将输入d_in值赋给reg_a;在执行完第三条语句(串行块中的最后一条语句)后,程序流程跳出串行块,串行块结束执行。 下面是一个块内语句带有延时的情况。,【例5-9】由带有延时控制的语句组成的串行块,用于产生时序波形。 module sequential_signal_gen( d_out ); output d_out; reg d_out; initial begin d_out=0; #1 d_out=1; #2 d_out=0; #3 d_out=1; #4 d_out=0; end endmodule,例5-9中的begin-end串行块属于initial过程块的一部分。块中语句执行过程如下: (1) 在仿真开始后(t=0时刻)串行块就开始执行,首先执行第一条语句,第一条语句执行完时也就是在0时刻d_out值变为0。 (2) 然后开始执行第二条语句,由于第二条赋值语句带有1个单位时间的延时,所以直到第一条语句结束1个单位时间后(t=1时刻),第二条赋值语句才开始执行,d_out的值变为1。 (3) 同样,第三条赋值语句是在第二条语句结束2个单位时间后(t=3时刻)开始执行,d_out的值变为0。 (4) 第四条赋值语句是在第三条语句结束3个单位时间后(t=6时刻)开始执行,d_out的值变为1。,(5) 第五条赋值语句是在第四条语句结束4个单位时间后(t=10时刻)开始执行,d_out的值变为0。 (6) 第五条赋值语句结束后,串行块结束执行。 上例中串行语句块执行过程所产生的波形如图5.1所示。,图5.1 例5-9的执行产生的波形,5.2.2 并行块(fork-join块) 并行块的块定义语句为“fork,join”,并行块中的多条语句是并行执行的。并行块的格式如下: fork : 块内局部变量说明 时间控制1 行为语句1; 时间控制n 行为语句n; join 其中,“块内局部变量说明”可以是reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句及事件(event)声明语句。,并行块执行时的特点如下: (1) 并行块内各条语句是同时并行地执行的,也就是说当程序流程控制进入并行块后,块内各条语句都各自独立地同时开始执行。各条语句的起始执行时间都等于程序流程控制进入该并行块的时间。 (2) 块内各条语句中指定的延时控制都是相对于程序流程控制进入并行块的时刻的延时,也就是相对于并行块开始执行时刻的延时。 (3) 当并行块内所有的语句都已经执行完毕后,也就是当执行时间最长的那一条块内语句结束执行后,程序流程控制才跳出并行块,结束并行块的执行。整个并行块的执行时间等于执行时间最长的那条语句所需的执行时间。 下面给出并行块的几个例子。,【例5-10】用并行块来产生时序波形。 module sequential_signal_gen( d_out ); output d_out; reg d_out; initial fork d_out=0; #1 d_out=1; #2 d_out=0; #3 d_out=1; #4 d_out=0; join endmodule,从例5-10与例5-9的比较中可以看出,它们两者惟一的差别就是把块定义语句由原来的串行块定义语句“begin-end”改为这里的并行块定义语句“fork-join”。但这一改变将导致语句块的执行过程与执行结果都发生变化。 在仿真开始后(t=0时刻)initial过程语句随即被执行,并行块随后也开始执行(t=0时刻),块内所有语句的执行被同时启动: 由于第一条赋值语句没有时延,所以第一条语句的赋值操作也是在0时刻同时进行的,使d_out取值变为0。 由于第二条赋值语句带有1个单位时间的延时,所以在并行块开始执行1个单位时间后(t=1时刻),第二条赋值语句对应的赋值操作才真正得到执行,将d_out的取值改变为1。,同样,第三条赋值语句对应的赋值操作是在并行块开始执行2个单位时间后(t=2时刻)才进行的,将d_out取值变为0;第四条赋值语句对应的赋值操作是在并行块开始执行3个单位时间后(t=3时刻)才进行的,将d_out取值变为1;第五条赋值语句对应的赋值操作是在并行块开始执行4个单位时间后(t=4时刻)进行的,使d_out的值变为0。 由于并行块中的五条语句的执行所需时间分别是0,1,2,3,4个单位时间,其中第五条赋值语句所需时间最长,所以在第五条语句执行完毕后(t=4时刻),并行块结束执行。 该并行语句块执行过程产生的波形如图5.2所示,它和上一小节中用串行块实现的图5.1所示的波形是不同的。 要注意例5-10并行块内各条赋值语句出现的次序可以是不同的,比如其中各条语句的次序可以是例5-11所示的情况。,图5.2 例5-10的执行产生的波形,【例5-11】并行块内语句的不同次序。 initial fork #3 d_out=1; #2 d_out=0; #4 d_out=0; #1 d_out=1; d_out=0; join 在例5-11中,并行块内的各条语句并不是按它们被执行的先后顺序给出的,但例5-11同样可以生成与例5-10相同的波形。,5.2.3 串行块和并行块的混合使用 在分别对串行块和并行块进行了介绍之后,我们还必须讨论一下串行块和并行块的混合使用。它可以分为如下两种情况。 (1) 当串行块和并行块 属于不同的过程块(initial或always过程块)时,串行块和并行块是并行执行的。,【例5-12】串行块和并行块属于不同过程块时的情况。 module belong_to_different_pro_block(a,b); output a, b; reg a, b; initial / 第一个initial过程块 begin / 串行块 a=0; / 语句S1 #20 a=0; / 语句S2 b=1; / 语句S3 #40 a=0; / 语句S4 b=0; / 语句S5 end,initial / 第二个initial过程块 fork / 并行块 b=1; / 语句P1 #10 a=1; / 语句P2 #10 b=0; / 语句P3 #30 a=1; / 语句P4 #50 a=1; / 语句P5 join endmodule,例5-12中出现了两个initial过程块,这两个过程块是并行执行的,所以它们内部所包含的begin-end串行语句块和fork-join并行语句块也是并行执行的。而在串行块内部,各条语句按顺序方式执行;在并行块内部,各条语句按并行方式执行。例5-12中各条语句的执行时序如表5.2所示。,(2) 当串行块和并行块嵌套使用在同一过程块内时,内层语句块可以看作是外层语句块中的一条普通语句,内层语句块在什么时刻得到执行是由外层语句块的规则所决定的;而在内层语句块开始执行后,其内部各条语句的执行要遵守内层语句块的规则。,【例5-13】嵌套使用的串行块和并行块。 module para_bloc_nested_in_seri_bloc (a,b); output a, b; reg a, b; initial / initial过程块 begin / 外层的串行块 a=0; / 语句S1 b=1; / 语句S2 #10 a=1; / 语句S3 fork /内层的并行块,将其标记为S_P b=0; / 语句P1 #10 b=1; / 语句P2 #20 a=0; / 语句P3,join #10 b=0; / 语句S4 #10 a=1; / 语句S5 b=1; / 语句S6 end endmodule,在例5-13所示模块中,initial过程块内部包含了一个串行块,而该串行块内部又嵌套了一个并行块。这时可以将整个并行块看作串行块中的一条语句(标记为S_P,用来代表整个并行块),根据串行块内部语句的顺序执行方式,语句S1,S2,S3,S_P,S4,S5,S6将按顺序方式执行,内层并行块(由S_P表示)要等到语句S1、S2、S3依次执行完毕后才能开始执行。而一旦内层并行块开始执行,并行块中的各条语句将按并行块规定的并行方式执行。在本例中语句S3完成执行的时刻是仿真开始10个单位时间后(t=10时刻),所以内层并行块是在t=10时刻开始执行的,此时(t=10时刻)并行块内语句P1、P2、P3同时开始执行。当内层并行块的所有语句都执行完毕后,外层串行块中排在内层并行块后面的那条语句就开始执行。在本例中,内层并行块中最后执行完的语句是P3,它在内层并行块执行开始20个单位时间后(t=30时刻)才能结束执行,此时整个内层并行块结束执行,仿真进程将进入下一条语句S4。 例5-13内各条语句的执行时序如表5.3所示。,当然也可以有串行块被嵌套在并行块内部的情况发生,这种情况下的执行过程与上面讲述的相类似,就是将内层串行块看成是外层并行块的一条特殊语句,这条特殊语句在并行块中与其它语句一起并行执行,而内层串行块内的各条语句在串行块内得到顺序执行。,【例5-14】串行块被嵌套在并行块内部的情况。 module seri_bloc_nested_in_para_bloc(a,b,c,d,e); output a,b,c,d,e; reg a,b,c,d,e; initial / initial过程语句 fork / 外层的并行块 #10 a = 1; / 语句P1 #15 b = 1; / 语句P2 begin / 内层的串行块 #20 c = 1; / 语句S1 #10 d = 1; / 语句S2 end #25 e = 1; / 语句P3 join endmodule,例5-14中的内层串行块可看作是外层并行块的一条语句,它要与并行块中的其它语句P1,P2,P3一起并行执行。所以当仿真进程进行到initial过程块后,内层串行块与语句P1,P2,P3同时开始执行;而内层串行块中的两条语句(S1和S2)则是以顺序方式执行的:先执行S1,在S1执行完毕后S2才开始执行。 例5-14中各条语句的执行时序如表5.4所示。,

    注意事项

    本文([信息与通信]Verilog HDL数字系统设计及其应用袁俊泉第5章.ppt)为本站会员(音乐台)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开