Verilog HDL程序设计语句和描述方式.ppt
VerilogHDL程序设计语句和描述方式11/11/20241
3.1数据流建模3.1.1连续赋值语句连续赋值的目标类型主要是标量线网和向量线网两种。(1)标量线网,如:wirea,b;(2)向量线网,如:wire[3:0]a,b;显式连续赋值语句:net_declarationrangename;assign#delayname=Assignmentexpression;隐式连续赋值语句:net_declarationdrive_strengthrange#delayname=Assignmentexpression;11/11/20242
11/11/20243例3.1-1显式连续赋值语句的例子moduleexample1_assignment(a,b,m,n,c,y);input[3:0]a,b,m,n;output[3:0]c,y;wire[3:0]a,b,m,n,c,y;assigny=m|n;assign#(3,2,4)c=ab;endmodulenet_declaration(连线型变量类型)range(变量位宽),指明了变量数据类型的宽度,格式为[msb:lsb],缺省为1位。drive_strength(赋值驱动强度)是可选的,只能在“隐式连续赋值语句”格式中得到指定。它用来对连线型变量受到的驱动强度进行指定。wire(weak0,strong1)out=in1in2;delay(延时量)这一项是可选的。#(delay1,delay2,delay3)例3.1-2隐式连续赋值语句的例子moduleexample2_assignment(a,b,m,n,c,y,w);input[3:0]a,b,m,n;output[3:0]c,y,w;wire[3:0]a,b,m,n;wire[3:0]y=m|n;wire[3:0]#(3,2,4)c=ab;wire(strong0,weak1)[3:0]#(2,1,3)w=(a^b)(m^n);endmodule
连续赋值语句需要注意的以下几点:赋值目标只能是线网类型(wire);在连续赋值中,只要赋值语句右边表达式任何一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号(若没有定义延时量);连续赋值语句不能出现在过程块中。多个连续赋值语句之间是并行语句,因此与位置顺序无关。连续赋值语句中的延时具有硬件电路中惯性延时的特性,任何小于其延时的信号变化脉冲都将被滤除掉,不会体现在输出端口上。11/11/20244
3.2行为级建模11/11/20245过程赋值语句高级程序语句过程块连续赋值语句模块调用……过程语句(initial/always)语句块模块描述定义行端口类型说明数据类型说明描述体结束行
11/11/20246类别语句可综合性过程语句initialalways√语句块串行语句块begin-end√并行语句块fork-join赋值语句过程连续赋值assign过程赋值=、=√条件语句if-else√case,casez,casex√循环语句foreverrepeatwhilefor√编译向导语句`define√`include√`ifdef,`else,`endif√
3.2.1过程语句1.initial过程语句 initial过程语句的语法格式为: initial begin 语句1; 语句2; ... 语句n; end11/11/20247例3.2-1用initial过程语句对变量A,B,C进行赋值moduleinitial_tb1;regA,B,C;initialbegin A=0;B=1;C=0; #100 A=1;B=0; #100 A=0;C=1; #100 B=1; #100 B=0;C=0; endendmodule
2.always语句块从语法描述角度,相对于initial过程块,always语句块的触发状态是一直存在的,只要满足always后面的敏感事件列表,就执行过程块。其语法格式是:always@(敏感事件列表) 语句块; 例如:* @(a) //当信号a的值发生改变时 @(aorb) //当信号a或信号b的值发生改变时 @(posedgeclock) //当clock的上升沿到来时 @(negedgeclock) //当clock的下降沿到来时 @(posedgeclkornegedgereset) //当clk的上升没到来或reset信号的下降沿到来时11/11/20248
3.过程语句使用中需要注意的问题在信号定义形式方面,无论是对时序逻辑还是组合逻辑描述,Verilo