Verilog HDL的基础知识
一、语言要素
1、空白符
空白符包括空格符(\b
)、制表符(\t
)、换行符和换页符。空白符使代码看起来结构清晰,阅读起来更方便。在编译和综合时,空白符被忽略。VerilogHDL程序可以不分行,也可以加入空白符采用多行编写。
initial begin a=3'b100; b=3'b010; end
和如下代码是一致的
initial begin
a=3'b100;
b=3'b010;
end
2、注释符
Verilog HDL中运行插入注释,标明程序代码功能、修改、版本等信息,以增强程序的可读性和帮助管理文档。VerilogHDL中有两种形式的注释。
- 单行注释:单行注释以“
//
”开始,VerilogHDL忽略此处到行尾的内容。 - 多行注释:多行注释以“
/*
”开始,到“*/
”结束,VerilogHDL忽略其中的注释内容。
需要注意的是,多行注释不允许嵌套,但是单行注释可以嵌套在多行注释中。
assign a = b & c; // 单行注释
assign a[3:0] = b[3:0]&c[3:0]; /* 注释行1
注释行2
注释行3 */
3、关键字
VeriolgHDL内部已经使用的词成为关键字或保留字,是事先定义好的确认符,用来组织语言结构,需要注意的是,Verilog是区分大小写的,并且所有关键字都是小写的。
4、数值
VeriolgHDL有四种基本的逻辑数值状态,x和z都不区分大小写,四值电平逻辑表如下所示 :
二、数据类型
Verilog的数据类型可以划分为两大类:
- 物理数据类型:主要包括连线型(wire、tri等)和寄存器型(reg)
- 抽象数据类型:主要包括整形(integer)、时间型(time)、实型(real)和参数型(parameter)
三、运算符
1、算术运算符
VerilogHDL中常用的算数运算符主要有五种,都属于双目运算符,分别是加法(+
)、减法(-
)、乘法(*
)、除法(/
)和取模(%
)。
2、关系运算符
关系运算符也是双目运算符,是对两个操作数的大小进行比较,分别是大于(>
)、小于(<
)、大于等于(>=
)和小于等于(<=
)。
在进行关系比较时,如果结果成立则为1'b1
,不成立则返回1‘b0
,若不确定则返回结果为不定值x
。
例如:10 > 15
的结果为假0
,20 > 18
的结果为真1
,而4'h3 < 4'hx
的结果为不定值。
3、等于运算符
VerilogHDL中有四种相等关系运算符:等于(==
)、不等于(!=
)、全等(===
)、非全等(!==
)。
==
和!=
为算数等式运算符,其结果由两个操作数的值决定,等操作数中某些位为不定值x
和高阻态z
时,结果可能为不定值x
。
===
和!==
为按位比较运算符,两个操作数完全一致时,其结果才为1,否则为0,当对应位同为z
或同为x
时也认为是相同的。
4、逻辑运算符
逻辑运算符有三种,分别是逻辑与(&&
)、逻辑或(||
)、逻辑非(!
)。
当操作数由多为组成,主要有一位为1,则该操作数就是逻辑1。若操作数中存在不定态x,则逻辑运算的结果也是不定态。
5、按位运算符
VerilogHDL中有五种类型的按位运算符:按位取反(~
)、按位与(&
)、按位或(|
)、按位异或(^
)、按位同或(^~
)。
6、归约运算符
归约运算符属于单目运算符,它将操作数的每一位依次进行逻辑运算最后产生1为逻辑值,也被称为缩位运算符。
缩位操作符包括&
(与)、|
(或)、^
(异或)及相应的非操作:~&
、~|
、~^
、^~
。
7、移位运算符
移位运费符有两种:左移运算符(<<
)、右移运算符(>>
)。
运算过程是将左边或右边的操作数向左移或向右移,所移动的位数由右边的操作数来决定,然后用0来填补移出的空位。
8、条件运算符
条件运算符(?:
)是VerilogHDL里唯一的三目运算符,它根据条件表达式的值来选择应执行的表达式,其表示形式如下:
<条件表达式> ? <表达式1> : <表达式2>
其中条件表达式的运算结果有真(1
)、假(0
)和不定态(x
)三种。
当条件表达式结果为真时执行表达式1,结果为假是执行表达式2,结果为不定态时将按位对表达式1的值和表达式2的值进行比较,比较规则如下:
如下条件表达式
assign out = sel ? in1 : in2;
当sel信号为不定态,in1=4’b0011
,in3=4'b0101
时,输出结果out=4'b0xx1
。
9、连接和复制运算符
VerilogHDL中还有两个特殊的运算符:连接运算符({}
)和复制运算符({{}}
)。
连接运算符是把位与大括号的多个用逗号分隔的多个信号按位连接在一起。
复制运算符将一个表达式放入双重花括号中,复制因子放在第一层括号中。
a = 3'b101;
b = 4'b1110;
c = {a, b};
d = {2{a}};
则c的结果为7'b1011110
,d的结果为6'b101101
。
四、模块
模块(module
)是Verilog HDL语言的基本单元,它代表一个基本的功能块,用于描述某个设计的功能或结构以及与其它模块通信的外部端口。如下所示为一个模块的结构组成图:
如下为一个上升沿D触发其的设计代码,
module dff(din, clk, q);
input din, clk;
output q;
reg q;
always@(posedge clk)
q <= din;
endmodule
该简单D触发器的电路图如图所示
五、附录
上一篇:Verilog学习之路(2)— Vivado 2018.3下载安装和HelloWorld
下一篇:Verilog学习之路(4)— Verilog HDL的程序设计语句