尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FPGA新手入门:从点亮LED开始掌握Vivado与Verilog开发全流程
1. 为什么我建议每个FPGA新手都从点亮LED开始如果你刚拿到一块FPGA开发板打开Vivado或者Quartus面对满屏幕的选项和陌生的术语大概率会有点懵。我见过太多人卡在第一步——软件装好了板子插上了然后呢不知道从哪下手。我的建议非常明确别想太多先点亮一颗LED。这听起来简单得有点侮辱智商但我要告诉你点亮LED这个动作几乎串联了FPGA开发的所有核心环节工程创建、代码编写、约束文件、综合、实现、生成比特流、下载到板子。你把这套流程跑通一遍后面做再复杂的项目无非是在这个骨架上加东西。反过来如果你跳过这一步直接去搞图像处理或者高速接口遇到问题你连排查的方向都没有。这篇内容面向的是零基础或者刚接触FPGA的朋友我会用一颗LED作为线索把整个开发流程拆开揉碎讲清楚。关键词里提到的Vivado、Verilog、Modelsim我都会在实际操作中带到。你不需要有数字电路的基础但如果你学过一点C语言或者任何编程语言理解起来会顺畅很多。我用的硬件平台是Xilinx Artix-7系列的开发板市面上常见的入门板基本都是这个系列或者Cyclone IV系列软件是Vivado 2022.2。不同版本的Vivado界面会有差异但核心逻辑一致。如果你用的是Intel的板子Quartus的操作思路也大同小异我会在关键地方提一下区别。先说一个很多人忽略的事实FPGA开发和单片机开发是两种完全不同的思维方式。单片机是顺序执行代码FPGA是并行描述电路。你写的Verilog代码不是在“运行”而是在“描述一个电路长什么样”。这个思维转变是新手最大的坎而点亮LED恰好是最直观的切入点——你写一行代码让LED亮它立刻就亮了你能直接看到代码和硬件之间的对应关系。2. 动手之前的准备工作软件安装与硬件确认2.1 Vivado的安装与版本选择Vivado的安装是很多人的第一个拦路虎。安装包动辄几十个GB下载慢、安装慢还容易出各种幺蛾子。我先把几个关键点说清楚。版本选择上不建议盲目追新。Vivado 2022.2是我目前用下来比较稳定的版本对Artix-7和Zynq-7000系列的支持都很成熟。如果你用的是Windows 10或者Windows 11这个版本没问题。安装的时候注意几个选项Vivado HL WebPACK是免费版本对于入门和大部分中小规模项目完全够用不需要去折腾license的问题。安装组件里至少勾选Artix-7系列的支持包如果你不确定自己板子的芯片型号可以全选7系列占不了太多额外空间。安装路径不要有中文和空格这是血的教训。我见过有人装在“D:\我的文件\Xilinx\Vivado”下面结果综合的时候各种报错排查了半天才发现是路径问题。直接用“D:\Xilinx\Vivado\2022.2”这种纯英文路径省心。安装完成后第一次启动Vivado会比较慢它在初始化一些环境。如果你遇到“Vivado安装驱动无法识别板子”的问题大概率是USB Cable Driver没有正确安装。在Vivado安装目录下找到“data\xicom\cable_drivers\nt64”文件夹里面有install_drivers.exe右键以管理员身份运行安装完成后重启电脑。这个步骤很多人会跳过然后插上板子发现Vivado识别不到硬件又回头折腾。2.2 开发板硬件确认拿到板子之后先别急着插USB线。你需要确认几件事板子的芯片型号是什么比如xc7a35tftg256-1LED连接在哪个引脚上LED是高电平点亮还是低电平点亮。这些信息都在板子的原理图里。以常见的Artix-7入门板为例LED通常连接在FPGA的IO引脚上串联一个限流电阻到地或者到电源。如果是阳极接电源、阴极接IO那就是低电平点亮反过来就是高电平点亮。这个区别决定了你代码里输出0还是1。我见过有人代码写对了约束也对了但LED就是不亮最后发现是板子上有个电源开关没打开。所以插上USB线之后先确认板子的电源指示灯亮了再确认下载器的指示灯状态。2.3 工程目录结构规划在创建Vivado工程之前我建议你先在硬盘上建好一个清晰的目录结构。比如FPGA_Projects/ LED_Blink/ src/ # 存放Verilog源码 constr/ # 存放约束文件 sim/ # 存放仿真文件 doc/ # 存放文档Vivado创建工程的时候会问你要工程路径如果你直接选一个乱七八糟的桌面路径后面文件多了会非常乱。养成好习惯从第一个工程开始就规规矩矩的。3. 从零创建Vivado工程每一步都别跳过3.1 新建工程的完整流程打开Vivado点击“Create Project”然后跟着向导走。工程名称用英文比如“led_blink”路径选你刚才建好的目录。工程类型选“RTL Project”勾选“Do not specify sources at this time”因为我们要手动添加文件。接下来是选择芯片型号。这一步很关键选错了后面下载会报错。你可以在板子上找到芯片的丝印或者查板子的用户手册。比如xc7a35tftg256-1其中7a35t是芯片型号fgg256是封装-1是速度等级。在Vivado的搜索框里输入“xc7a35t”找到对应的封装和速度等级选中。工程创建完成后你会看到Vivado的主界面。左边是Flow Navigator从上到下依次是Project Manager、IP Integrator、Simulation、RTL Analysis、Synthesis、Implementation、Program and Debug。这个流程就是FPGA开发的标准流程我们后面会一步步走完。3.2 添加Verilog源文件在Flow Navigator里点击“Add Sources”选择“Add or create design sources”然后点击“Create File”。文件名用“led_blink.v”注意后缀是.v表示Verilog文件。Vivado会自动生成一个模块框架你可以直接在里面写代码。这里插一句关于Verilog和VHDL的选择。两者都是硬件描述语言功能上都能完成同样的任务。Verilog的语法更接近C语言上手快国内用Verilog的人更多网上的资料也更丰富。所以我建议新手直接学Verilog不用纠结。3.3 编写LED闪烁的Verilog代码先看一个最基础的版本module led_blink( input wire clk, // 系统时钟比如50MHz input wire rst_n, // 复位信号低电平有效 output reg led // LED输出 ); reg [25:0] cnt; // 26位计数器 always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 26d0; led 1b0; end else if (cnt 26d49_999_999) begin cnt 26d0; led ~led; // 每500ms翻转一次 end else begin cnt cnt 1b1; end end endmodule这段代码的逻辑很简单用一个计数器对系统时钟计数计到5000万的时候翻转LED的状态同时计数器清零。假设系统时钟是50MHz周期是20ns5000万个周期就是1秒。所以LED每1秒翻转一次亮1秒、灭1秒肉眼看到的就是闪烁。为什么用26位计数器因为2的26次方是67,108,864大于50,000,000够用了。如果你用25位最大只能计到33,554,432不够。这种细节新手容易忽略但实际写代码的时候必须算清楚。关于复位信号我建议从一开始就养成使用同步复位或者异步复位的习惯。上面的代码用的是异步复位negedge rst_n复位的时候计数器清零、LED熄灭。实际项目中复位信号的处理有很多讲究但入门阶段先有个概念就行。3.4 约束文件的编写把引脚和代码对应起来代码写完了但Vivado不知道你的clk、rst_n、led对应板子上的哪个物理引脚。这就需要约束文件XDC文件。在Flow Navigator里点击“Add Sources”选择“Add or create constraints”创建一个新的XDC文件比如“led_blink.xdc”。内容大概是这样# 时钟引脚约束 set_property PACKAGE_PIN E3 [get_ports clk] set_property IOSTANDARD LVCMOS33 [get_ports clk] # 复位引脚约束 set_property PACKAGE_PIN C12 [get_ports rst_n] set_property IOSTANDARD LVCMOS33 [get_ports rst_n] # LED引脚约束 set_property PACKAGE_PIN A14 [get_ports led] set_property IOSTANDARD LVCMOS33 [get_ports led] # 时钟周期约束 create_clock -period 20.000 -name sys_clk [get_ports clk]这里的PACKAGE_PIN就是芯片的物理引脚编号你需要根据自己板子的原理图来填。IOSTANDARD是IO电平标准常见的3.3V LVCMOS就是LVCMOS33。create_clock是时序约束告诉Vivado系统时钟的频率是50MHz周期20ns。注意引脚编号千万不能填错。如果你把电源引脚或者地引脚填进去下载的时候可能会报错严重的甚至可能损坏板子。填之前一定对照原理图确认。3.5 综合、实现与生成比特流约束文件写好之后点击Flow Navigator里的“Run Synthesis”。Vivado会把你写的Verilog代码转换成门级网表这个过程叫综合。综合完成后会弹出一个对话框选择“Run Implementation”。实现的过程包括布局和布线把综合出来的逻辑单元映射到FPGA内部的实际资源上。实现完成后选择“Generate Bitstream”。比特流文件就是最终要下载到FPGA里的配置文件后缀是.bit。这三个步骤每一步都可能报错。常见的错误包括语法错误、引脚约束冲突、时序不满足等。如果是语法错误Vivado会在Tcl Console里给出具体的行号和错误信息照着改就行。如果是时序不满足入门阶段一般不会遇到因为LED闪烁的逻辑非常简单50MHz的时钟随便跑。4. 仿真验证用Modelsim看波形4.1 为什么仿真这一步不能省很多人觉得LED闪烁这么简单的逻辑没必要仿真直接下载到板子看结果就行了。但我要说仿真验证是FPGA开发中最重要的调试手段没有之一。你后面做复杂的项目不可能每次都下载到板子上去试仿真是你验证逻辑正确性的第一道防线。而且仿真能让你看到信号随时间变化的细节这是示波器都做不到的。比如你想看计数器在某个时刻的值仿真波形里一目了然。4.2 编写TestbenchTestbench就是一个没有输入输出的Verilog模块它负责给被测模块提供激励信号。对于LED闪烁Testbench大概长这样timescale 1ns / 1ps module tb_led_blink; reg clk; reg rst_n; wire led; // 例化被测模块 led_blink u_led_blink( .clk(clk), .rst_n(rst_n), .led(led) ); // 生成时钟50MHz周期20ns initial begin clk 0; forever #10 clk ~clk; end // 复位和激励 initial begin rst_n 0; #100; rst_n 1; #2000; $stop; end endmodule时钟的生成用了一个forever循环每10ns翻转一次周期就是20ns对应50MHz。复位信号在100ns后拉高然后仿真运行2000ns后停止。4.3 Modelsim的配置与波形查看Vivado自带的仿真器是Vivado Simulator但很多人更习惯用Modelsim。如果你装了Modelsim可以在Vivado里设置仿真工具为Modelsim。在Settings里找到Simulation把Target simulator改成Modelsim然后指定Modelsim的安装路径。运行仿真后Modelsim会打开波形窗口。你需要手动添加想要观察的信号比如clk、rst_n、led、cnt。添加之后点击“Run All”波形就会显示出来。如果你看到波形是红色的线说明信号是未知状态X通常是因为复位没有正确执行或者某个信号没有被初始化。这是新手常见的问题检查一下复位逻辑和初始值。提示仿真的时候可以把计数器的比较值改小比如改成49而不是49_999_999这样仿真时间短波形也容易看。验证逻辑正确之后再改回实际值。5. 下载到板子从比特流到实际运行5.1 硬件连接与设备识别把板子通过USB线连接到电脑打开板子的电源开关。在Vivado里点击“Open Hardware Manager”然后点击“Open Target” - “Auto Connect”。如果一切正常Vivado会识别到板子上的FPGA芯片。如果识别不到先检查USB线是不是只供电不传数据的那种有些便宜的线只有电源线没有数据线。然后检查驱动是否安装正确。在Windows设备管理器里看看有没有“Xilinx USB Cable”或者类似的设备如果有黄色感叹号说明驱动有问题重新安装驱动。5.2 下载比特流与观察结果识别到设备后右键点击芯片图标选择“Program Device”。在弹出的对话框里选择你生成的.bit文件点击“Program”。下载完成后你应该能看到板子上的LED开始闪烁了。如果LED不亮先别慌。按以下顺序排查板子电源是否打开比特流是否下载成功Vivado会提示Program successful引脚约束是否和原理图一致LED是高电平点亮还是低电平点亮如果是低电平点亮你的代码输出高电平LED就是灭的我遇到过有人把LED的引脚约束写成了另一个LED的引脚结果下载后另一个LED在闪他盯着自己以为的那个LED看了半天。所以确认引脚的时候一定要仔细。5.3 固化程序到Flash比特流下载到FPGA之后掉电就丢失了。如果你想让板子上电自动运行程序需要把比特流固化到板子上的Flash芯片里。在Hardware Manager里右键点击设备选择“Add Configuration Memory Device”然后根据板子上的Flash型号选择对应的配置。之后右键点击Flash设备选择“Program Configuration Memory Device”加载.bit文件等待烧写完成。固化的时候要注意有些板子的Flash需要特定的配置模式比如Master SPI模式这些在板子的用户手册里都有说明。如果你只是做实验不固化也没关系每次上电重新下载就行。6. 新手最容易踩的五个坑6.1 引脚约束文件格式错误XDC文件的语法比较严格少一个空格或者多一个引号都会报错。比如set_property PACKAGE_PIN E3 [get_ports clk]方括号和花括号不能混用端口名要和Verilog模块里的名字完全一致大小写敏感。我建议你直接复制板子厂商提供的示例XDC文件然后改引脚编号这样最稳妥。6.2 时钟约束忘记添加很多人只写了引脚约束忘了写create_clock。没有时钟约束Vivado在实现阶段不知道你的时钟频率时序分析就没法做。虽然LED闪烁这种简单逻辑不加也能跑但养成好习惯从一开始就加上。6.3 计数器位宽不够导致逻辑错误前面提到过计数器的位宽要足够大能容纳你需要的计数值。如果你要计数到50,000,000至少需要26位。如果你只定义了24位计数器会在16,777,215的时候溢出归零LED的闪烁频率就不是你预期的了。这种错误在仿真的时候就能发现所以仿真这一步真的不能省。6.4 仿真时忘记添加信号到波形窗口Modelsim默认不会把所有信号都显示在波形窗口里你需要手动添加。有些人跑完仿真发现波形窗口是空的以为仿真没跑起来其实是信号没加进去。在Modelsim的Objects窗口里选中信号右键“Add to Wave”就行了。6.5 下载时选错比特流文件如果你同时开了多个Vivado工程生成的.bit文件可能在不同的目录下。下载的时候一定要确认选的是当前工程的比特流文件。我见过有人下载了旧版本的比特流然后纳闷为什么代码改了但板子上的行为没变。7. 从点亮LED到更复杂的项目下一步怎么走点亮一颗LED之后你可以沿着几个方向继续深入。第一个方向是数码管动态显示。关键词里提到了“fpga实现数码管动态显示”这其实是在LED的基础上增加了时分复用和译码逻辑。你需要用计数器产生扫描信号轮流点亮不同的数码管位同时输出对应的段码。这个项目能让你理解时序控制和状态机的概念。第二个方向是PWM调光。让LED的亮度可调本质上是用PWM波控制LED的通断时间比例。你需要一个计数器和一个比较器当计数值小于比较值时输出高电平否则输出低电平。改变比较值就能改变占空比从而改变亮度。这个技术后面可以用在电机控制、电源管理等领域。第三个方向是按键控制。加一个按键按一下LED亮再按一下LED灭。这涉及到按键消抖的问题。机械按键在按下和松开的时候会产生抖动FPGA的时钟频率很高能捕捉到这些抖动所以需要加一个消抖逻辑通常是检测按键稳定一段时间后才认为按键有效。第四个方向是串口通信。用FPGA实现一个UART收发器通过串口和电脑通信电脑发送命令控制LED的亮灭。这个项目能让你理解串行通信的时序和波特率的计算。每一个方向都是在LED项目的基础上叠加新的模块核心的开发流程——写代码、仿真、综合、实现、下载——完全一样。你把LED这个流程走通了后面的项目就是在这个骨架上添砖加瓦。我个人在实际操作中的体会是FPGA入门最难的不是写代码而是建立硬件思维。你要时刻想着你的代码对应的是什么样的电路信号是并行存在的不是顺序执行的。点亮LED这个项目虽然简单但它能让你直观地感受到代码和硬件之间的对应关系。每次我看到LED按照我写的逻辑闪烁都会有一种“我确实控制了这个芯片”的踏实感。最后再分享一个小技巧在Vivado里你可以用“Schematic”视图查看综合后的电路图。点击RTL Analysis - Open Elaborated Design然后选择Schematic你能看到Vivado把你的Verilog代码变成了什么样的逻辑门和触发器。对于新手来说这个视图能帮你理解代码和电路之间的映射关系非常直观。
RELATED

相关推荐

SPSS多元线性回归实例:从截图到语法复现与结果解读

SPSS多元线性回归实例:从截图到语法复现与结果解读

简介:这份PDF面向备考统计类考试、需要掌握多元线性回归实操的读者,以SPSS软件为工具,通过完整实例演示从数据输入到结果解释的全流程。资源共1个PDF文件,压缩包约7.91MB,内容以操作截图为主,直观呈现SPSS界…

📅 2026/9/19 19:03:44
OneUptime Runbook 代理(Agent)完全指南:在自建基础设施内安全执行 Bash 与 JavaScript 步骤

OneUptime Runbook 代理(Agent)完全指南:在自建基础设施内安全执行 Bash 与 JavaScript 步骤

OneUptime Runbook 代理(Agent)完全指南:在自建基础设施内安全执行 Bash 与 JavaScript 步骤 【免费下载链接】oneuptime Complete open-source monitoring and observability platform. 项目地址: https://gitcode.com/GitHub_Trending/on…

📅 2026/9/19 19:03:44
Glances MPP 插件详解:监控 Rockchip 平台硬件视频编解码引擎(RKVENC / RKVDEC / RKJPEGD)

Glances MPP 插件详解:监控 Rockchip 平台硬件视频编解码引擎(RKVENC / RKVDEC / RKJPEGD)

指标监控监控大盘CLI告警MCP 服务 【免费下载链接】glances Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems. 项目地址: https://gitcode.com/gh_mirrors/gl/glances 点击查看 免费下载 导读 本…

📅 2026/9/19 19:03:44
MORE NEWS

更多资讯

📰

绕线电机串级调速系统设计:从参数计算到双闭环整定

简介:围绕晶闸管串级调速双闭环系统设计,这份设计说明文档提供了从方案论证到建模仿真的完整技术路径,适合电气工程及其自动化专业学生、相关工程技术人员作为课程设计或项目参考。资源为单个doc文档,大小1.29MB,核心内…

📰

LeetCode 501:二叉搜索树中的众数(Find Mode in BST)——单次中序遍历实现 O(1) 额外空间的解法

LeetCode 501:二叉搜索树中的众数(Find Mode in BST)——单次中序遍历实现 O(1) 额外空间的解法 【免费下载链接】leetcode LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之…

📰

Taro Audio 音频组件完全指南:属性、事件、平台差异与源码实现解析

Taro Audio 音频组件完全指南:属性、事件、平台差异与源码实现解析 【免费下载链接】taro 开放式跨端跨框架解决方案,支持使用 React/Vue/Nerv 等框架来开发微信/京东/百度/支付宝/字节跳动/ QQ 小程序/H5/React Native 等应用。 https://taro.zone/ 项…

📰

Springer LaTeX参考文献编译错误根因与抗错实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

SpringBoot+Vue+MySQL林业产品推荐系统设计:协同过滤与冷启动实战

1. 毕业设计选型背后的逻辑:为什么这个组合成了经典搭配每年到毕业季,计算机相关专业的学生都在纠结同一个问题:做什么题目?用哪套技术栈?工作量怎么控制?市面上泛滥的“XXX管理系统”虽然容易做&#xff0…

📰

Flutter适配OpenHarmony:stringr纯Dart库的字符串处理实战

在 Flutter 适配 OpenHarmony 的路上,文本处理这块我算是走得比较早的一批。把 Flutter 工程真正跑到鸿蒙设备上之后,第一件事就是把常用的字符串处理工具链理顺,而 stringr 这个纯 Dart 三方库,是我在实际项目里用得最顺手的一个…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬