1. 项目概述
这个FPGA学习笔记整理项目源于我在黑金云课堂前两期课程中的实践总结。作为一名有五年硬件开发经验的工程师,我发现很多初学者在接触FPGA时容易陷入"看懂了但不会用"的困境。通过系统整理课程中的核心知识点,配合实际工程案例的补充说明,希望能帮助更多人跨越FPGA学习的门槛。
FPGA(现场可编程门阵列)作为可重构计算的代表器件,在通信加速、图像处理、工业控制等领域有着不可替代的优势。但相比传统MCU开发,FPGA设计需要掌握硬件描述语言、时序约束、IP核集成等特有技能。本笔记将从最基础的Verilog语法开始,逐步深入到时钟域交叉、流水线优化等进阶主题,每个知识点都配有我在实际项目中踩过的坑和验证过的解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心知识点解析
2.1 Verilog关键语法精要
不同于软件编程的"顺序执行"思维,Verilog需要建立"并行电路"的认知模型。以下是最容易混淆的三个概念:
-
阻塞(=)与非阻塞(<=)赋值:
- 阻塞赋值会立即更新左值(类似软件赋值),在组合逻辑中使用可能导致意外锁存器
- 非阻塞赋值在时钟边沿同步更新,是时序逻辑的标准写法
verilog复制// 错误示例:组合逻辑中使用阻塞赋值 always @(*) begin a = b & c; // 当b/c变化时立即改变a d = a | e; // 此时a可能尚未稳定 end // 正确写法:时序逻辑统一用非阻塞 always @(posedge clk) begin reg_a <= b & c; reg_d <= reg_a | e; end -
状态机编码规范:
- 推荐使用三段式写法(现态/次态/输出分离)
- 状态编码建议用parameter定义,避免直接使用数字
verilog复制parameter IDLE = 2'b00, START = 2'b01, WORK = 2'b10; reg [1:0] current_state, next_state; // 第一段:状态寄存器 always @(posedge clk or negedge rst_n) if(!rst_n) current_state <= IDLE; else current_state <= next_state; // 第二段:状态转移逻辑 always @(*) begin case(current_state) IDLE: next_state = (start) ? START : IDLE; START: next_state = WORK; WORK: nex
