Verilog 是一种硬件描述语言(HDL),用于设计和仿真数字电路。本教程将带你从基础语法到实际应用,逐步掌握 Verilog 的核心概念和编程技巧。
1. Verilog 基础
1.1 模块(Module)
-
模块是 Verilog 的基本构建单元,类似于电路中的一个功能块。
-
语法:
module module_name (input a, input b, output c); // 内部逻辑 endmodule
示例:一个简单的与门
module and_gate (input a, input b, output c); assign c = a & b; // 与门逻辑 endmodule
1.2 数据类型
-
线网类型(Net Type):
-
wire
:用于连接逻辑门或模块之间的信号。 -
示例:
-
wire signal;
寄存器类型(Register Type):
-
reg
:用于存储状态或时序逻辑中的值。 -
示例:
-
reg data;
向量类型:
-
支持多位宽的数据。
-
示例:
-
wire [7:0] bus; // 8位宽的总线 reg [3:0] counter; // 4位宽的计数器
1.3 赋值语句
-
连续赋值(Continuous Assignment):
-
用于组合逻辑,使用
assign
关键字。 -
示例:
assign c = a & b; // c 是 a 和 b 的与操作结果
-
-
过程赋值(Procedural Assignment):
-
用于时序逻辑,在
always
块中使用。 -
示例:
-
always @(posedge clk) begin q <= d; // 在时钟上升沿将 d 赋值给 q end
-
2. Verilog 进阶
2.1 运算符
-
算术运算符:
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取模)。 -
逻辑运算符:
&&
(逻辑与)、||
(逻辑或)、!
(逻辑非)。 -
位运算符:
&
(位与)、|
(位或)、^
(位异或)、~
(位取反)。 -
关系运算符:
==
(等于)、!=
(不等于)、>
(大于)、<
(小于)。 -
移位运算符:
<<
(左移)、>>
(右移)。
for
循环:
for (i = 0; i < 8; i = i + 1) begin
// 循环体
end
while
循环:
while (condition) begin
// 循环体
end
3.1 组合逻辑设计
-
示例:4位加法器
-
module adder_4bit (input [3:0] a, input [3:0] b, output [4:0] sum); assign sum = a + b; endmodule
3.2 时序逻辑设计
-
示例:D 触发器
module d_flip_flop (input clk, input d, output reg q);
always @(posedge clk) begin
q <= d; // 在时钟上升沿将 d 赋值给 q
end
endmodule