9299.net
大学生考试网 让学习变简单
当前位置:首页 >> 工学 >>

Verilog基本语法_图文

Verilog基本语法_图文

Verilog HDL语法基础

1
2015/10/19

Verilog HDL简述

Verilog HDL是一种用于数字逻辑电路设计的硬 件描述语言(Hradware Description Language ), 可以用来进行数字电路的仿真验证、时序分析、逻 辑综合。
? 用Verilog HDL描述的电路设计就是该电路的Verilog HDL模 型。

? Verilog HDL 既是一种行为描述语言也是一种结构描述语言。

2
2015/10/19

Verilog HDL的发展历史
? 1983年,由GDA(GateWay Design Automation)公司 的Phil Moorby首创;
? 1989年,Cadence公司收购了GDA公司;

? 1990年, Cadence公司公开发表Verilog HDL;
? 1995年,IEEE制定并公开发表Verilog HDL1364-1995标 准; ? 1999年,模拟和数字电路都适用的Verilog标准公开发表

3
2015/10/19

Verilog HDL的特点
? 语法结构上的主要特点: ? 形式化地表示电路的行为和结构; ? 借用C语言的结构和语句;

? 可在多个层次上对所设计的系统加以描述,语言对设计规模不 加任何限制;
? 具有混合建模能力:一个设计中的各子模块可用不同级别的抽 象模型来描述; ? 基本逻辑门、开关级结构模型均内置于语言中,可直接调用; ? 易创建用户定义原语(UDP,User Designed Primitive) 。 ? 易学易用,功能强

4
2015/10/19

?

并行性:所谓的并行性就是说可以同时做几件事情。Verilog语言 不会顾及代码顺序问题,几个代码块可以同时执行;而软件语言 必须按顺序执行,上一句执行不成功,就不能执行下一句。

?

时序性:Verilog语言可以用来描述过去的时间和相应发生的事件;

而软件语言则做不到。
?

互连:互连是硬件系统中的一个基本概念,Verilog语言中的wire 变量可以很好地表达这样的功能;而软件语言并没有这样的描述。

5
2015/10/19

Verilog HDL基本结构
6
2015/10/19

Verilog HDL基本结构
功能描述
输入 输出

名称 7
2015/10/19

Verilog HDL基本结构
功能描述
功能描述

输入
输入

输入 功能描述

输出
名称

名称

名称 8
2015/10/19

简单的Verilog HDL例子
模块名(文件名)

module block ( cout,sum,a,b,cin ); input a,b; I/O说明 output c,d; assign c=a | b; 功能描述 assign d=a&b; endmodule

端口定义

功能描述 a,b

c=a | b d=a&b block

c,d

a b

c d

9
2015/10/19

总结
上例可以看出: ? 模块程序和电路图符号是一致的; ? 程序模块位于module和endmodule之间;

? 程序模块第二、三行说明了接口信号流向;
? 程序模块第四、五行说明了模块的逻辑功能。 ? verilog结构位于module与endmodule之间; ? 每个verilog程序包括:端口定义、I/O说明、内部信 号、功能定义。

10
2015/10/19

1.模块的端口定义
模块端口声明了模块的端口,其格式如下: module 模块名(端口1,端口2,端口3,... ...); 也可以写成

module 模块名(模块1,
端口2, 端口3, ); 注意:端口之间用逗号分开,结尾处有分号。

.....

11
2015/10/19

2.模块内容
模块内容包括:I/O说明、内部信号声明、功能定义。
? I/O说明格式 输入:input [ 位宽-1:0] 端口1,端口2,...; 或 输入:input [位宽-1:0]端口1; input [位宽-1:0]端口2;
推荐这种写法,分开写 可读性比较强

输出:output [位宽-1:0]端口1,端口2,...; 输入输出: inout [位宽-1:0]端口1,端口2,...;

12
2015/10/19

? 内部变量说明
在模块中与端口有关的变量,有reg和wire类型。期声明 格式如下: reg [位宽-1:0] 变量1,变量2,...; wire[位宽-1:0]变量1,变量2,...;

或 reg [位宽-1:0] 变量1;
reg [位宽-1:0]变量2; wire[位宽-1:0]变量1; 推荐这种写法

wire[位宽-1:0]变量2;

13
2015/10/19

? 功能定义
功能定义部分是模块中最重要的部分,有三种方法可以产生逻辑 功能,我们只讲常用的两种。

①用assign声明语句 如:assign a = b&c; 这种方法很简单,只需要写一个assign,后面再加一个方程式即可,例子描述了 一个与门。

②用always块
如:always@(posedge clk) a <= b&c; 例子描述了一个与门,但是只有在clk上升沿(posedge)时候b与c才会进行与。

14
2015/10/19

assign与always的区别:

clk a b

assign

c
c

always

15
2015/10/19

区别:
assign语句可以描述组合逻辑; always既可以描述组合逻辑也可以描述时序逻辑。 简单来说:组合逻辑就是与时间没关系,时序逻辑与时间有关系。 always@(a or b) c = a&b; 这样描述就和assign一样了。

16
2015/10/19

例题: module block(a,b,c,d,e);
input __, __, __;
a d b e c

____ d, __; assign d=a|(b&c); assign e=a&b&c;

_________

17
2015/10/19

Verilog HDL数据类型
18
2015/10/19

Verilog HDL中,数据主要有以下四种进制形式:

1)二进制整数(b或B)
2)十进制整数(d或D) 3)十六进制整数(h或H) 4)八进制整数(o或O)

19
2015/10/19

数字表达方式有以下三种: 1)<位宽><进制><数字>这是一种全面的描述方式 如 8'b10011110 8'ha5
//位宽为8的二进制数,8为位宽,'b表示进制。 //位宽为8的十六进制数,8为位宽,'h表示进制。

位宽相对于二进制数而言
2)<进制><数字> 位宽由机器系统决定 如 'b10011110 3)<数字>这种表示的数字,默认为十进制

如 10011110 //为十进制数,不是二进制数

20
2015/10/19

?常量的定义
在Verilog HDL中用parameter来定义常量,即参数型 (parameter型)数据是一种常数型的数据,其格式如下: parameter 参数名1=常数1,参数名2=常数2, …;

或 parameter
parameter ...............

参数名1=常数1;
参数名2=常数2;

parameter是参数型数据的确认符,等式的右边必须是一个 常数或定义过的参数。 parameter msb=7; //定义参数msb为常量7 parameter e=25, f=29; //定义二个常数参数

21
2015/10/19

?变量
变量即在程序运行过程中其值可以改变的量,在Verilog HDL中变量的数据类型有很多种,这里只对常用的几种进行 介绍。 ①线型( wire型) wire型数据常用来表示用于以assign关键字指定的组合逻 辑信号。Verilog程序模块中输入/输出信号类型缺省时自 动定义为wire型。

22
2015/10/19

格式: wire [n-1:0] 数据名1,数据名2,…; 或 wire [n-1:0] 数据名1; wire [n-1:0] 数据名2; ...............
注:wire是wire型数据的确认符,[n-1:0]代表该数据的位宽,即该数 据有几位。最后跟着的是数据的名字。如果一次定义多个数据,数据 名之间用逗号隔开。声明语句的最后要用分号表示语句结束。 例: wire a; //定义了一个一位的wire型数据 //定义了一个八位的wire型数据 //定义了二个四位的wire型数据

wire [7:0] b; wire [4:1] c, d;

23
2015/10/19

② 寄存器型(reg型)
寄存器是数据储存单元的抽象,reg是寄存器数据类型的关键字。 reg型数据常用来表示用于?always?模块内的指定信号,在?always? 块内被赋值的每一个信号都必须定义成reg型。

reg型数据的格式如下: reg [n-1:0] 数据名1,数据名2,… ; 或 reg [n-1:0] 数据名1; reg [n-1:0] 数据名2; ...............
注:reg是reg型数据的确认标识符,[n-1:0]代表该数据的位宽,即该数 据有几位,最后跟着的是数据的名字。如果一次定义多个数据,数据名之 间用逗号隔开。声明语句的最后要用分号表示语句结束。

24

2015/10/19

例:

reg a;

//定义了一个一位的名为a的reg型数据 //定义了一个四位的名为b的reg型数据

reg [3:0] b;

reg [4:0] c, d; //定义了两个五位的名为c和d的reg型数据
习题:1、定义参数型a为12,b 为二进制10110,c为十六进制a2? parameter a=12,b=5'b10110,c=8'ha2; 2、定义wire型变量d(位宽1),e(位宽16)? wire d; wire [15:0] e;

3、定义reg型变量f(位宽1),g(位宽14)?
reg f; reg [13:0] g;

25
2015/10/19

Verilog HDL的运算符
26
2015/10/19

?运算符及表达式
运算符按其功能可分为 以下几类:
? ?

按其所带操作数的个数运算 符可分为三种:
? 单目运算符:可以带一个操作数, 操作数放在运算符的右边。 ? 二目运算符:可以带二个操作数, 操作数放在运算符的两边。 ? 三目运算符:可以带三个操作, 这三个操作数用三目运算符分 隔开。

?
? ? ? ? ?

算术运算符(+,-,×,/,%) 赋值运算符(=,<=) 关系运算符(>,<,>=,<=) 逻辑运算符(&&,||,!) 条件运算符(?:) 位运算符(~,|,^,&,^~) 移位运算符(<<,>>) 拼接运算符({ })

27
2015/10/19

? 算术运算符
在Verilog HDL语言中,共有下面几种:
① ② ③ ④ ⑤

+ (加法运算符,或正值运算符,如 rega+regb,+3) - (减法运算符,或负值运算符,如 rega-3,-3) × (乘法运算符,如rega*3) / (除法运算符,如5/3)

% (模运算符,或称为求余运算符,要求%两侧均为整型 数据。如7%3的值为1)
12%3=0 25%7=4

问:求 10%3 = 1

28
2015/10/19

? 位运算符
Verilog HDL提供了以下五种位运算符,在此,主要介绍前三种: 1) ~ 2) & //取反 //按位与

3) |
4) ^ 5) ^~

//按位或
//按位异或 //按位同或(异或非)

说明:位运算符中除了~是单目运算符以外,其他均为二目运算符,即要求运算符两侧各 有一个操作数。

29
2015/10/19

①"取反"运算符~ ~是一个单目运算符,用来对一个操作数进行按位取反运算。 举例: rega=4'b1010;//rega的初值为4'b1010

rega=~rega;//rega的值进行取反运算后变为4'b0101
问: 8'b11010011位取反结果:8'b101100 ~8'ha2 = 8'b1011101=8'h5d

8‘ha2位取反结果: 8'ha2 = 8'b10100010

30
2015/10/19

②?按位与?运算符 &

&按位与运算就是将两个操作数的相应位进行与运算。
举例: a=4'b1100;//a初值为4'b1100 b=4'b1011;//b初值为4'b1011 c=a&b; //c结果为a与b按位与,运算后4'b1000 问: 4'b1001&4'ha=4'b1000

31
2015/10/19

③?按位或?运算符|

|按位或运算就是将两个操作数的相应位进行或运算。
举例: a=4'b1100;//a初值为4'b1100 b=4'b1011;//b初值为4'b1011 c=a | b; 问: //c结果为a与b按位或,运算后4'b1111

4'b1001&4'ha=4'b1011

32
2015/10/19

? 逻辑运算符
在Verilog HDL语言中存在三种逻辑运算符:
1) && 逻辑与 2) || 逻辑或 3) ! 逻辑非 说明:?&&?和?||?是二目运算符,它要求有两个操作数, 如(a>b)&&(b>c),(a<b)||(b<c)。"!"是单目运算符,只要 求一个操作数,如!(a>b)。

33
2015/10/19

逻辑运算真值表:
a 真 b 真 !a 假 !b 假 a&&b 真 a||b 真


假 假


真 假


真 真


假 真


假 假


真 假

注: 逻辑运算符中“&&”和“||”的优先级别低于 关系运算符“!” 高于算术运算符。如下例:

34
2015/10/19

(a>b)&&(x>y) (!a)||(a>b)

可写成: a>b && x>y 可写成: !a || a>b

(a==b)||(x==y) 可写成:a==b || x==y

重要提醒:为了提高程序的可读性,明确表达各运算符间的 优先关系,建议使用括号。

35
2015/10/19

? 关系运算符 关系运算符共有以下四种: a<b a小于b a>b a大于b a <= b a小于或等于b a >= b a大于或等于b 注: 在进行关系运算时,如果声明的关系是假的(false), 则返回值是0,如果声明的关系是真的(true),则返回 值是1, 如下例: a = 7>9; //因为7不大于9,所以7>9是假的,所以 // 返回值是0,即a结果为0 注: 所有的关系运算符有着相同的优先级别。关系运算符 的优先级别低于算术运算符的优先级别。

36

2015/10/19

? 等式运算符 在Verilog HDL有四种等式运算符,在此介绍前两种:

1)== (等于)
2)!= (不等于) 3)=== (等于)

4)!== (不等于)
注意:求反号与等号、等号与等号之间不能有空格 这四个运算符都是二目运算符,要求有两个操作数。"=="和 "!="又称为逻辑等式运算符。其结果由两个操作数的值决 定。 例:a=(7==8); //7不等于8,所以7==8是假的,返回值 37 2015/10/19 //为0,即a结果为0;

? 移位运算符 在Verilog HDL中有两种移位运算符:

<< (左移位运算符)
>> (右移位运算符) 其使用方法如: a >> n 或 a << n

a代表要进行移位的操作数,n代表要移几位。这两种移位 运算都用0来填补移出的空位。 例: 4’b1001<<1 = 5’b10010; 4’b1001<<2 = 6’b100100;
4’b1001>>1 = 4’b0100; 4’b1001>>4 = 4’b0000;
2015/10/19

38

? 位拼接运算符 在Verilog HDL用{}表示位拼接运算符。用这个运算符可以 把两个或多个信号的某些位拼接起来进行运算操作。 格式如下: {信号1的某几位,信号2的某几位,..,..,信号n的某几位} 总结:某些信号的某些位详细地列出来,中间用逗号分开, 最后用大括号括起来表示一个整体信号。 例:a=1,b=4'b1001,c=8'b11100110,d为6位数, 求 d={a,b[1:0],c[5:3]}=6'b101100 39
2015/10/19

Verilog HDL的语句
40
2015/10/19

?赋值语句
在Verilog HDL语言中,信号有两种赋值方式:
非阻塞(Non_Blocking)赋值方式( 如 b <= a; ) 阻塞(Blocking)赋值方式( 如 b = a; ) 通过下面例子区分两者:
always @( posedge clk ) begin b<=a; c<=b; end always @(posedge clk) begin b = a; c = b; end

假设a初值为1,b初值为2.两种赋值语句得到的b、c分别是多少?

41
2015/10/19

非阻塞赋值方式 <= 块内赋值语句同时执行 建议在时序逻辑中使用

阻塞赋值方式 = 块内语句逐条进行赋值 建议在组合逻辑中使用

注意:非阻塞赋值符 “ <= ” 与小于等于符 “<= ” 看起来是一样的,但意义完全不同,小于等于符是关 系运算符,用于比较大小。而非阻塞赋值符用于时序 赋值操作。

42
2015/10/19

? 块语句 块语句通常用来将两条或多条语句组合在一起,使其在格 式上看更象一条语句。功能像是c语言中的括号。 ? 顺序块(begin_end) 特点: 1) 块内的语句是按顺序执行的,即只有上面一条 语句执行完后下面的语句才能执行。 2) 每条语句的延迟时间是相对于前一条语句的仿 真时间而言的。 3) 直到最后一条语句执行完,程序流程控制才跳 出该语句块。

43
2015/10/19

顺序块的格式如下: begin 语句1; 语句2; ...... 语句n; end 例: begin areg = breg; creg = areg; //creg的值为breg的值。 end

44
2015/10/19

? 条件语句(if_else)
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定 执行给出的两种操作之一。Verilog HDL语言提供了三种形式的if语句: (1) if (表达式) 语句 例如: if ( a > b ) out1 = int1; (2) if (表达式) 语句1; else 语句2; 例如: if( a > b) out1 = int1; else out1 = int2;

45

2015/10/19

(3) if(表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; ........ else if (表达式m) 语句m; else 语句n;

注意:条件语句必须在过程块语句中使用,所谓过程块语句 是指由initial 和 always 语句引导的执行语句集合。除 这两种块语句引导的begin end块中可以编写条件语句 外,模块中的其他地方都不能编写。

46

2015/10/19

习题: 用if_else语句编写,a>b的情况下,c等于1,a=b的情 况下, c=2,a<b的情况下,c=3。 always@(posedge clk) //给出过程块语句 if(a>b)

c=1;
else if(a==b)

c=2;
else c=3;

47
2015/10/19

? initial语句(一般初始化时候使用) initial语句的格式如下: initial begin
initial begin

语句1;
语句2; . ..... 语句n; end

a= 'b000000;
b= 'b011001; c= 'b011011; d= 'b011000; end

48
2015/10/19

? always语句 always语句在仿真过程中是不断活动着的。但always语 句后跟着的过程块是否执行。 声明格式如下: always <时序控制> <语句>
注:always语句由于其不断活动的特性,只有和一定的时序控制结合在 一起才有用。如果一个always语句没有时序控制,则这个always语 句将会使仿真器产生死锁。见下例: 例:always areg = ~areg; 这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发 生仿真死锁。

49

2015/10/19

但如果加上时序控制,则上例中的always语句将变为一条 非常有用的描述语句。见下例: 例:always #5 areg = ~areg;//每延迟5个时钟单位,areg取
反 该例子生成了一个周期为10时钟单位 的无限延续的信号波形,常用这 种方法来描述时钟信号。

注:always 的时间控制可以是沿触发也可以是电平触发的, 可以单个信号也可以多个信号,中间需要用关键字 or(或 逗号) 连接,如:
always @(posedge clk) begin …… end always @( a or b or c ) begin …… end

50
2015/10/19

练习:

①编写程序:时钟信号是clk,输入是a,输出是 b,每当clk上升沿来到时,把a复制给b。
②编写程序:时钟信号是clk,输出是b,每当 clk上升沿到来时,b自加1,当b等于15时,把b 归零。

51
2015/10/19

Thanks
52
2015/10/19


网站首页 | 网站地图 | 学霸百科 | 新词新语
All rights reserved Powered by 大学生考试网 9299.net
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com