跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

FPGA 入门指南:Verilog 基础与 LED 流水灯实战

介绍 FPGA 基本概念及与单片机的区别,指导 Vivado 开发环境搭建与工程创建。涵盖 Verilog 核心语法速成,提供 LED 流水灯的代码实现、Modelsim 仿真测试及上板验证流程。最后总结数字电路基础学习路线、进阶方向及新手常见错误点,如阻塞与非阻塞赋值、时钟域处理等,帮助初学者快速入门硬件编程。

栈溢出发布于 2026/4/6更新于 2026/9/271 浏览
FPGA 入门指南:Verilog 基础与 LED 流水灯实战

什么是 FPGA

初学者常困惑 FPGA 与单片机的区别。简单来说,FPGA(Field Programmable Gate Array,现场可编程门阵列)允许从底层构建电路,而单片机是固定架构的芯片。例如,单片机像组装好的乐高套装,FPGA 则像零散积木块,可通过硬件描述语言(如 Verilog)定义任意数字电路。

Vivado 环境搭建

安装包获取

访问 Xilinx 官网下载 Vivado Design Suite(社区版免费)。建议选择 2020.1 之后的版本,安装时勾选 Vivado HL Design Edition 及对应器件支持(如 Artix-7 系列)。

硬件准备

建议先用在线仿真器练习,基础扎实后再入手开发板,如 Nexys A7、Basys3 或 DE10-Nano。

第一个工程创建

打开 Vivado,点击 Create Project,选择 RTL Project 并添加新 Verilog 文件。器件型号通常选 xc7a35tcsg324-1(对应多数入门开发板)。

Verilog 核心语法

// 基础结构模板
module my_module(
    input wire clk,      // 时钟信号
    input wire rst_n,    // 复位信号(低有效)
    output reg led       // LED 输出
);
    // 组合逻辑用 assign
    assign a = b & c;
    // 时序逻辑用 always 块
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            led <= 1'b0; // 复位时 LED 灭
        end else begin
            led <= ~led; // 翻转 LED 状态
        end
    end
endmodule

必须掌握的 10 个核心语法:

  1. module/endmodule:电路模块定义
  2. input/output:输入输出端口
  3. wire/reg:线网与寄存器
  4. assign:组合逻辑赋值
  5. always:过程块(时序逻辑)
  6. posedge/negedge:时钟边沿检测
  7. if/else:条件判断
  8. case:多路选择
  9. parameter:参数定义
  10. #:延时控制(仅仿真用)

LED 流水灯实战

代码实现
module led_run(
    input clk_100MHz,   // 开发板上的 100MHz 时钟
    input rst_n,        // 复位按键(低电平有效)
    output reg [3:0] leds // 4 位 LED 输出
);
    // 分频器:100MHz -> 1Hz
    reg [26:0] counter;
    always @(posedge clk_100MHz or negedge rst_n) begin
        if(!rst_n) begin
            counter <= 0;
        end else begin
            counter <= (counter == 27'd99_999_999) ? 0 : counter + 1;
        end
    end
    // LED 流水效果
    always @(posedge clk_100MHz or negedge rst_n) begin
        if(!rst_n) begin
            leds <= 4'b0001; // 初始状态
        end else if(counter == 27'd99_999_999) begin
            leds <= {leds[2:0], leds[3]}; // 循环左移
        end
    end
endmodule
Modelsim 仿真

创建 testbench 文件进行验证:

`timescale 1ns / 1ps
module tb_led_run();
    reg clk, rst_n;
    wire [3:0] leds;
    led_run uut(.clk_100MHz(clk), .rst_n(rst_n), .leds(leds));
    initial begin
        clk = 0;
        forever #5 clk = ~clk; // 100MHz 周期=10ns
    end
    initial begin
        rst_n = 0;
        #100;
        rst_n = 1;
        #200000000; // 等待 2 秒(仿真时间)
        $stop;
    end
endmodule
上板验证
  1. 生成 bit 流文件:点击 Generate Bitstream。
  2. 连接开发板:通过 USB-JTAG 接口。
  3. 烧录程序:Open Hardware Manager → Auto Connect → Program Device。
  4. 观察 LED 状态是否循环流动。

学习路线

阶段一:数字电路基础

掌握二进制/十六进制转换,理解组合逻辑与时序逻辑。

阶段二:Verilog 进阶

学习状态机设计、FIFO/存储器接口及跨时钟域处理(CDC)。

阶段三:实战项目

尝试电子时钟、VGA 图像显示或简单 CPU 设计。

参考资源

  • 《Verilog 数字系统设计教程》夏宇闻
  • Xilinx 官方文档 UG901
  • FPGA4FUN 项目网站

常见问题

  1. 阻塞与非阻塞赋值:=(阻塞)用于组合逻辑,<=(非阻塞)用于时序逻辑,混用会导致故障。
  2. 未初始化寄存器:FPGA 上电时寄存器值随机,务必通过复位信号初始化。
  3. 时钟域混乱:不同频率时钟需隔离处理,避免亚稳态。
  4. 仿真与实机差异:仿真通过不代表能上板,需注意时序约束(.xdc 文件)。

遇到诡异问题时,检查输出驱动、锁存器情况及时钟使能信号。FPGA 的核心在于并行思维,学会用硬件方式思考问题,可拓展至神经网络加速、视频处理等领域。

目录

  1. 什么是 FPGA
  2. Vivado 环境搭建
  3. 安装包获取
  4. 硬件准备
  5. 第一个工程创建
  6. Verilog 核心语法
  7. LED 流水灯实战
  8. 代码实现
  9. Modelsim 仿真
  10. 上板验证
  11. 学习路线
  12. 阶段一:数字电路基础
  13. 阶段二:Verilog 进阶
  14. 阶段三:实战项目
  15. 参考资源
  16. 常见问题

更多推荐文章

查看全部
  • Flutter for OpenHarmony TabBar 高级标签系统与导航交互优化
  • Jetpack Compose 实现微信风格图片浏览:缩放、切换与预览
  • GitHub Copilot 学生身份认证教程(非校园网)
  • OpenClaw 本地部署与飞书机器人接入指南
  • GitHub Copilot 学生认证指南:如何申请免费 Pro 权益
  • 从深度伪造到深度信任:AI安全的三场攻防战
  • GitHub Copilot 提示词设计与应用指南
  • GitHub Copilot 提示词工程指南:从基础到精通的 AI 编程协作
  • Spatial Joy 2025 全球 AR&AI 开发大赛参赛指南与资源解析
  • AI 技术综述与产品经理角色重塑
  • macOS 下使用脚本安装 Homebrew 及配置国内镜像源
  • C++ 多线程同步:原子操作 atomic 实战
  • 技术副业变现路径:Python 爬虫开发实战指南
  • Redis 入门与应用:常用数据结构集合与有序集合详解
  • object-browser 核心功能解析:文件上传、版本控制与权限管理
  • 二级 Python 考试真题及参考代码解析
  • 树的基本概念与堆的功能实现
  • LLaMA-2 与 Mixtral 提示词调优实战指南
  • SpringBoot 整合 Langchain4j RAG 技术深度使用解析
  • Java 手写哈希表(HashMap)实现原理

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online