初识Verilog HDL
Verilog HDL
Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
与VHDL比较,Verilog HDL语言的语法更加自由、易学易用,适合算法级、门级设计,代码简洁,发展较快。而VHDL语言的语法更加严谨、较难上手,适合系统级设计,代码冗长,发展缓慢。
Verilog语法
-
逻辑值有四种:
- 0:逻辑低电平
- 1:逻辑高电平
- z:高阻态、无驱动
- x:未知逻辑电平
-
算数运算符
- +:加法
- -:减法
- *:乘法
- /:除法
- %:求模
-
常用关键字(保留字):
- module、endmodule、input、output、wire、reg、parameter、localparam。PS:parameter对象可以在顶层文件中进行修改,localparam则只能在模块内修改和使用。
-
常量表示
- 格式:[换算为二进制后位宽总长度]+[']+[数值进制符号]+[与数值进制符号对应的数值],例如8‘ha6表示8bit十六进制数a6。
-
阻塞赋值和非阻塞赋值
- 阻塞赋值:每条语句执行完毕之后才能执行下一条语句。
- 非阻塞赋值:每条语句并行执行。
- 例如:
a=b;c=a;
表示先执行a=b操作,再执行c=a操作。a<=b;c<=a;
则表示两个赋值操作同时进行。
-
always语句
always()
表示在满足括号中的条件时,执行其中的内容语句。
-
assign语句
- 通过assign语句,可以针对wire类型变量进行逻辑操作,用来将一个信号与一个表达式相连接。
-
归约运算符与按位运算符(以&运算为例)
- 归约与:一元运算符,
&m
表示m中所有的比特相与。例如&4'b1101=1&1&0&1=1'b0
。 - 按位与:二元运算符,
m&n
表示m中每个比特与n中每个比特相与。例如4'b1010 & 4'b0101=4'b0000
。
- 归约与:一元运算符,
-
逻辑运算符
- 二元运算符,运算符两边只有真或假,非零为真,为零为假。
-
关系运算符
- 一般用于进行条件判断,包括>,<,>=,<=,==符号。
-
移位运算符
- 包括>>和<<符号,将运算符左边的操作数左移或右移指定的位数。
-
位拼接运算符
- 由一对花括号和逗号组合而成,例如
d={a,b,c}
。
- 由一对花括号和逗号组合而成,例如
-
条件运算符
- 形式为
A?B:C
,意为如果A为真,则B作为表达式的值,如果A为假,则C作为表达式的值。
- 形式为
-
优先级为:归约运算符>算术运算符>移位运算符>关系运算符>"==“和“!=”>按位运算符>逻辑运算符>条件运算符
-
系统函数:Verilog语言预先定义的函数,大多数只能在方针中使用。
timescale 1ns/1ns
表示时间尺度预编译指令,时间单位/时间精度- “#”+数字表示延时相应的时间。
- 时间单位不能比时间精度小。
- $display:用于输出打印信息。
$display("%b+%b=%d",a,b,c");
,类似C语言中的printf函数。
- $write:用于输出和打印信息。
$write("%b+%b=%d\n",a,b,c");
,与display的格式相同,但是display语句输出可以自动换行,而write语句输出结束后不会自动换行。
- $strobe:用于输出和打印信息。
- 格式与之前两个语句相同,但是无论语句出现在什么位置,输出都是在程序的结尾执行。
- $monitor:用于持续监测变量。
- 格式同上,作用是只要语句中的变量的值发生变化,就执行一次输出语句。
- $stop:暂停仿真。
- $finish:结束仿真。
- $time:时间函数,用于返回64位当前仿真时间。
- $random:用于产生随机函数,返回随机数。
- $readmemb:用于读取二进制文件函数,$readmemh:用于读十六进制文件函数。
- 使用格式为:
$readmemb("<数据文件名>",<存储器名>);
,例如$readmemb("aaa.txt",b);
。
- 使用格式为: