Verilog基础
Verilog 是一种专用于数字电路系统设计的 硬件描述语言 (HDL)。它在数字和混合信号系统的设计与验证过程中被广泛应用,涉及专用 集成电路 (ASIC) 和 现场可编程门阵列 (FPGA) 等领域。相较于另一种硬件描述语言 VHDL,Verilog 的语法较为宽松,代码编写更为简洁,使得初学者能够更快上手。
此外,Verilog 展现了出色的电路描述与建模能力,能够从多个层面对数字系统进行全面的描述和建模。因此,它在简化硬件设计流程、提升设计效率与可靠性,以及 语言的易读性、 设计的层次化和 结构化方面,都表现出了巨大的优势和潜力。
语法模板:
module name(A, B, C, clk, F1, F2);
//输入输出声明
input A, B, C, clk;
output F1, F2;
//类型声明
wire F1;
reg F2;
//赋值
always @(possedge clk) //敏感信号赋值
F2 <= A
//逻辑赋值
assign F1 = (A & B) | (~A & ~C)
begin
//过程赋值
end
endmodule
Verilog模块定义的结构:
module 模块名(端口1, 端口2, ……, 端口n);
“内容”
endmodule
端口声明完成后,需要定义输入端口和输出端口。
input 端口1, 端口2 ……;
output 端口1, 端口2 ……;
类似于C语言的定义变量,其中也可以使用类似数组的表示方法描述多位输入输出端口:
input [7:0/0:7]x; //(注意数字顺序,该表示为x[7] --> x[0])
表示x是8位的输入端口;其中类型声明wire和reg也可以用数组描述表示多位。
输入端口声明结束后,紧接着声明输出端口的类型(类似于C语言的int,float数据类型)Verilog的输出也有两种类型:wire
和reg
。
- wire:表示连线输出端口,即输入发生变化,输出立刻改变(一般由assign进行赋值,表决器等案例)
- reg:表示寄存器输出端口,需要有触发信号(如时钟信号,一般随@always一起使用),只有触发,输出才会改变
运算量与运算符:
常量与变量
A <= <位宽> [b/d/o/h] <值>
其中,b是二进制,d是十进制,o是八进制,h是十六进制
一些常量会用parameter在模块头进行赋值
module test(A, B, F);
input A, B;
parameter flag = 1'b1;
wire F;
assign F = flag & A + ~flag & B;
endmodule
运算符
运算符 | 作用 |
---|---|
算术运算符 | 加(+),减(-),乘(*),除(\),取模(%) |
位运算符 | 与(&),或(|),非(),异或(^),同或(^) |
逻辑运算符 | 与(&&),或(||),非(!) |
关系运算符 | <, <=, >, >=, ==, != |
移位运算符 | 左移(<<), 右移(>>), 采用0进行填充 |
条件运算符 | ? : (了解) |
位拼接运算符 | {} --> eg:{x, y[2:1]}, 表示x,y[2],y[1]的拼接 |
行为语句:
过程语句
always @(触发条件) // possedge or negedge
//eg
always @(A)
begin
end
always @(posedge A)
always @(negedge A)
块语句
begin
//语句块, 串行方式顺序执行
end
赋值语句
//阻塞赋值 与 非阻塞赋值
//阻塞赋值 (=)
always @(posedge clk)
begin
b = 1'b1;
a = b;
end
//如果触发前b为0,则先执行b=1,再执行a=b,这时a的值为1
//非阻塞赋值 (<=)
always @(posedge clk)
begin
b <= 1'b1;
a <= b;
end
//如果触发前b为0,同时执行a和b的赋值语句,此时a为0,b为1
//持续赋值assign
assign F = A&B + (~A&~B);
条件语句
//1, if - else
if 表达式1 ~A&&A
begin
end
else if 表达式2
begin
end
else
begin
end
//2, case, casex, casez
case 表达式
值1:
begin
end
值2:
begin
end
值n:
begin
end
default:
begin
end
endcase
注:条件语句均在always块内使用
例,下表逻辑的Verilog实现:
A | B | C | F1 | F2 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
module test(A, B, C, F1, F2);
input A, B, C;
output F1, F2;
reg F1, F2;
always @(A or B or C)
case({A, B, C})
0, 5, 6:{F1, F2} <= 2'b00;
1, 2, 7:{F1, F2} <= 2'b11;
3:{F1, F2} <= 2'b10;
default:{F1, F2} <= 2'b01;
endcase
endmodule