Verilog语言基础知识

Verilog语言基础知识
Verilog语言基础知识

Verilog HDL语言基础知识

先来看两个Verilog HDL程序。

例6.1 一个8位全加器的 Verilog HDL源代码

module adder8(cout,sum,ina,inb,cin);

output[7:0] sum;

output cout;

input[7:0] ina,inb;

input cin;

assign {cout,sum}=ina+inb+cin; //全加

endmodule

【例6.2】一个8位计数器的Verilog HDL源代码

module counter8(out,cout,data,load,cin,clk);

output[7:0] out;

output cout;

input[7:0] data;

input load,cin,clk;

reg[7:0] out;

always @(posedge clk)

begin

if(load)

out=data;

else

out=out+cin;

end

assign cout=&out&cin;

endmodule

从上面的例子可以看出:

① Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module 和endmodule 两个语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。

②每个模块首先要进行端口定义,并说明输入(input)和输出(output),然后对模块的功能进行逻辑描述。

③Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分多行写。

④除了endmodule语句外,每个语句的最后必须有分号。

⑤可以用/*……*/和//……对Verilog HDL程序的任何部分作注释。

6.1.2 Verilog HDL模块的结构

Verilog HDL的基本设计单元是"模块(block)"。一个模块是由两部分组成的,一部分描述接口;另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明,图6.1示出了一个"与-或-非"门电路。

1

2

3

1

23

A

B

C

D

F

图6.1"与-或-非"电路

该电路表示的逻辑函数可以写为:

F = AB + CD

用Verlog HDL语言对该电路进行描述如下:

【例6.3】与-或-非门电路

module AOI(A,B,C,D,F); // 模块名为AOI(端口列表A,B,C,D,F)

input A,B,C,D; // 定义模块的输入端口A,B,C,D

output F; // 定义模块的输出端口F

assign F= ~((A&B)︱(C&D)); // 模块内的逻辑描述

endmodule

从上面的例子可知,电路图符号的引脚也就是程序模块的端口,在程序模块内描述了

电路图符号所实现的逻辑功能。在上面的Verilog HDL设计中,模块中的第2、第3行说

明接口的信号流向,第4行说明了模块的逻辑功能。

Verilog HDL结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包

括4个主要部分: 端口定义,I/0说明,信号类型声明和功能描述。

1. 模块的端口定义

模块的端口声明了模块的输人和输出口。其格式如下:

module 模块名(口1,口2,口3,口4,……);

2.模块内容

模块内容包括 I/O说明,信号类型声明和功能定义。

(1) I/O说明的格式如下:

输人口: input端口名1,端口名2,……端口名N;

输出口: output端口名l,端口名2,……端口名N;

I/O说明也可以写在端口声明语句里。其格式如下:

module module_name(input portl,input port2,…output portl,output port2,…);

(2)信号类型声明:

它是说明逻辑描述中所用信号的数据类型及函数声明。如

reg[7:0] out; //定义out的数据类型为reg(寄存器)型

对于端口信号的缺省定义类型为wire(连线)型。

6.1.3 逻辑功能定义

模块中最重要的部分是逻辑功能定义。有3种方法可在模块中描述逻辑。

1.用assign语句

如:assign F = ~((A&B)|(C&D));

这种方法的句法很简单,只须写一个“assign”,后面再加一个方程式即可。

"assign"语句一般适合于对组合逻辑进行赋值,称为连续赋值方式。

2.用元件例化(instantiate)

如: and myand3(f, a,b,c);

这个语句利用Verilog HDL提供的与门库,定义了一个三输人的与门。采用实例元件的方法同在电路图输入方式下调入库元件一样,键入元件的名字和引脚的名字即可。要求每个实例元件的名字必须是唯一的。

3.用always块语句

在【例6.2】的计数器模块中

always @(posedge clk) //每当时钟上升沿到来时执行一遍块内语句

begin

if(load)

out=data;

else

out=out+cin;

end

always块可用于产生各种逻辑,常用于描述时序逻辑。这个例子用always块生成了一个带有同步置数的计数器。always块可用很多种描述手段来表达逻辑,如此例中就用了if-else语句来表达逻辑关系。

综上所述,可给出Verilog HDL模块的模板如下:

Verilog HDL模块的模板(仅考虑用于逻辑综合的部分,不考虑用于逻辑模拟的部分)。

module <顶层模块名>,(<输入输出端口列表>);

output输出端口列表; //输出端口声明

input输入端口列表; //输入端口声明

/* 定义数据,信号的类型,函数声明,用关键字wire,reg,funtion等定义 */ //使用assign语句定义逻辑功能

wire 结果信号名;

assign <结果信号名> = <表达式>;

//使用 always块描述逻辑功能

always @ (<敏感信号表达式>)

begin

// 过程赋值

// if语句,

// case语句

// while,for,repeat循环语句

// function调用

end

// 模块元件例化

< module_name模块名>,,();

// 门元件例化

gate_type_keyword ();

endmodule

6.2 数据类型及常量、变量

Verilog HDL中共有19种数据类型。数据类型是用来表示数字电路中的数据存储和传送单元的。在此介绍4个最基本的数据类型: integer型、parameter型、reg型和wire 型。

Verilog HDL中也有常量和变量之分,他们分属以上这些类型。

6.2.1 常量

在程序运行过程中,其值不能被改变的量称为常量。

1. 数字

(1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式:

◇二进制整数(b或B);

◇十进制整数(d或D);

◇十六进制整数(h或H);

◇八进制整数(o或O)。

完整的数字表达式为:

<位宽>'<进制> <数字>,

位宽为对应二迸制数的宽度,如:

8'b11000101 //位宽为8位的二进制数11000101;

8'hc5 //位宽为8位的十六进制数c5;

十进制的数可以缺省位宽和进制说明,如:

197 //代表十进制数197

(2)x和z值

x表示不定值,z表示高阻值。每个字符代表的宽度取决于所用的进制,例如:

8'b1001xxxx; 等价于8'h9x;

8'b1010zzzz; 等价于8'haz;

当常量不说明位数时,默认值为32位。此外,“?”是高阻态的z的另一种表示符号。

2.常量

在Verilog HDL中,用parameter来定义常量,即用parameter来定义一个标志符,代表一个常量,称为符号常量。其定义格式如下:

parameter 参数名1=表达式,参数名2=表达式,参数名3=表达式……;

例如:

parameter sel=8,code=8'ha3;

//分别定义参数sel为常数8(十进制),参数code为常数a3(十六进制)

6.2.2 变量

变量是在程序运行过程中其值可以改变的量。变量分为两种:一种为网络型(nets type),另一种为寄存器型(register type)。

1. nets型变量 wire

nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表6.1。

表6.1 常用的nets型变量及说明

类型功能说明

wire,tri 连线类型(wire和tri功能完全相同)

wor,trior 具有线或特性的连线(两者功能一致)

wand,triand 具有线与特性的连线(两者功能一致)

tri1,tri0 分别为上拉电阻和下拉电阻

supply1,supply0 分别为电源(逻辑1)和地(逻辑0)

这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。

wire型变量格式如下:

⑴.定义宽度为1位的变量:

wire 数据名1,数据名2,……数据名n;

例如:wire a,b; //定义了两个宽度为1位wire型变量a,b

⑵.定义宽度位n位的向量(vectors):

wire[n-1:0] 数据名1,数据名2,……数据名n;

wire[n:1] 数据名1,数据名2,……数据名n;

例如:wire[7:0] databus; //定义一个8位wire型向量

或wire[8:1] databus;

wire型向量可按以下方式使用:

wire[7:0] in,out; //定义两个8位wire型向量in,out

assign out=in;

若只使用其中某几位,可直接指明,注意宽度要一致。如:

wire[7:0] out;

wire[3:0] in;

assign out[5:2]=in; //out向量的第二位到第5位与in向量相等

2. register型变量 reg

register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register型变量与nets变量的根本区别在于:register需要被明确地赋值,并在被重新赋值前一直保持原值。在设计中必须将寄存器型变量放在过程块语句(如initial,always)中,通过过程赋值语句赋值。另外,在always过程块内被赋值的每一个信号都必须定义成寄存器型。

Verilog HDL中,有4种寄存器型变量,见表6.2

表6.2常用的register型变量及说明

类型功能说明

reg 常用的寄存器型变量

integer 32位带符号整数型变量

real 64位带符号整数型变量

time 无符号时间变量

Integer、real、time等3种寄存器型变量都是纯数学的抽象描述,不对应任何具体的硬件电路。reg型变量是最常用的一种寄存器型变量,下面介绍reg型变量。

reg型变量格式如下:

reg 数据名1,数据名2,……数据名n;

例如: reg a,b; //定义了两个宽度为1位的reg型变量a,b

若定义一个向量,则按以下格式:

reg[n-l:0]数据名1,数据名2,……数据名n;

reg[n:l]数据名1,数据名2,……数据名n;

它们定义了数据的宽度为n位。如下面的语句定义了8位宽的数据

例如:

reg[7:0] data; //定义data为8位宽的reg型向量

或:

reg[8:1] data;

3. 数组

若干个相同宽度的向量构成数组,reg型数组变量即为memory型变量,即可定义存储器型数据。如:

reg[7:0] mymem[l023:0];

上面的语句定义了一个1024个字节、每个字节宽度为8位的存储器。通常,存储器采用如下方式定义:

parameter wordwidth=8,memsize = l024;

reg[wordwidth-l:0] mymem[memsize-l:0];

上面的语句定义了一个宽度为8位、1024个存储单元的存储器,该存储器的名字是mymem,若对该存储器中的某一单元赋值的话,采用如下方式:

mymem[8]=1; //mymem存储器中的第8个单元赋值为1

注意: Verilog HDL中的变量名、参数名等标记符是对大小写字母敏感的。

6.3 运算符及表达式

6.3.1 运算符

1. 算术运算符

+ 加

- 减

* 乘

/ 除

% 求模

算术运算符都是双目运算符。

2. 逻辑运算符

&& 逻辑与

|| 逻辑或

! 逻辑非

3. 位运算符

位运算是将两个操作数按对应位进行逻辑运算。位运算符包括

- 按位取反

& 按位与

| 按位或

^ 按位异或

^~,~ ^ 按位同或

当两个不同长度的数据进行位运算时,会自动地将两个操作数按右端对齐,位数少的操作数会在高位用0补齐。

4. 关系运算符

< 小于

< = 小于或等于

> 大于

> = 大于或等于

在进行关系运算时,如果声明的关系是假,则返问值是0;如果声明的关系是真,则返回值是1;如果某个操作数的值不定,则其结果是模糊的,返回值是不定值。

5. 等式运算符

= = 等于

!= 不等于

= = = 全等

!= = 不全等

这4种运算符都是双目运算符,得到的结果是1位的逻辑值。如果得到1,说明声明的关系为真;如得到0,说明声明的关系为假。

相等运算符(= =)和全等运算符(= = =)的区别是参与比较的两个操作数必须逐位相等,其相等比较的结果才为l,如果某些位是不定态或高阻值,其相等比较得到的结果就会是不定值。而全等比较(= = =)是对这些不定态或高阻值的位也进行比较,两个操作数必须完全一致,其结果才为1。否则结果是0。

如:设寄存器变量a=5'b110x01,b=5'11x01,则“a= = b”得到的结果为不定值x,而“a= = =b”得到的结果为l。

6. 缩减运算符(单目运算)

& 与

~ & 与非

| 或

~ | 或非

^ 异或

^ ~ ,~ ^ 同或

缩减运算符与位运算符的逻辑运算法则一样,但缩减运算是对单个操作数进行与、或、非递推运算的。如:

reg[3:0] a;

b=&a; //等效于b=((a[0]&a[1])&a[2])&a[3];

例:若A=5'b11001,则:

&A=0;//只有A的各位都为1时,其与缩减运算的值才为l。

|A=l; //只有A的各位都为0时,其或缩减运算的值才为0。

7. 移位运算符

>> 右移

<< 左移

移位运算符用法:

A >> n或 A<< n

表示把操作数A右移或左移n位,并用0填补移出位。

8. 条件运算符(三目运算符)

?:

格式:信号 = 条件 ? 表达式1:表达式2;

当条件成立时,信号取表达式1的值,反之取表达式2的值.

9.位拼接运算符

{ } //将两个或多个信号的某些位拼接起来。用法:

{信号1的某几位,信号2的某几位,……,信号n的某几位}

例如,在进行加法运算时,可将输出与和拼接在一起使用。

output[3:0] sum; //sum代表和

output cout; //cout为进位输出

input[3:0] ina,inb;

input cin;

assign {cout,sum}=ina+inb+cin; //进位与和拼接在一起

位拼接可以嵌套使用,还可以用重复法来减化书写,如:

{3{a,b}}等同于{{a,b},{a,b},{a,b}},也等同于{a,b,a,b,a,b}。

6.3.2. 运算符的优先级

以上运算符的优先级如下:

!,~ 高优先级

*,/,%

+,-

<< , >>

< , < = , > , > =

= = , != , = = = , != =

& , ~&

^ , ^ ~

| , ~ |

&&

||

? : 低优先级

6.4 语句

Verilog HDL支持许多语句,从而成为结构化和过程性的语言。Verilog HDL的语句包括:赋值语句、条件语句、循环语句、结构说明语句和编译预处理语句等。每一类又包括几种不同的语句,具体如表6.3所示。

表6.3 Verilog HDL语句

赋值语句连续赋值语句

过程赋值语句

条件语句if-else语句

case语句

循环语句forever语句repeat语句while语句for语句

结构说明语句initial语句always语句function语句

编译预处理语句'define语句

'include 语句'timescale语句

6.4.1 赋值语句

1. 连续赋值语句 assign

assign为连续赋值语句,它用来对wire型变量进行赋值。

格式:

assign 变量 = 表达式;

如: assign c = a & b;

在上面的赋值中,a和b信号的任何变化,都将随时反映到c上来,因此称为连续赋值方式。

2. 过程赋值语句

过程赋值语句用于对寄存器类型(reg)的变量进行赋值。过程赋值有以下两种方式。

(1)非阻塞(non_blocking)赋值方式

赋值号为 <= ,如 b<=a;

非阻塞赋值在块结束时才完成赋值操作,即b的值并不是立刻就改变的。

(2)阻塞(blocking)赋值方式

赋值号为 = ,如 b=a;

阻塞赋值在该语句结束时就完成赋值操作,即b的值在该赋值语句结束后立刻改变。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能执行,就像被阻塞(blocking)一样,因此称为阻塞赋值方式

(3)阻塞赋值方式和非阻塞赋值方式的区别

阻塞赋值方式和非阻塞赋值方式的区别常给设计人员带来问题。问题主要是对“always”模块内的reg型变量得赋值不易把握。为区分阻塞赋值与非阻塞赋值的不同,可看下面两例。

【例6.4】非阻塞赋值【例6.5】阻塞赋值

module non_block(c,b,a,clk); module block(c,b,a,clk);

output c,b; output c,b;

input clk,a; input clk,a;

reg c,b; reg c,b;

always @ (posedge clk) always @ (posedge clk)

begin begin

b<=a; b=a;

c<=b; c=b;

end end

endmodule endmodule

将上面两段代码用MAX+PLUSⅡ进行综合,并进行仿真,可看到二者的区别:

对于非阻塞赋值,c的值落后b的值一个时钟周期,这是因为该“always”块每一个时钟周期执行一次,因此信号的值每一个时钟周期更新一次,c的值是上一时钟周期的b 值。

对于阻塞赋值,c的值和b的值一样,这是因为b的值是立即更新的。

为避免对这两种赋值语句的应用错误,建议在初学时刻只是用一种,比如采用阻塞赋值“=”,因为它类似C语言的赋值方式。为避免出错,在同一块内,不要将输出重新作为输入使用。而为实现上述非阻塞赋值功能,可采用两个“always”块来实现,代码如下:module non_block(c,b,a,clk);

output c,b;

input clk,a;

reg c,b;

always @ (posedge clk)

begin

b=a;

end

always @ (posedge clk)

begin

c=b;

end

endmodule

6.4.2 条件语句

条件语句是顺序语句,应放在“always”块内。

1. if-else语句

使用方法有以下3种

① if(表达式) 语句;

② if(表达式1) 语句1;

else 语句2;

③if(表达式1) 语句1;

else if(表达式2) 语句2;

else if(表达式3) 语句3;

……

else if(表达式n) 语句n;

else 语句n+1;

这三种方式中,“表达式”一般为逻辑表达式或关系表达式,也可能是一位变量。若表达式的值为0,x,z,视为“假”;若为1,视为“真”。语句可以是单句,也可以是多句,多句时用“begin-end”括起来。

2. case语句

多用于多条件译码电路,如描述译码器、数据选择器、状态机及微处理器的指令译码等。

⑴. case语句

格式:

case (敏感表达式)

值1:语句1;

值2:语句2;

……

值n:语句n;

default: 语句n+1;

endcase

⑵. casez和casex语句

case 语句中,敏感表达式与值1~值n之间的比较是一种全等比较,必须保证两者的对应位全等。 casez与 casex语句是case语句的两种变体,三者的表示形式中唯一的区别是3个关键词case,casez,casex的不同。在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就不予考虑,因此,只需关注其他位的比较结果。而在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较的双方有一方的某些位的值是x或z,那么这些位的比较就不予考虑。

此外,还有另外一种标识x或z的方式,即用表示无关值的“?”来表示。

6.4.3 循环语句

Verilog HDL中存在4种类型的循环语句,用来控制语句的执行次数。这4种语句分别为:

①foreve 连续地执行语句,多用在"initial"块中,以生成周期性输入波形。

②repeat 连续执行一条语句n次。

①while 执行一条语句,直到循环条件不满足。

②for 语句

由于MAX+PLUS 软件不支持repeat语句。forever语句一般用在initial语句块中,而MAX+PLUS 软件不支持initial语句块,因此这里只介绍for和while两种语句。

1.for语句

格式:

for(表达式1;表达式2;表达式3)语句;

即:for (循环变量初值;循环结束条件;循环变量增值) 执行语句;

2.while语句

格式:

while(循环执行条件表达式) 语句;

while语句执行时,首先判断循环执行表达式是否为真,若为真,执行循环体中语句,然后,再判断循环执行条件表达式是否为真,……,直至条件表达式不为真为止。循环体中语句可以是单句,也可以是多句,多句时用“begin-end”括起来。

6.4.4 结构说明语句

Verilog HDL中的任何过程模块都从属于以下4种结构说明语句:

◇initial

◇always

◇task

◇function

inital说明语句一般用于仿真中的初始化,仅执行一次;always块内的语句则是不断重复执行的;task和function语句可以在程序模块中的一处或多处调用。

由于MAX+PLUS 软件不支持task,initial语句, 因此这里只介绍always和function 两种结构说明语句

1.always块语句

always块语句模板如下:

always@(<敏感信号表达式>)

begin

//过程赋值

//if语句

//case语句

//while,repeat,for循环

//task,function调用

end

在一个模块(module)中,使用always语句的次数是不受限制的。always块内的语句是不断重复执行的。

说明:

⑴敏感信号表达式

敏感信号表达式又称事件表达式或敏感表,当该表达式的值改变时,就会执行一遍块内语句。因此在敏感信号表达式中应列出影响块内取值的所有信号(一般为所有输入信号)。若有两个或两个以上信号时,它们之间用"or"连接。

例如,下面用case语句描述的4选1数据选择器,只要输入信号in0,inl,in2,in3或选择信号sel[1:0]改变则输出改变,所以敏感信号表达式写为:

in0 or in1 or in2 or in3 or sel

【例6.6】用case语句描述的4选1数据选择器

module mux4_1(out,in0,in1,in2,in3,sel);

output out;

input in0,in1,in2,in3;

input[1:0] sel;

reg out;

always @ (in0 or in1 or in2 or in3 or sel)

case(sel)

2’b00: out=in0;

2’b01: out=in1;

2’b10: out=in2;

2’b11: out=in3;

default: out=2’bx;

endcase

endmodule

⑵ posedge与negedge关键字

对于时序电路,事件是由时钟边沿触发的。为表达边沿这个概念,Verilog HDL提供了posedge和negedge两个关键字来描述。比如在例6.2的8位计数器中有块语句: always @ (posedge clk) //上升沿时刻计数

posedge clk表示时钟信号clk的上升沿,negedge clk表示时钟信号clk的下降沿。

2. 函数 function

函数的目的是返回一个用于表达式的值。函数的定义格式为:

function <返回值位宽或类型说明> 函数名;

端口声明;

局部变量定义;

其他语句;

endfunction

【例6.7】函数举例

function[7:0] gefun;

input[7:0] x;

reg[7:0] count;

integer i;

begin

count=0;

for(i=0;i<=7;i=i+1)

if(x[i]=1’b0) count=count+1;

gefun=count;

end

endfunction

上面的gefun函数循环核对输人的每一位,计算出0的个数,并返回一个适当的值。

<返回值位宽或类型说明>是一个可选项,如果缺省,则返回值为一位关于寄存器类型的数据。

函数的定义中蕴含了一个与函数同名的、函数内部的寄存器。在函数定义时,将函数返回值所使用的寄存器设为与函数同名的内部变量,因此函数名被赋予的值就是函数的返回值。例如在上例中,gefun最终赋予的值即为函数的返回值。

函数的调用是通过将函数作为表达式中的操作数来实现的。调用格式如下:

<函数名>,(<表达式> <表达式>);

比如使用连续赋值语句调用函数gefun时,可以采用如下语句:

assign out=is_legal ? gefun(in) : 1'b0;

注意,在函数中不能包含有任何的时间控制语句,并且定义函数时至少要有一个输人参量。

6.5 语句的顺序执行和并行执行

用Verilog HDL模块来设计电路,首先应该清楚哪些操作是同时发生的,哪些是顺序发生的。在“always”模块内,逻辑是按照指定的顺序执行的,"always"块内的语句称为顺序语句因为这些语句完全按照书写的顺序来执行。"always"模块之间,是同时执行的,或者说是并行执行的。两个或更多个"always"模块、“assign”语句、实例元件等都是同时执行的。通过下面的例子,可以清楚地看到"always"模块内的语句是顺序执行的,而always"模块之间是并行执行的。

【例6.8】顺序执行模块1 【例6.9】顺序执行模块2

module serial(q,a,clk) module seria2(q,a,clk)

output q,a; output q,a;

input cIk; input cIk;

reg q,a; reg q,a;

always @ (posedge clk); always @ (posedge clk);

begin begin

q= ~ q; a= ~ q;

a= ~ q; q= ~ q;

end end

endmodule endmodule

上面的两个例子,其区别只是在"always"模块内,把两个赋值语句的顺序相互颠倒。分别对上面的两个模块用MAX+PLUSII软件进行模拟仿真,从得到的波形可以看到:在模块1中q先取反,然后再取反给a,a和q的波形是相反的;在模块2中,q取反后赋值给q和a,a和q的波形是相同的。如果将上述两句赋值语句分别放在两个"always"模块中,如下面例6.8和例6.9两个程序所示,经过仿真可以发现:这两个"always" 模块放置的顺序对结果并没有影响,因为这两个模块是并行执行的。

【例6.10】并行模块1 【例6.11】并行模块2

moduleparal(q,a,clk); moduleparal2(q,a,clk);

output q,a; output q,a;

lnput cIk; lnput cIk;

reg q,a; reg q,a;

always @ (posedge clk) always @ (posedge clk) begin begin

q= ~ q; a= ~ q;

end end

always @ (posedge clk) always @ (posedge clk) begin begin

a= ~ q; q= ~ q;

end end

endmodule endmodule

例6.10和例6.11的仿真波形与例6.9的仿真波形是完全相同的。

6.6 小结

本章介绍Verilog HDL的语法结构,包括变量、语句、模块和不同抽象级别的电路的设计和描述。

需要注意的是,所有的Verilog HDL编译软件都只支恃该语言的某一个子集。所以,在使用Verilog HDL 进行编译时,必须弄清楚所用编译软件的功能,用编译软件支持的语句来描述所设计的系统。

七.参考资料

《数字系统设计与Verilog HDL》电子工业出版社王金明等编著。

《CPLD逻辑电路设计与实习》捷太出版社萧如宣著

verilog基本语法

Verilog基本语法 【逻辑值】 逻辑0 表示低电平,GND 逻辑1 表示高电平,VCC 逻辑X 表示未知电平,可能是高电平,也可能是低电平 逻辑Z 表示高阻态,外部没有激励信号,是一个悬空状态 注:高阻态的实质:电路分析时高阻态可做开路理解。 可以把它看作输出(输入)电阻非常大,对下级电路无任何影响。 若为0、x、z则按照假处理;若为1,按真处理。 【进制】 二进制4'b0101 —4位二进制数0101 十进制数4’d2 —4位十进制数2 十六进制数4’ha —4位十六进制数a Verilog中若不指定位宽,默认32位;若不指定位宽不指定进制,默认32位宽的十进制数。 【标识符】 标识符可以是字母、数字、$和_(下划线)的组合,且开头必须是字母或下划线,区分大小写。不建议大小写混合使用。 【数据类型】 寄存器关键字reg,默认初始值位不定值X; reg[31:0] delay_cnt; //[31:0],指定寄存器位宽32位, reg key_reg; // 默认位宽为1. reg类型数据只能在always和initial语句中被赋值。 线网表示结构实体的物理连线,包括wire和tri类型 参数常量,用parameter定义。 parameter H_SYNC = 11'd41; 【运算符】 [条件操作符] ?: 例,a?b:c //如果a为真就选b,否则选择c。 result=(a>=b)?a:b; [逻辑运算符] !&& || [位运算符] ~ & | ^(按位异或) a&b; //自动将位宽小的数高位补零至较大数的位宽,然后按位与操作。[移位运算符] << >> 用0填补移出的空位。左移时位宽增加,右移位宽不变。 [位拼接运算符] {} 例,{a,b} //将a和b拼接起来,作为一个新信号,a为高位。 c={a,b[3:0]}; //a、b位宽均为8位,c为8+4=12位。

Verilog语言基础知识

Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例一个8位全加器的Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; @ assign {cout,sum}=ina+inb+cin; 模块的端口声明了模块的输人和输出口。其格式如下: module 模块名(口1,口2,口3,口4,……); 2.模块内容 模块内容包括I/O说明,信号类型声明和功能定义。 (1) I/O说明的格式如下: ; 输人口: input端口名1,端口名2,……端口名N; 输出口: output端口名l,端口名2,……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portl,input port2,…output portl,output port2,…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 ( reg[7:0] out; 数字 (1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 ) 完整的数字表达式为: <位宽>'<进制> <数字>, 位宽为对应二迸制数的宽度,如: 8'b nets型变量wire nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表。 这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下: & ⑴.定义宽度为1位的变量: wire 数据名1,数据名2,……数据名n; 例如:wire a,b; register型变量reg register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

(完整word版)Verilog-A30分钟快速入门教程

?Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

Verilog-A 30分钟快速入门教程

?进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS L anguage Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog 基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的 简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(o ut)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(o ut)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如:

3.2.1 Verilog HDL程序入门[共2页]

║68 第3章 硬件描述语言Verilog HDL基础 3.2 Verilog HDL程序基本结构 Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL既是一种行为描述的语言,也是一种结构描述的语言。也就是说,既可以用电路的功能描述,也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下5种。 ?系统级(system):用高级语言结构实现设计模块的外部性能的模型。 ?算法级(algorithm):用高级语言结构实现设计算法的模型。 ?RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。 ?门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。 ?开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。 一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能。 ?可描述顺序执行或并行执行的程序结构。 ?用延迟表达式或事件表达式来明确地控制过程的启动时间。 ?通过命名的事件来触发其他过程里的激活行为或停止行为。 ?提供了条件、if-else、case、循环程序结构。 ?提供了可带参数且非零延续时间的任务(task)程序结构。 ?提供了可定义新的操作符的函数结构(function)。 ?提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 ? Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能。 —提供了完整的一套组合型原语(primitive); —提供了双向通路和电阻器件的原语; —可建立MOS器件的电荷分享和电荷衰减动态模型。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。 Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面将介绍Verilog

Verilog语法入门,初学者必看

Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/*” 开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21 //32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3 //一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3 //一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110 // 增强可读性 4’b10?? //相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world” //是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。 reg value; //reg是关键字;value是标识符

常用基本模块的VERILOG描述.

4 Table 7.1 Verilog Operators. V?rl*og Operator Oporallon * Add.8 ?SuMwIion ■Wu*p*Gakxi* i Division' % ModuhM' (t ConceTcnaDon - used to combine brts ?ratatoMi ?rotate fight oquoMly fB < iwft man Mt than or equal > g>Mi?r than >?grMtei than or equ. ?logics negauon &8 ANO II logical OR & Bitwise ATJO 1 Bitwise on A QirvwXOn 0 MeoMon ?Not luppcfird lit sinr Vmkf cymbnh txb In iMe Qwiis 11 tooK nwlfiply . divide j?td MAd otf iMe^er valuM ?cMpfMvtcd. LHicteA de<

4e hardware may requtfc the wr lo ^cedy ttw "tbOKhc tUfnmhni md de?^n tn Venktf. A A X B C D(l> IX2i Y

module galenetwork(A, B, C. D, X. Y); input A; Input B; Input C; input [2:1] D: output X, Y; reg Y; // concurrent assignment statement wire X = A & ~(B|C) & {D[1]入 D(2]); /*-4/ivays concurrent statement- sequentiaf execution inside 7 always @( A or B or C or D) Y = A & ~(B|C) & (D[1] A D⑵); endmodule module DEC_7SEG(Hox_digjt. segmont^a. tegment^b, 8ogmenl_c* aoQmonl_d. Mgmenl_o. sogmont t Mgmonl_g);Input [3:0] Hexjchflil: output segmenF a. segmenVb, segfnent_c, segment _d:output segmented, segmonlj, &egm9nt_g; reg (6:0] segmenedata: always(lP(Hex_digil) * Case ararMwir ■ logic truth taae “Mg gstesy case (Hex digit) 41> OOOO: 4-bOOOI: 4'b 0010: 4'b00l1: 4 b 0100: 4 b 0101: 4'b0110: 4b0111: 4'b 1000: 4 b 1001: 4 b 1010: 4 b 1011; 4 b 1100: 4 b 1101: 4 b 1110: rbilll: default: endcase fidgrnent_data s 7*b 1111110; sogment_data s 7b 0110000; 9egmen(_da(a s 7*b 1101101:segment data ? 7'b 1111001; segment data = 7*b0l10011; segmentdata = 7T> 1011011; aegment_data s 71)1011111; segmenT^dala s Tb1110000; 8?gmen(_dala * 7*b 1111111; segment data = Z'b 1111011; segment data = 71> 1110111; segment^data = 7^0011111; $egment_data ? 7'b 1001110; aegmont_data s 7b0111101; segmont_data ■ Tb 1001111; segment data z Tb 1000111; segment^data = Tb Fl

VerilogHDL语法基础

Verilog HDL语法基础(1) Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/ *”开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21//32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3//一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3//一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110// 增强可读性 4’b10??//相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world”//是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。

第二章Verilog基本知识

2.1 Verilog HDL的语言要素 Verilog HDL语法来源于C语言基本的语法,其基本此法约定与 C语言类似。 程序的语言要素称为语法,是由符号、数据类型、运算符和表达式构成的,其中符号包括空白符、注释符、和转义标示符、关键字、数值等。 2.1.1 空白符 空白符包括空格符(\b),制表符(\t)、换行符和换页符。空白符使代码看起来结构清晰,阅读起来更方便。在编译过程中,空白符被忽略。 2.1.2 注释符 Verilog HDL语言允许插入注释,标明程序代码功能、修改、版本等信息,以增强程序的可阅读性和帮助管理文档。 Verilog HDL有两种注释方式 1) 单行注释:单行注释以“ // ”开始,Verilog HDL 忽略从此处到行尾的内 容 2) 多行注释:多行注释以“ /* ”开始,到“ */ ”结束,Verilog 忽略 其中的注释内容

在Verilog HDL 中,标识符( Identifier )被用来命令信号名、模块名、参数名等。它可以使任意一组字母、数字、$符号和_符号的组合。应该注意的是,标识符的字符区分大小写,并且第一个字符必须是字母或者下划线 Verilog HDL规定了转义标识符(Escaped Identifie) 采用转义字符可以在一 条标识符中包含任何可打印的字符。转义标识符以“ ”(反斜线)符号开头,以 空白符结尾(空白可以是一个空格、一个制表符或者换行符) 2.1.4 关键字 Verilog HDL语言内部已经使用的词称为关键字或保留字,它是 Verilog HDL语言的内部专用词,是事先定义好的确认符,用来组织语言结构的。需要注意的是,在Verilog HDL中,保留字都是小写的。

verilog使用基础总结

verilog使用基础总结 FPGA的基本语法: 1:定义一个数据的,定义其位宽和和进制,省略位宽默认32位,省略进制默认十进制,数据之间可以添加下划线 2:X表示不确定的值,Z为高阻态 3:parameter参数类型,可以定义为不变的数据,也可以参数的传递 4:定义字符串时通用C语言的部分字符串,如\n,\t等5:变量数据类型主要分为网络类型和寄存器类型。网络

类型不能存储数据,寄存器类型可以存储数据。(网络类型:wire和tri主要用作连接单元的连线;Supply0对地建模,supply1对电源建模。Wor和trior实现线或功能;wand和triand实现线与功能;trireg可以存储数值和电容节点的建模;tri0和tri1用于线逻辑的建模)(寄存器类型:reg型为可定义的无符号整数变量;memory是reg型的一个数组;interger型是32位有符号整数变量) 6:wire型信号可以用于任何方程式的输入,也可作为assign语句或者实例元件的输出。 Reg型数据常用作表示always模块内的自定信号,常代 表触发器。 7:逻辑运算符分为数值的与或非也分为按位运算符。 缩减运算符依次高位和地位实现逻辑运算。

关系运算符两个数据进行关系运算,输出真假和不确定 X 等式运算符分为逻辑等和严格等。逻辑等输出01X,将X,Z视为不确定的数;关系等分为01,将X,Z视为两种符号。 位拼接运算符将两个数据的某几位拼接在一起 三目运算符相当于if和else, 8:赋值语句分为阻塞赋值和非阻塞赋值 阻塞赋值也就是说它阻塞了其他赋值语句的执行,只能 进行一步一步的执行,a=b 非阻塞赋值允许其他verilog语句同时进行操作,a

Verilog-A 30分钟快速入门教程

Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

Verilog基础

Verilog基础 一基本要素 (1)Verilog HDL与VHDL 1.它于1995年成为IEEE标准,即standard 1364-1995。VHDL于1987年成为IEEE标准。 2.类C语言,不允许自定义数据类型(VHDL可以)。 3.可描述开关级电路模型,但信号初值不确定,必须由程序初始化;VHDL系统数据定义后没有赋值则默认为0,对系统级支持能力要强一些。 (2)IC设计流程: 系统结构设计与仿真——>HDL设计——>TestBench功能模拟测试、逻辑仿真——>综合成逻辑门(工艺库、约束文件)——>初步时序分析(静态、电压、温度)——>自动布线布局——>后端报告(布局布线后增加的电阻、电容)——>动态(布局后)时序仿真,任何的建立例外都必须通过优化产生该例外的路径,以减小延迟;任何保持例外都必须通过在产生例外的路径上增加缓存,来增加延迟——>逻辑验证——>投片生产。 (3)标识符与关键字命名 1.标识符首字不能为数字或$,可以为字母和下划线, 2.命名长度不能超过1024, 3.区分大小写(与VHDL不同); 4.系统任务和系统函数前必须在标识符前加上$。 5.转义标识符\ 开头,以空格、制表符(tab键)或换行符结尾,可显示打印ASCII字符。 (4)系统任务和系统函数 1.display(信息输出到标准输出设备,带行结束符)和write(输出信息不带行结束符)。用于显示输出的特殊字符: \\n 换行 \\t 制表符 \\\\ 字符\\\

\\" 字符" \\ddd 值为十六进制字符 %% 字符% 格式定义: %h或%H: 十六进制 %d或%D: 十进制 %o或%O: 八进制 %b或%B: 二进制 %c或%C: ASCII字符 %v或%V: 线网信号长度 %m或%M: 层次名 %s或%S: 字符串 %t或%T: 当前时间格式 缺省如$displayb: 显示二进制数, 2.monitor 监控和显示指定任务的参数值, 3.strobe 显示数据,保证数据只在所有赋值语句执行完毕时才被显示;(而$display()任务执行通常是确定的)。 4.文件输入输出 a.文件打开和关闭:系统函数$fopen()和$fclose(), b.输出值到文件:$fdisplay,$fwrite,$fstrobe,$fmonitor,这些任务的第一个参数都是文件指针,其余参数为带有从参数表的格式定义序列。 c.从文件中读出数据并载入存储器:$readmemb,$readmenh用于指定文件中读取并载入数据到指定的存储器。可在模拟时间的任何时刻执行,读取的文件只能包含如下内容: 空格、换行符、制表符(tab键)、换页;注释;二进制和十六进制;

相关主题
相关文档
最新文档