1. Verilog硬件描述语言概述
Verilog HDL(硬件描述语言)是FPGA/ASIC设计中最常用的设计语言之一。与软件编程语言不同,Verilog描述的是硬件电路的行为和结构。理解这一点对于初学者至关重要,因为同样的语法在硬件实现上可能产生完全不同的电路。
1.1 Verilog与VHDL对比
目前主流的硬件描述语言有两种:
- Verilog:语法类似C语言,学习曲线相对平缓,在国内工业界应用广泛
- VHDL:语法更为严谨,在欧洲和军工航天领域使用较多
对于FPGA初学者,我建议从Verilog入手,原因有三:
- 语法简洁,上手快
- 国内企业普遍使用
- 学习资源丰富
1.2 Verilog版本演进
Verilog标准经历了多次更新:
| 版本 | 年份 | 重要特性 |
|---|---|---|
| Verilog-1995 | 1995 | 首个标准化版本 |
| Verilog-2001 | 2001 | 引入ANSI风格端口声明、always @(*) |
| SystemVerilog | 2005+ | 增加面向对象、断言等高级特性 |
本教程基于Verilog-2001标准,这是目前工程实践中最常用的版本。SystemVerilog虽然功能更强大,但对初学者来说复杂度较高。
硬件思维提示:Verilog描述的是电路连接和行为,不是程序执行流程。同样的代码可能综合出完全不同的硬件结构,这是与软件编程最大的区别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Verilog模块基本结构
2.1 模块定义
Verilog的基本设计单元是模块(module),其基本结构如下:
verilog复制module 模块名 #(参数列表) (
端口列表
);
// 内部信号声明
wire [7:0] data;
reg [7:0] counter;
// 子模块例化
sub_module inst1 (.port1(signal1), .port2(signal2));
// 功能描述
assign data = input_a & input_b;
always @(posedge clk) begin
counter <= counter + 1;
end
endmodule
2.2 简单模块示例
下面是一个两输入与门的实现:
verilog复制module and_gate (
input wire a,
input wire b,
output wire y
);
assign y = a & b;
endmodule
这个简单的模块展示了Verilog的几个核心概念:
- 模块定义以
module开始,endmodule结束 - 端口声明包含方向和数据类型
assign语句描述组合逻辑
2.3 模块内部结构规范
建议按以下顺序组织模块内部代码:
- 参数声明(parameter)
- 端口声明
- 内部信号声明
- 局部参数(localparam)
- 子模块例化
- 连续赋值(assign)
- 过程块(always/initial)
这种结构清晰易读,便于维护。
