Verilog行为描述.ppt

上传人:牧羊曲112 文档编号:5452071 上传时间:2023-07-08 格式:PPT 页数:63 大小:239.49KB
返回 下载 相关 举报
Verilog行为描述.ppt_第1页
第1页 / 共63页
Verilog行为描述.ppt_第2页
第2页 / 共63页
Verilog行为描述.ppt_第3页
第3页 / 共63页
Verilog行为描述.ppt_第4页
第4页 / 共63页
Verilog行为描述.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《Verilog行为描述.ppt》由会员分享,可在线阅读,更多相关《Verilog行为描述.ppt(63页珍藏版)》请在三一办公上搜索。

1、第四章: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由五个部分组成,主要部分是描述体部分。描述体部分由多个并行运行的过程块组成,而每个过程块又由过程块语句和块语句所组成,块语句则进一步由过程赋值语句和高级程序语句构成。,Verilog HDL 行为描述的模块,描述体部分:,过程语句(事件控制敏感表)块语句开始标识符:块名 块内局部变

2、量说明 一条或多条过程赋值或高级程序语句 块语句结束标识符,过程块的形式:,过程语句initial 和 always:,过程语句是:initial 或 always;事件敏感表只在always过程语句中出现,用于激活过程语句的执行;块语句标识符分begin-end(串行块)与fork-joint(并行块)两类。,过程语句的特点:,1.两者都是从0时刻执行,initial 过程语句后面的块语句沿时间轴只执行一次,而always 则循环地重复执行其后的块语句。2.initial 过程语句不带触发条件,从0时刻开始执行它后面的块语句;always过程语句带有触发条件。3.一个模块的行为描述中可以有多

3、个initial和always语句,代表多个过程的存在,他们之间相互独立,并行运行。,例子:,module clk_gen_demo(clock1,clock2);output clock1,clock2;/port declarationreg clock1,clock2;/data declarationinitial begin clock1=0;clock2=1;end always begin#50 clock1=clock2;end always begin#100 clock2=clock2;endendmodule,4.2 块语句,块语句是由begin-end 或fork-jo

4、int 界定的一组行为描述语句。构成块语句的作用之一就是相当于给这组行为描述语句进行打包处理,使之在形式上与一条语句相一致。块语句只能出现在行为描述中。,4.2.1 串行块 begin-end,1.串行块的语句按照排列次序,逐条顺序执行。每条语句的延时是相对于前一条语句结束时的时间;2.串行块的起始时间是第一条语句开始的时间;结束时间是最后一条语句完成的时间;3.串行块的行为描述可以理解为硬件电路在时钟及控制信号作用下,数据沿数据通道的各级寄存器之间的传送过程。,例4-2 一个包含延时的串行块描述的例子,begin#10 reg_a=reg_b;#10 reg_c=reg_a;end 当流程控

5、制进入串行块后,经10 单位时间,reg_b的值赋给reg_a;再过10单位,又将reg_a的值赋给reg_c;到标识符end,流程转出块外。运行结果:reg_a 和 reg_c 先后变成reg_b 的值。从上述过程可以看到,每条语句的延时是相对于前一条语句而言的,串行块是沿时间轴顺序执行。,4.2.2 并行块fork_join,1并行块中的每条语句是同时并行执行,各条语句的执行过程与语句在块中的顺序无关。块中的每条语句给出的延时都是相对于该块开始的绝对时间。2并行块的起始时间是流程转入该块的时间,每条语句都是相对于这个时间同时开始的。块的结束时间就是该块中按时间排序最后执行的一条语句结束的时

6、间。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;initialbegin wav=0;#delay

7、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;initialfork wav=0;#50 wav=1;#100 wav=0;#150 wav=1;#200 wav=0;#250-end_wave;join,例4-7 用于验证并行块描述中语句

8、的排序不影响语句的执行过程的例子。,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;joinendmodule,423 有名块 Named-block,有名块取名方法是在块语句开始标识符(串行块的begin或并行块的fork)后面加上一个冒号,之后给出一个名字即可。去了名字的块称之为有名块。,一、便于实现对块语句执行过程的有效控制 对于多条语句构成的块语句,各条

9、语句顺序或并行运行。如果需要根据过程的状态,控制过程的是否继续执行下去。给块命名后,可以通过后面要介绍的disable语句,在必要时终止(或提前结束)该有名块语句的执行过程。,有名块的作用之一:,二、允许在块语句内部引入局部变量 局部变量的含义类似于c语言中的相应含义。只在该块内部起作用。Verilog HDL中,变量都是静态变量(同样请参考c语言的静态变量)。给块命名后,就可以在模拟时给属于这一有名块的局部变量分配内存地址单元。即使局部变量与块外的其他变量同名,由于块名的标识,模拟系统很容易据此加以区别。显然,局部变量只可能是寄存器类的变量。,有名块的作用之二:,4.3赋值语句,4.3.1

10、什么是过程赋值语句4.3.2 过程赋值语句的两种延时模式4.3.3 阻塞型与非阻塞型过程赋值4.3.4 连续赋值语句assign4.3.5 过程连续赋值语句(assign/deassign,force/release),Verilog HDL对模块的行为描述由一个或多个并行运行的过程块构成,而位于过程块中的赋值语句称之为过程赋值语句。过程赋值语句只能对寄存器类的量进行赋值。过程语句的左边必须是寄存器类的变量(reg.integer.real.Time).对于多位宽的寄存器变量(矢量)可以只对其中某一位或某几位赋值。对与存储器只能通过选定的地址单元,对某个字赋值;还可以将前述各类变量用连续符拼接

11、起来,构成一个整体作为过程赋值的左端。,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 过程赋值语句的两种延时模式,过程赋值语句的基本形式:寄存器变量表达式 考

12、虑赋值过程的定时控制(Timing-control)时,根据定时控制在过程赋值语句中的不同位置,存在两类定时模式:一.外部定时模式 二.内部定时模式,一、外部模式:,表达式:该延时的模式:经“定时控制”所确定的延时后,计算出右端表达式的值,把结果赋值给左端的“寄存器变量”。其中的“定时控制”分为两种类型:1.延时控制 2.事件控制,1.延时控制,延时控制就是直接给出所需延时的时间,如:delay a=b;这条语句表明,经delay确定的延时时间后,过程赋值语句右端表达式才被求值并被赋给左端的寄存器变量。,2.事件控制,事件控制以符号“”开头,后面紧跟的是事件控制控制敏感表,有以下几种形式:(1

13、)(信号名);(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

14、信号出现上升沿,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)r

15、eg_out=0;上例表示,只有 reset 或 clear 中的任一个出现下跳变,reg_out被复位。,二、内部模式:,=;在内部模式中,有关“定时控制”的表现形式与上面对外部模式中的说明完全一致。两者之间的差别在于,在外部模式中,定时控制位于过程赋值语句之前,直接体现为对过程赋值语句执行事件的延期(postpone)上,只有当延时时间被满足,或其他类型的激发条件被满足后,过程赋值语句才能被计算和赋值。,内部模式说明:,在内部模式中,定时控制位于赋值语句内部,与外部模式相同的是,两者都是在延时时间到期后再执行过程赋值操作,不同的是右端表达式的求值过程是在不同的时间段进行的。在外部模式中,直

16、到延时到后,再对表达式求值,并执行赋值过程。而在内部模式中,先完成对表达式的求值,待延时到后,条件满足时,再把前面求得的结果赋给左边的寄存器变量。下表说明了两者之间的关系:,两者之间的关系:,例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 阻塞型过程赋值于非阻塞型过程赋值,过程赋值语句的两种赋值方式:阻塞型过程赋值与非赋值型过程赋值。在过程赋值语句中,赋值算符“”被称为阻塞

17、型过程赋值算符。前一条语句没有完成赋值之前,后面的语句不可能被执行。即前一条赋值语句没有执行,使得后面的语句都被阻塞住了(Blocking),这种赋值过程称之为阻塞型赋值,相应的赋值语句被称为阻塞型赋值语句(Blocking Assignment Statement).,例410 一个用于说明阻塞型赋值语句与非阻塞型赋值语句差别的例子。,Module demo_blocking_or_non;Reg a,b,c,d,e,f;/*方法一:blocking assignment in a serial block*/initia begin a=#10 1;b=#5 0;c=#1 1;end,方法

18、二:non-blocking assignment in a serial block,initial begin a=#10 1;b=#5 0;c=#1 1;endendmodule,同时包含阻塞型与非阻塞型串行块的描述:1.在前一个阻塞型赋值语句的串行块中,到达10单位时刻时,a得到1;在到达15单位时刻时,b得到0的值;在到达16单位时刻时,c得到1。2.在后一个使用非阻塞型赋值语句的串行块描述中,c在1单位时刻首先得到1;继之b在5时间单位时得到了0;最后才是a在10单位时刻得到了1。,阻塞型赋值与非阻塞型赋值的比较:,例411 用非阻塞型赋值语句产生一段周期为100时间单位,占空为1

19、:1的信号:,module wave_gen_nonblk(wav);output wav;reg wav;event ebd_wave;initialbeginwavend_wave;end endmodule,例412 用串行块及阻塞型赋值语句描述的一个例子。,module demo_seri_bloc(reg_a,reg_b,data,clock);input data,clock;output reg_a,reg_b;reg reg_a,reg_b;always(posedge clock)begin reg_a=data;reg_b=reg_a;endendmodule,例412 描

20、述的综合结果,例413 用并行块及阻塞型赋值语句描述的一个例子。,module demo_seri_para(reg_a,reg_b,data,clock);input data,clock;output reg_a,reg_b;reg reg_a;reg_b;always(posedeg clock)fork reg_a=data;reg_b=reg_a;join endmodule,例414 用串行块及非阻塞型赋值语句描述的一个例子。,module demo_seri_nonblk(reg_a,reg_b,data,clock);input data,clock;output reg_a,

21、reg_b;reg reg_a,reg_b;always(posedeg clock)begin reg_a=data;reg_b=reg_a;end endmodule,4.3.1 什么是过程赋值语句(continuous assignment statement),过程赋值与连续赋值之间的差别:1赋值对象的不同:连续赋值用于对连续类变量赋值,过程赋值 完成对寄存器变量的赋值。2赋值过程实现方法不同:变量被连续赋值以后,右端的信号有任何变化,都将引起左端变量的变化;而过程赋值只有在语句被执行到时,赋值过程才进行一次,且赋值过程的具体执行时刻还受到定时控制和延时模式等诸方面的影响。,过程赋值与

22、连续赋值之间的差别:,3语句出现的位置不同:连续赋值语句不能出现在任何一个过程块中;过程赋值语句则只能出现在过程块中。4语句结构的不同:连续赋值语句以关键词assign为先导(有缺省情况),语句中的赋值算符分阻塞型和非阻塞型两类。,过程赋值与连续赋值之间的差别:,5.冲突处理方式的不同:一条连续可被多条连续赋值语句同时驱动,最后的结果依据连续类型的不同有相应的冲突处理方式;寄存器变量在同一时刻只允许一条过过程赋值语句对其进行赋值。,例 4-15 用两种方式实现一个与门的描述.方式一:用连续赋值语句实现,方式一:用连续赋值语句实现module demo_and_assign(c,a,b);inp

23、ut a,b;output c;assign c=aendmodule,方式二:用过程赋值语句实现,module demo_and_procedure(c,a,b);input a,b;output c;reg calways(a or b)c=aendmodule,4.3.5 过程连续赋值语句,Verilog HDL中有两组过程连续赋值语句,即assign/deassign与force/release.一、assign与deassign二、force/release,例 4-16 用过程边续赋值语句实现具有异步清零功能(低电平有效)的上升没D触发器,module dff_asyn(q,d,c

24、lear,clk);output q;input d,clear,clk;reg q;always(clear)/*asynchronous clear procedure blockIf(!clear)assign q=0;elsedessign q;/normal D flip procedure blockalways(posedge clk)q=d;endmodule,二、force 与 release,force 与 release 的定义和 assign 与deassign 所作的说明是一样的,差别体现在:1.assign与deassign的赋值对象只能是寄存器量:force与re

25、ease的赋值对象即可以是寄存器量,也可以是连线类量.2.对寄存器而言,force与release是一个比assign和deassign有更高优先级的赋值语句:对连线类变量而言,它同样具有最高优先级,可以覆盖掉其它所有对这条连线驱动.,4.4 高级程序语句,4.4.1 if-else条件语句4.4.2 case 语句 4.4.3 forever循环语句 4.4.4 repeat循环语句 4.4.5 while 循环语句 4.4.6 for 循环语句 4.4.7 disable 循环中断控制语句 4.4.8 wait 语句与有名事件,4.4.1 if-else条件语句,一、if(条件表达式)块语

26、 二、if(条件表达式)块语句1 else 块语句2三、if(条件表达式1)块语句1 else if(条件表达式2)块语句2,一、if(条件表达式)块语,当条件表达式成立指条件表达式为1(逻辑真),如果出现0,x或Z等非1,作为不成立处理.另外,这晨对块语句的定义与4.2节对块语句的定义完全一致.当块语句只由一条语句构成时,块语句标识符可以缺省.这些在后面不再一一进行重复说明.,一条没有else选项的if语句映射到硬件上,形成一个锁存器。如:always(enable or data)if(enable)out=data;当enable有效时,输出(out)得到data的值;而enable无效

27、时,上面的描述并没有告知输出端(out)应当处在什么状态。而按照过程的定义,在执行下一次赋值操作之前,寄存器将保持原值不变,于是综合器将据此产生一个锁存器,用以保存输出out的值。,二、if(条件表达式)块语句1 else 块语句2,当条件表达式成立时,执行后面的块语句1,当条件表达式不成立时,执行else后面的块语句2.条件算符”?:”就是从这一形式演化而来的.一条带有else选项的if语句映射到硬件上,通常形成的是一个多路选择器(MUX),如:always(enable or data_a or data_b)if(enable)out=data_a;else out=data_b;,上面

28、的语句为,当enable有效时,输出端out得到data_a的值,而当enable无效时,输出端out得到data_b的值。由于每种情况下,out端都有相应输入端与之相连,因而综合器将由此产生一个二选一的MUX。当Enable有效时,输出端out被连到data_a输入端,实现一个MUX的代价比实现一个锁存器小得多。对于多位宽情况,这里对应的都是一组MUX或一组锁存器,因而差距更为明显。,三、if(条件表达式1)块语句1 else if(条件表达式2)块语句2 else if(条件表达式n)块语句n else 块语句n+1,第三种情况是多路选择控制,注意条件表达式1到条件表达式n的排列顺序,表明

29、了条件判断的先后次序,本身隐含着一种优先级关系,有时需利用if-else的这一特性实现优先级控制,有时则要注意避免它给不需要优先级的电路设计的电路带来的影响。,条件语句是允许嵌套使用的,如:,if(条件表达式1)/外层if-else语句 if(条件表达式2)块语句1/内嵌if-else语句 else块语句2 else if(条件表达式3)块语句3/内嵌if-else语句 else 块语句4,在必要的情况下可以通过加入块标识符(begin-end)帮助确辨认其中的配对关系参见下面的两种表达式:if(条件表达式1)/外层if-else语句 if(条件表达式2)块语句1/内嵌if-else语句 a=a+b;else a=a+c;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号