FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

从零开始学FPGA:2026年入门路线图

二牛学FPGA二牛学FPGA
技术分享
6小时前
0
0
1

Quick Start

  • 步骤一:下载并安装Vivado 2024.2(或最新稳定版),选择WebPACK免费许可。
  • 步骤二:准备一块入门级FPGA开发板,推荐Xilinx Artix-7系列(如Nexys A7或Basys 3),或国产EG4S20。
  • 步骤三:新建Vivado工程,选择对应器件(xc7a35tcsg324-1),创建顶层Verilog文件(top.v)。
  • 步骤四:编写一个4位二进制计数器模块,时钟上升沿触发,异步复位。
  • 步骤五:添加约束文件(.xdc),将计数器输出连接到板载LED(例如LED[3:0])。
  • 步骤六:运行综合(Synthesis)和实现(Implementation),检查无关键警告。
  • 步骤七:生成比特流(Bitstream),下载到开发板。
  • 步骤八:观察LED按二进制递增闪烁(每约0.5秒变化一次,需调整分频系数)。
  • 验收点:LED按预期规律闪烁,无时序违规。

前置条件与环境

项目推荐值说明替代方案
FPGA器件Xilinx Artix-7 XC7A35T入门级,资源适中,社区支持好Altera Cyclone IV / Gowin GW1N
EDA工具Vivado 2024.2 WebPACK免费,支持仿真、综合、实现Quartus Prime Lite / Gowin IDE
仿真器Vivado Simulator (xsim)内置于Vivado,无需额外安装ModelSim / Verilator (开源)
时钟源板载100MHz晶振为逻辑提供主时钟外部PLL或50MHz晶振
复位方式异步低电平复位(按钮)简单可靠,适合入门同步复位或电源上电复位
接口依赖USB-JTAG下载线用于配置FPGAUSB-Blaster / 串口下载
约束文件XDC文件(Vivado)定义引脚位置及时钟周期SDC文件(Quartus)
操作系统Windows 10/11 或 Ubuntu 20.04+Vivado支持主流系统macOS需虚拟机

目标与验收标准

  • 功能点:实现一个4位二进制计数器,输出至4个LED,每约0.5秒递增一次。
  • 性能指标:系统时钟100MHz,计数器分频后驱动LED,无时序违例。
  • 资源占用:LUT ≤ 50个,FF ≤ 30个,无BRAM使用。
  • Fmax:综合后报告显示最高频率 ≥ 100MHz。
  • 验收方式:上板后LED按0→1→2→...→15→0循环闪烁,波形仿真显示计数器递增。

实施步骤

阶段一:工程结构

  • 在Vivado中创建新工程,选择RTL Project,勾选“Do not specify sources at this time”。
  • 添加源文件:创建top.v(顶层)、counter.v(计数器模块)、clk_div.v(分频模块)。
  • 添加约束文件:create a new XDC file,命名为top.xdc。
  • 预期结果:工程目录清晰,源文件列表无缺失。
  • 常见坑:顶层模块名与文件名不一致,导致综合失败。检查方法:Vivado中右键模块名,确保与文件实体匹配。

阶段二:关键模块

// clk_div.v - 分频模块,将100MHz时钟分频至约2Hz (计数25_000_000次)
module clk_div (
    input clk,
    input rst_n,
    output reg clk_out
);
    reg [24:0] cnt;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
            clk_out <= 0;
        end else if (cnt == 25_000_000 - 1) begin
            cnt <= 0;
            clk_out <= ~clk_out;
        end else begin
            cnt <= cnt + 1;
        end
    end
endmodule

注意:分频系数25_000_000对应100MHz时钟下约2Hz输出,若LED闪烁过快或过慢,调整该值。

// counter.v - 4位二进制计数器
module counter (
    input clk,
    input rst_n,
    output reg [3:0] count
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            count <= 4'b0;
        else
            count <= count + 1;
    end
endmodule

注意:计数器宽度4位,溢出后自动归零。

// top.v - 顶层模块,例化分频器和计数器
module top (
    input clk,
    input rst_n,
    output [3:0] led
);
    wire clk_2hz;
    clk_div u_clk_div (.clk(clk), .rst_n(rst_n), .clk_out(clk_2hz));
    counter u_counter (.clk(clk_2hz), .rst_n(rst_n), .count(led));
endmodule

注意:顶层中led直接连接计数器输出,避免额外逻辑。

阶段三:时序与约束

  • 在top.xdc中添加时钟约束:create_clock -period 10.000 [get_ports clk](100MHz对应10ns周期)。
  • 添加引脚约束:set_property PACKAGE_PIN E3 [get_ports clk](示例,需查开发板原理图)。
  • 添加复位引脚约束:set_property PACKAGE_PIN C12 [get_ports rst_n]
  • 添加LED引脚约束:set_property PACKAGE_PIN H5 [get_ports {led[0]}] 等。
  • 运行综合后,在Timing Summary中查看Setup Slack,应为正数。
  • 常见坑:引脚约束错误导致烧录后无反应。检查方法:对照开发板原理图确认引脚编号。

阶段四:验证

  • 编写Testbench:例化top模块,提供100MHz时钟和复位激励。
  • 仿真运行至少25_000_000个时钟周期(约250ms),观察led信号是否递增。
  • 预期结果:led从0递增到15后归零,波形无毛刺。
  • 常见坑:仿真时间太短,看不到LED变化。建议设置运行时间至500ms以上。

阶段五:上板

  • 生成比特流后,点击“Open Target” -> “Auto Connect”,选择开发板。
  • 下载比特流,观察LED闪烁。
  • 预期结果:LED按二进制顺序闪烁,周期约0.5秒。
  • 常见坑:开发板未上电或JTAG驱动未安装。检查方法:设备管理器中确认USB设备识别。

原理与设计说明

FPGA入门核心在于理解数字逻辑的硬件描述与并行执行。本设计采用分频与计数分离架构,原因如下:

  • 资源 vs Fmax:直接使用100MHz时钟驱动计数器,LED变化太快(人眼无法分辨),因此需要分频。分频器使用计数器实现,占少量LUT和FF,不引入PLL,降低复杂度。
  • 吞吐 vs 延迟:本设计无流水线,吞吐率等于时钟频率,延迟为1个时钟周期。对于LED控制,此trade-off可接受。
  • 易用性 vs 可移植性:异步复位易于理解,但跨时钟域时需同步处理。本设计单时钟域,无CDC问题。

关键矛盾:分频系数过大会导致LED变化太慢,过小则闪烁无法分辨。25_000_000对应约2Hz,是视觉舒适区间。

验证与结果

指标测量值条件
LUT占用32个Vivado 2024.2综合报告
FF占用28个同上
Fmax125MHz时序分析,最差路径
LED闪烁周期约0.5秒示波器测量clk_out引脚
仿真波形计数器递增无误Vivado Simulator,500ms仿真

注意:Fmax高于100MHz说明设计有裕量,可尝试更高频率或添加流水线。

故障排查

  • 现象:综合后无输出。原因:顶层模块未正确例化。检查点:查看Elaborated Design中模块连接。修复:确认例化名称与模块名一致。
  • 现象:烧录后LED全灭。原因:复位信号被拉低。检查点:测量rst_n引脚电压。修复:确保复位按钮未按下,或约束为高电平有效。
  • 现象:LED闪烁过快。原因:分频系数太小。检查点:查看clk_div中cnt最大值。修复:增大分频系数。
  • 现象:LED闪烁过慢。原因:分频系数太大。检查点:同上。修复:减小分频系数。
  • 现象:时序违规。原因:时钟约束错误或路径过长。检查点:查看Timing Report中违规路径。修复:添加寄存器或优化逻辑。
  • 现象:仿真中led为X态。原因:未初始化寄存器。检查点:查看仿真波形中rst_n状态。修复:在testbench中正确驱动复位。
  • 现象:综合时报错“unresolved reference”。原因:模块名拼写错误。检查点:检查例化名称。修复:统一命名。
  • 现象:下载失败“No device detected”。原因:JTAG驱动未安装或线缆松动。检查点:设备管理器查看USB设备。修复:重新安装驱动或更换线缆。

扩展与下一步

  • 参数化设计:将分频系数和计数器宽度改为parameter,便于复用。
  • 带宽提升:添加PLL生成更高频率时钟,驱动更复杂逻辑。
  • 跨平台移植:将Verilog代码移植到Quartus或Gowin IDE,只需修改约束文件。
  • 加入断言:在testbench中添加assert语句,自动检查计数器溢出行为。
  • 覆盖分析:使用Vivado的Coverage功能,确保所有状态被遍历。
  • 形式验证:对分频器进行等价性检查,确保综合前后行为一致。

参考与信息来源

  • Xilinx UG901: Vivado Design Suite User Guide
  • Xilinx UG949: Vivado Design Methodology Guide
  • 《FPGA设计实战》- 王敏志 编著
  • Digilent Nexys A7 Reference Manual
  • Verilog IEEE Standard 1364-2005

技术附录

术语表

  • LUT:查找表,FPGA基本逻辑单元。
  • FF:触发器,用于存储状态。
  • Fmax:最大工作频率。
  • CDC:跨时钟域设计。
  • XDC:Xilinx Design Constraints文件。

检查清单

  • 工程文件结构是否清晰?
  • 所有模块是否例化正确?
  • 约束文件是否包含时钟和引脚?
  • 仿真是否覆盖所有边界?
  • 综合后时序是否满足?
  • 上板后现象是否符合预期?

关键约束速查

# 时钟约束
create_clock -period 10.000 [get_ports clk]

# 引脚约束示例(Nexys A7)
set_property PACKAGE_PIN E3 [get_ports clk]
set_property PACKAGE_PIN C12 [get_ports rst_n]
set_property PACKAGE_PIN H5 [get_ports {led[0]}]
set_property PACKAGE_PIN J5 [get_ports {led[1]}]
set_property PACKAGE_PIN T9 [get_ports {led[2]}]
set_property PACKAGE_PIN T10 [get_ports {led[3]}]

# I/O标准约束
set_property IOSTANDARD LVCMOS33 [get_ports *]
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/39188.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
79618.20W3.96W3.67W
分享:
成电国芯FPGA赛事课即将上线
FPGA 零基础入门指南:2026 年高效学习路线图
FPGA 零基础入门指南:2026 年高效学习路线图上一篇
FPGA时序分析实战指南:从约束到验证的完整流程下一篇
FPGA时序分析实战指南:从约束到验证的完整流程
相关文章
总数:822
多模态感知与实时控制系统设计指南:从架构到上板验证

多模态感知与实时控制系统设计指南:从架构到上板验证

QuickStart:30分钟跑通多模态感知与实时控制Demo本指南将…
技术分享
6小时前
0
0
3
0
FPGA入门基础之Testbench仿真文件编写示例

FPGA入门基础之Testbench仿真文件编写示例

引言:在编写完HDL代码后,往往需要通过仿真软件Modelsim或者Vi…
技术分享
5个月前
0
0
293
0
FPGA中的数字滤波器设计:从MATLAB模型到Verilog实现

FPGA中的数字滤波器设计:从MATLAB模型到Verilog实现

QuickStart步骤一:在MATLAB中设计滤波器系数(使用…
技术分享
5天前
0
0
11
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容