Verilog简易教程
Verilog是一款硬件描述语言,整体和C语言的算法逻辑相近,但是各种代码语言描述却不尽相同。
本教程是面向小白的简易教程,但是需要有一定的编程语言和算法基础,最好是C语言。
1.模块
Verilog的代码在模块(module)内编写,自上而下读取模块,每个程序编写时都需要先指定模块,确认模块端口,并确定端口是输入端口(input)还是输出端口(output)。
1 2 3 4 5
| module add1(in1,in2,out); input in1,in2; output out; endmodule
|
其中 module 和 endmodule 内是模块执行内容,add1 为模块名,括号内的为端口。
2.变量
Verilog中的变量一般有两种,一种是连接型(net)如线网(wire),一种是储存型(variable)如寄存器(reg)。
线网类型的变量没有储存作用,只是跟随其上游连接的内容改变而改变,起到一个传输信号的作用。
可以在定义时设置该变量的位数。
1 2
| wire out_1; wire [3:0] out_2;
|
寄存器类型的变量可以储存数据,它会保持数据原有的值,直到被改写。
可以在定义时设置该变量的位数。
1 2
| reg sum1; reg [3:0] sum2;
|
3.运算符
3.1 位运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ~ :按位取反 a=1001 ~a=0110
& :按位与 a=1001 b=0001 a&b=0001
| :按位或 a=1001 b=0001 a|b=1001
^ :按位异或 a=1001 b=0001 a^b=1000
^~ :按位同或(异或非) a=1001 b=0001 a^~b=0111
|
3.2 算术运算符(同C语言)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| a=7,b=5;
+:加法运算 a+b==12;
-:减法运算 a-b==2;
*:乘法运算 a*b==35;
/:除法运算 a/b==1;
%:取余运算 a&b==2;
|
4.赋值语句
4.1 assign赋值
assign用于给线网(wire)类型变量赋值。
1 2
| wire a,b; assign a=7,b=5;
|
1 2 3 4 5 6 7
| module add1(in1,in2,out); input in1,in2; output out; assign out = in1 + in2;
endmodule
|
4.2 always赋值
always用于给寄存器(reg)类型变量赋值。
1 2 3 4 5 6 7 8
| input a,b; output x;
reg [1:0] sum; always@(*) begin sum=a+b; end
|
5.条件语句
5.1 if-else条件语句
1 2 3 4 5 6 7 8 9 10
| if(表达式) 语句序列1;
if(表达式) 语句序列1; else 语句序列2;
if(表达式1) 语句序列1; else if(表达式2) 语句序列2; else if(表达式3) 语句序列3; ... else 语句序列n;
|
5.2 case条件语句
1 2 3 4 5 6 7
| case(敏感表达式) 值1:语句序列1; 值2:语句序列2; ... 值n:语句序列n; default:语句序列n+1; endcase
|
6.循环语句
6.1 for语句
1 2
| for(循环变量初始化;循环条件;修改循环变量) 执行语句序列;
|
6.2 forever语句
1 2 3
| forever begin 执行语句序列; end
|
6.3 repeat语句
1 2 3
| repeat(循环次数表达式) begin 执行语句序列 end
|
6.4 while语句
1 2 3
| while(循环条件) begin 语句序列 end
|