赞
踩
第二章 Verilog程序设计语句和描述方式
<net_declaratlon><range><name>;
assign #<delay><name> = Assignment expression;
module exa1(a,b,m,n,c,y,w);
input[3:0]a,b,m,n;
output[3:0]c,y;
wire[3:0]a,b,m,n,c,y;
assign y = m|n;
assign #(3,2,4) c = a&b;
endmodule
<net_declaration><drive_strength><range>#<delay><name> = Assignment expression;
module exa2(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=a&b;
wire(strong0,weakl) [3:0] #(2,l,3) w = (a^b)&(m^n);
endmodule
<net_declaratlon>:连线型变量类型
<range>: 变量位宽,指明了变量数据类型的宽度,格式为[msb:lab],缺省为1。
<drive_strength>:赋值驱动强度,可选的,只能在“隐式连续赋值语句”格式中得到指定。它用来对连线型变量受到的驱动强度进行指定。例如:wire (weak0, strong1) out = in1&in2;
<delay>:延时量,可选。#(delay1, delay2, delay3,…)。
类别 | 语句 | 可综合性 |
过程语句 | initial | |
always | √ | |
语句块 | 串行语句块begin-end | |
并行语句块fork-join | ||
赋值语句 | 连续赋值assign | √ |
过程赋值=,<= | √ | |
条件语句 | if-else | √ |
case,casez,casex | √ | |
循环语句 | forever | |
repeat | ||
while | ||
for | √ | |
循环语句 | `define | √ |
`include | √ | |
`ifdef,`else,`endif | √ |
always@(<敏感事件列表>) 语句块;
@(a) //当信号a的值发生改变时
@(a or b) //当信号a或信号b的值发生改变时
@(posedge clock) //当clock的上升沿到来时
@(negedge clock) //当clock的下降沿到来时
@(posedge clk or negedge reset) //当clk的上升沿到来或reset信号的下降沿到来时
例如:用initial语句产生测试信号
例如:用always语句描述4选1数据线选择器。
例如:用always语句描述同步置数,同步清零计数器
例如:用always过程语句描述异步清零计数器
串行语句块采用关键字’ begin"和"end",其中的语句按串行方式顺序执行,可以用于可综合电路程序和仿真测试程序。其语法格式是:
并行语句块采用关键字"fork"和"join ”,其中的语句按并行方式并发执行,只能用于仿真测试程序,不能用于可综合电路程序。其语法格式是:
如下例:
波形仿真图如下:
两种方式的对比:
变量 = 表达式;
变量 <= 表达式;
下例详解:
在上面两个程序中,基本描述相同,不同的是程序(1)采用了阻塞赋值语句,而程序(2)采用了非阻塞赋值语句。
如果采用阻塞赋值语句描述程序(2)的电路,其Verilog程序代码是:
又如下例:
assign <寄存器型变量> = <赋值表达式>;
deassign <寄存器型变量>;
force <寄存器或连线型变量> = <赋值表达式>;
release<寄存器或连线型变量>;
1.if条件语句
if条件语句就是判断所给的条件是否满足,然后根据判断的结果来确定下一步的操作。
例如:
case | 0 | 1 | x | z |
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
casez | 0 | 1 | x | z |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
x | 0 | 0 | 1 | 1 |
z | 1 | 1 | 1 | 1 |
casex | 0 | 1 | x | z |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
x | 1 | 1 | 1 | 1 |
z | 1 | 1 | 1 | 1 |
在使用case语句时,应包含所有状态,如果没包含,那么缺省项必须写,否则将产生锁存器,这在同步时序电路设计中是不允许的。
$finish
为止。如果需要从forever循环中退出,则可以使用disable语句。forever语句的语法格式是:forever 语句或语句块;
repeat (循环次数表达式) 语句或语句块;
while(条件表达式) 语句或语句块;
for(循环变量赋初值; 循环结束条件; 循环变量增值) 语句块;
结构描述方式就是将硬件电路描述成一个分级子模块系统,通过逐层调用这些模块构成功能复杂的数字逻辑电路和系统的一种描述方式。在这种描述方式下,组成硬件电路的各个子模块之间的相互层次关系以及相互连接关系都需要得到说明。
根据所调用子模块的不同抽象级别,可以将模块的结构描述方式分成如下三类:
〈1)模块级建模:通过调用由用户设计生成的低级子模块来对硬件电路结构进行说明,这种情况下模块由低级模块的实例组成。
(2)门级建模:通过调用Verilog内部的基本门级元件来对硬件电路的结构进行说明,这种情况下模块将由基本门级元件的实例组成。
(3)开关级建模:通过调用Verilog内部的基本开关元件来对硬件电路的结构进行说明,这种情况下模块将由基本开关级元件的实例组成。
模块级建模就是通过调用由用户自己描述产生的module模块对硬件电路结构进行说明,并设计出电路。
模块建模方式可以把一个模块看作是由其它模块像积木一样搭建而成。模块中被调用模块属于低一层次的模块,如果当前模块不再被其它模块所调用,那么这个模块一定是所谓的顶层模块。在对一个硬件系统的描述中,必定有而且只能有一个顶层模块。
模块名 <参数值列表>实例名(端口名列表);
<参数值列表>实例名1 (端口名列表1),
<参数值列表>实例名2 (端口名列表2),
... ...
<参数值列表>实例名n (端口名列表n);
<被调用模块名><实例阵列名>[阵列左边界:阵列右边界](<端口连接表>);
模块名<参数值列表>实例名(<信号名1>,<信号名2>,...,<信号名n>);
//半加器模块
module halfadder(a,b,s,c);
input a,b;
output c,s;
assign s = a^b;
assign c = a&b;
endmodule
//全加器模块
module fulladder(p,q,ci,co,sum);
input q,p,ci;
output co,sum;
wire w1,w2,w3;
halfadder U1(p,q,w1,w2);
halfadder U2(ci,w1,sum,w3);
or U3(co,w2,w3);
endmodule
(2)端口名对应方式
端口名对应方式是Verilog允许的另一种模块调用方式,其语法格式如下:
模块名<参数值列表> 实例名(.端口名1<信号名1> , .端口名2<信号名2>, ... , .端口名n<信号名n>);
例如:端口名对应的模块调用的例子
module dff(d,clk,clr,q);//D触发器模块,时被调用的模块,属于底层模块
input d,clk,clr;
output q;
reg q;
always@(posedge clk or negrdge clr)
begin
if(!clr)
q = 0;
else
q = d;
end
endmodule
module shifter_D(din,clock,clear,out);//顶层模块,用来调用底层模块
inprt din,clock,clear;
output [3:0] out;
dff U1(.q(out[0]),.d(din),.clk(clock),.clr(clear));
dff U1(.q(out[1]),.d((out[0]),.clk(clock),.clr(clear));
dff U1(.q(out[2]),.d((out[1]),.clk(clock),.clr(clear));
dff U1(.q(out[3]),.d((out[2]),.clk(clock),.clr(clear));
endmodule
(3)不同端口位宽的匹配
在端口和端口表达式之间存在着一种隐含的连续赋值的语句。因此当端口和端口表达式的位宽不一致时,会进行端口的匹配,采用的位宽匹配规则与连续赋值时使用的规则相同。
例如:模块调用时不同位宽的匹配问题
模块名<参数值列表> 调用名(端口名列表);
module halfadder(a,b,s,c);//半加器模块
input a,b;
output c,s;
parameter xor_delay = 2, and_delay = 3;
assign #xor_delay s=a^b;
assign #and_delay c=a&b;
endmodule
module fulladder(p,q,ci,co,sum);//全加器模块
input p,q,ci;
output co,sum;
parameter or_delay = 1;
wire w1,w2,w3;
halfadder U1(p,q,w1,w2);
halfadder U2(ci,w1,sum.w3);
or #or_delay U3(co,w2,w3);
endmodule
module top1(top1a,top1b,top1s,top1c);//修改半加器模块参数的模块top1
input top1a,top1b;
output top1s,top1c;
defparam U1.xor_delay = 4, U1.and_delay = 5;//名为U1的半加器实例中对参数xor_delay和参数and_delay值的修改
halfadder U1(top1a,top1b,top1s,top1c);
endmodule
module top2(top2p,top2q,top2ci,top2co,top2sum);//修改全加器模块参数的模块top2
input top2p,top2q,top2ci;
output top2co,top2sum;
defparam U2.U1.xor_delay = 6,//名为U2的全加器实例中引用的名为U2的半加器实例中对参数xor_delay和and_delay的修改
U2.U2.and_delay = 7;
U2.or_delay = 5;//名为U2的全加器实例中对参数or_delay值修改
fulladder U2(top2p,top2q,top2ci,top2co,top2sum);
endmodule
(1)Verilog HDL基本门级元件的类型
Verilog HDL内置26个基本元件,其中14个是门级元件,12个为开关级元件,这26个基本元件及其分类见下表。
类型 | 元件 | |
基本门 | 多输入门 | and, nand, or, nor, xor, xnor |
多输入门 | buf, not | |
三态门 | 允许定义驱动强度 | buif0, bfif1, notif0, notif1 |
mos开关 | 无驱动强度 | nmos, pmos, cmos, rnmos, rpmos, rcmos |
双向开关 | 无驱动强度 | tran,tranif0,tranif1 |
无驱动强度 | rtran, rtranif0, rtranif1 | |
上拉,下拉电阻 | 允许定义驱动强度 | pullup, pulldown |
Verilog中丰富的门级元件为电路的门级结构提供了方便。Verilog语言中的门级元件见下表:
(2)门级模块调用
多输入门元件调用的语法格式是:
门类型 <实例名>(<输出端口1>, <输出端口2>, ..., <输出端口n>, <输入端口>);
例如:
多输出门元件调用的语法格式是:
元件名 <实例名>(<输出端口1>, <输出端口2>, ..., <输出端口n>, <输入端口>);
例如:
三态门元件调用的语法格式是:
元件名 <实例名>(<数据输出端口>, <数据输入端口>, <控制输入端口>);
例如:
例如:调用门级元件实现下图2-4译码管
Verilog语言提供了十几种开关级基元,它们是实际的MOS管的抽象表示。这些开关级基元分为两大类:一类是MOS开关,一类是双向开关。每一大类又可分为电阻型(前缀用r表示)和非电阻型。
(1)MOS开关
MOS开关模拟了实际的MOS器件的功能,包括nmos、pmos、cmos 三种。
nmos和pmos的实例化语格式是:
nmos或pmos 实例名(out, data, control);
coms开关的实例化语言格式是:
cmos 实例名(out, data, ncontrol, pcontrol);
(2)双向开关
MOS开关只提供了信号的单向驱动能力,为了模拟实际的具有双向驱动能力的门级开关,Verilog语言提供了双向开关。双向开关的每个脚都被声明为inout类型,都可以作为输入驱动另一脚,也可以作为输出被另一脚驱动。
双向开关包括无条件双向开关(tran)和有条件双向开关(tranif0、 tranifl)。
无条件双向开关的例化语言格式是:
tran 实例名(inout1,inout2);
有条件双向开关示例化语言格式是:
tranif0或tranif1 实例名(inoutl,inout2, control);
下表列出Verilog语言中提供的开关级元件和功能说明。
例如,基本的nmos开关电路
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。