资源预览内容
第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
第9页 / 共63页
第10页 / 共63页
亲,该文档总共63页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第四章: verilog HDL 行为描述,4.1 verilog HDL 行为描述概要 4.2 块语句 4.3 赋值语句 4.4 高级程序语句 4.5 verilog HDL 任务与函数,4.1 verilog 行为描述概要,4.1.1 过程块 4.1.2 过程语句 initial 与 always,4.1.1 过程块,HDL由五个部分组成, 主要部分是描述体部分。描述体部分由多个并行运行的过程块组成, 而每个过程块又由过程块语句和块语句所组成, 块语句则进一步由过程赋值语句和高级程序语句构成。,描述体部分:,过程语句 (事件控制敏感表) 块语句开始标识符: 块名 块内局部变量说明 一条或多条过程赋值或高级程序语句 块语句结束标识符,过程块的形式:,4.1.2过程语句initial 和 always:,过程语句是:initial 或 always; 事件敏感表只在always过程语句中出现,用于激活过程语句的执行;块语句标识符分begin-end(串行块)与fork-joint (并行块)两类。,过程语句的特点:,1. 两者都是从0时刻执行,initial 过程语句后面的块语句沿时间轴只执行一次,而always 则循环地重复执行其后的块语句。 2.initial 过程语句不带触发条件,从0时刻开始执行它后面的块语句;always过程语句带有触发条件。 3.一个模块的行为描述中可以有多个initial和always语句,代表多个过程的存在,他们之间相互独立,并行运行。,例子:,module clk_gen_demo(clock1, clock2); output clock1, clock2; /port declaration reg clock1,clock2; /data declaration initial begin clock1=0; clock2=1; end always begin #50 clock1=clock2; end always begin #100 clock2=clock2; end endmodule,4.2 块语句,块语句是由begin-end 或fork-joint 界定的一组行为描述语句。构成块语句的作用之一就是相当于给这组行为描述语句进行打包处理,使之在形式上与一条语句相一致。 块语句只能出现在行为描述中。,4.2.1 串行块 begin-end,1.串行块的语句按照排列次序,逐条顺序执行。 每条语句的延时是相对于前一条语句结束时的时间; 2.串行块的起始时间是第一条语句开始的时间;结束时间是最后一条语句完成的时间; 3.串行块的行为描述可以理解为硬件电路在时钟及控制信号作用下, 数据沿数据通道的各级寄存器之间的传送过程。,例4-2 一个包含延时的串行块描述的例子,begin #10 reg_a=reg_b; #10 reg_c=reg_a; end 当流程控制进入串行块后,经10 单位时间,reg_b的值赋给reg_a;再过10单位,又将reg_a的值赋给reg_c;到标识符end,流程转出块外。运行结果:reg_a 和 reg_c 先后变成reg_b 的值。从上述过程可以看到,每条语句的延时是相对于前一条语句而言的,串行块是沿时间轴顺序执行。,4.2.2 并行块fork_join,1并行块中的每条语句是同时并行执行, 各条语句的执行过程与语句在块中的顺序无关。块中的每条语句给出的延时都是相对于该块开始的绝对时间。 2并行块的起始时间是流程转入该块的时间,每条语句都是相对于这个时间同时开始的。块的结束时间就是该块中按时间排序最后执行的一条语句结束的时间。 3并行块的行为描述可以理解为硬件电路上电后,各电路模块同时开始工作的过程。,例44 一个包括延时地并行块描述的例子,fork #10 reg_a=reg_b; #10 reg_c=reg_a; join 将这个并行描述与例42中的串行描述对照,差别是块标识符从原来的串行标识符begin_end改为这里的并行标识符fork_join。正是这一改变导致块语句的执行过程与执行结果都发生了变化。,module wave_gen_seri(wav); output wav; reg wav; event end_wave; parameter delay=50; initial begin wav=0; #delay wav=1; #delay wav=0; #delay wav=1; #delay wav=0; #delay -end_wave; end,例4-5. 用串行块行为描述产生一段周期为100时间单位。占空比为1:1的信号波形。,例4-6 用并行块描述一段周期为100时间单位、占 空比为1:1的信号,module wave_gen_para(wav); output wav; reg wav; event end_wave; initial fork wav=0; #50 wav=1; #100 wav=0; #150 wav=1; #200 wav=0; #250 -end_wave; join,例4-7 用于验证并行块描述中语句的排序不影响语句的执行过程的例子。,module wave_gen_para_verify(wav); output wav; reg wav; event end_wave; initial fork #250 -end_wave; #200 wav=0; #150 wav=1; #100 wav=0; #50 wav=1; wav=0; join endmodule,423 有名块 Named-block,有名块取名方法是在块语句开始标识符(串行块的begin或并行块的fork)后面加上一个冒号,之后给出一个名字即可。去了名字的块称之为有名块。,一、便于实现对块语句执行过程的有效控制 对于多条语句构成的块语句,各条语句顺序或并行运行。如果需要根据过程的状态,控制过程的是否继续执行下去。给块命名后,可以通过后面要介绍的disable语句,在必要时终止(或提前结束)该有名块语句的执行过程。,有名块的作用之一:,二、允许在块语句内部引入局部变量 局部变量的含义类似于c语言中的相应含义。只在该块内部起作用。Verilog HDL中,变量都是静态变量(同样请参考c语言的静态变量)。给块命名后,就可以在模拟时给属于这一有名块的局部变量分配内存地址单元。即使局部变量与块外的其他变量同名,由于块名的标识,模拟系统很容易据此加以区别。显然,局部变量只可能是寄存器类的变量。,有名块的作用之二:,4.3赋值语句,4.3.1 什么是过程赋值语句 4.3.2 过程赋值语句的两种延时模式 4.3.3 阻塞型与非阻塞型过程赋值 4.3.4 连续赋值语句assign 4.3.5 过程连续赋值语句(assign/deassign,force/release),Verilog HDL对模块的行为描述由一个或多个并行运行的过程块构成,而位于过程块中的赋值语句称之为过程赋值语句。过程赋值语句只能对寄存器类的量进行赋值。 过程语句的左边必须是寄存器类的变量(reg. integer. real. Time).对于多位宽的寄存器变量(矢量)可以只对其中某一位或某几位赋值。对与存储器只能通过选定的地址单元,对某个字赋值;还可以将前述各类变量用连续符拼接起来,构成一个整体作为过程赋值的左端。,4.3.1 什么是过程赋值语句 (continuous assignment statement),reg_a=8b1011_1100; /对一个8位寄存器的赋值 reg_a3=1b0; /对寄存器的某一位赋值 reg_a7:4=4b1010; /对寄存器的几位赋值 mem_aaddress=8h5d; /*对由address地址指定的寄存器单元赋值*/ carry,sum=reg_a+reg_b; /*通过连接算符构成一个整体进行赋值*/,例48 对各种形式的寄存器变量进行过程赋值的例子,4.3.2 过程赋值语句的两种延时模式,过程赋值语句的基本形式: 寄存器变量表达式 考虑赋值过程的定时控制(Timing-control)时,根据定时控制在过程赋值语句中的不同位置,存在两类定时模式: 一.外部定时模式 二.内部定时模式,一、外部模式:,表达式: 该延时的模式: 经“定时控制”所确定的延时后,计算出右端表达式的值,把结果赋值给左端的“寄存器变量”。其中的“定时控制”分为两种类型: 1.延时控制 2.事件控制,1.延时控制,延时控制就是直接给出所需延时的时间, 如: delay a=b; 这条语句表明,经delay确定的延时时间后,过程赋值语句右端表达式才被求值并被赋给左端的寄存器变量。,2.事件控制,事件控制以符号“ ”开头,后面紧跟的是事件控制控制敏感表,有以下几种形式: (1) (信号名); (2) (clock) reg_a=reg_b; (3) (negedge clock) reg_a=reg_b; (4) (事件1 or事件2 or事件3)。,(1) (信号名),信号名所指定的信号通常是一位标量,也可以是多位的矢量。该形式的含义:只要被检验的信号发生变化(一般是指上升沿或下降沿)时,后面的赋值语句就被执行。如: (clock) reg_a=reg_b; 当clock发生跳变(上升沿或下降沿),reg_b的值就赋给reg_a。,(2) (posedge信号名),信号发生上升沿跳变(positive edge)如: (posedge clock) reg_a=reg_b; 只要检测到clock信号出现上升沿,reg_b的值就赋给reg_a。,(3)(negedge信号名),信号发生下降沿跳变的情况 如: (negedge clock) reg_a=reg_b; 只要当检测到clock信号的下降沿,reg_b的值就赋给reg_a。,(4) (事件1 or 事件2 or 事件3),表达式中的事件是指上面(1)、(2)、(3)三类事件中的任何一种事件,or表示逻辑或的意思,即只要所列举的任何一种情况出现,都将激活这里的事件控制。 注意,Verilog HDL只提供“或”方式来处理多重触发情况,没有再定义诸如“与”等其他方式。,例子:,(posedge reset or posedge clear) reg_out=0; 上例表示,只有 reset 或 clear 中的任一个出现下跳变,reg_out被复位。,二、内部模式:, = ; 在内部模式中,有关“定时控制”的表现形式与上面对外部模式中的说明完全一致。两者之间的差别在于,在外部模式中,定时控制位于过程赋值语句之前,直接体现为对过程赋值语句执行事件的延期(postpone)上,只有当延时时间被满足,或其他类型的激发条件被满足后,过程赋值语句才能被计算和赋值。,内部模式说明:,在内部模式中,定时控制位于赋值语句内部,与外部模式相同的是,两者都是在延时时间到期后再执行过程赋值操作,不同的是右端表达式的求值过程是在不同的时间段进行的。在外部模式中,直到延时到后,再对表达式求值,并执行赋值过程。而在内部模式中,先完成对表达式的求值,待延时到后,条件满足时,再把前面求得的结果赋给左边的寄存器变量。下表说明了两者之间的关系:,两者之间的关系:,例4-9 一个包含延时的并行块 的两种描述形式,方式一:对应于外部模式 fork #10 reg_a=reg_b; #10 reg_b=reg_a; join 方式二:对应于内部模式 fork reg_a=#10 reg_b; reg_b=#10 reg_a; join,4.3.3 阻塞型过程赋值于非阻塞型过程赋值,过程赋值语句的两
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号