FPGA开发实战:从Vivado环境搭建到Artix-7上板调试全流程解析

发布时间:2026/6/2 15:08:37

FPGA开发实战:从Vivado环境搭建到Artix-7上板调试全流程解析 1. 项目概述与核心价值如果你刚接触FPGA面对Vivado里一堆IP核和约束文件感到无从下手那这篇文章就是为你准备的。我最近用一块Artix-7开发板具体型号是XC7A15T-1CPG236C折腾了一个小项目通过Block Design块设计的方式集成几个常用的IP核实现一个按键控制、LED显示的计数器。听起来简单但整个过程几乎踩遍了新手会遇到的所有坑——从Vivado在Linux下的诡异安装失败到约束文件引脚绑定错误再到仿真和上板调试的种种问题。最终当按下按键LED灯按预期亮起并计数时那种“通了”的感觉正是硬件开发的乐趣所在。这个项目的核心价值在于它不是一个孤立的代码示例而是一个完整的、可复现的工程实践流程。它涵盖了FPGA开发的几个关键环节开发环境搭建、约束文件XDC的编写与理解、IP核Intellectual Property Core的图形化集成以及从仿真到上板的完整调试链。对于初学者而言理解如何将抽象的硬件描述语言我用的是VHDL和图形化的Block Design结合起来并最终在真实的硬件上跑起来是跨越理论和实践鸿沟的关键一步。本文将详细拆解每个步骤背后的“为什么”并分享那些官方手册里不会写的实操心得和避坑指南。2. 开发环境搭建跨越操作系统的障碍工欲善其事必先利其器。FPGA开发的第一步永远是搭建环境而Vivado的安装过程本身就可能成为第一个“下马威”尤其是在Linux系统上。2.1 Linux系统下的安装攻坚原作者的描述“after 120 times (around 10 days) it worked”虽然夸张但确实反映了部分现实。Xilinx现在是AMD的一部分的安装器有时会因网络、依赖库或系统版本问题卡住。以下是我总结的可靠安装步骤和问题排查思路核心安装流程获取安装器从AMD官网下载“Xilinx Unified Installer”的Linux版本。建议选择离线安装包体积较大以避免网络波动导致下载失败。如果必须使用在线安装器Web Installer确保网络环境稳定。赋予执行权限在终端进入下载目录执行chmod x Xilinx_Unified_2021.1_xxxx.bin。这一步至关重要否则文件无法运行。以管理员权限运行执行sudo ./Xilinx_Unified_2021.1_xxxx.bin启动图形化安装界面。选择版本与组件对于Artix-7这类主流器件选择“Vivado HL WebPACK”版本即可它是免费的功能对于学习和多数项目足够。在组件选择页面务必勾选“Artix-7”器件支持。其他如SDK软件开发工具包可以根据是否需要软核处理器开发来决定是否安装。漫长的安装与等待安装过程会下载并解压大量文件耗时可能长达数小时请保持耐心。常见问题与解决方案实录问题一安装器启动失败或中途崩溃排查这通常是因为系统缺少32位兼容库。在Ubuntu/Debian上运行以下命令安装基础依赖sudo apt-get update sudo apt-get install libncurses5 libtinfo5 lib32z1 lib32stdc6心得即使你是64位系统Vivado的某些底层工具仍依赖32位库提前安装能避免大部分启动问题。问题二安装后运行vivado命令报错提示缺少librdi_commontasks.so或libtinfo.so.5排查这是动态链接库问题。首先尝试安装libtinfo5和libtinfo-devsudo apt-get install libtinfo5 libtinfo-dev如果问题依旧可能是库文件符号链接不对。可以尝试手动创建软链接以libtinfo.so.5为例# 查找系统中已有的libtinfo.so版本 find /usr/lib -name libtinfo.so* # 假设找到的是libtinfo.so.6为其创建一个libtinfo.so.5的链接 sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/libtinfo.so.5注意这种方法有风险可能会影响其他软件。更稳妥的方法是安装多版本兼容库或使用容器/虚拟机。问题三硬件管理器无法识别下载器如Digilent USB-JTAG排查在Linux下需要手动安装电缆驱动。驱动文件通常位于Vivado安装目录下例如/tools/Xilinx/Vivado/2021.1/data/xicom/cable_drivers/lin64/install_script。解决进入该目录以root权限运行安装脚本sudo ./install_drivers。安装后可能需要将当前用户加入dialout组以获取串口权限sudo usermod -a -G dialout $USER然后注销并重新登录生效。验证连接开发板后运行lsusb命令应能看到类似“Digilent”或“Xilinx”的设备信息。关于桌面图标在Linux下创建桌面快捷方式确实麻烦。可靠的方法是创建一个.desktop文件放在~/.local/share/applications/目录下。内容如下[Desktop Entry] TypeApplication NameVivado 2021.1 CommentFPGA Design Suite Exec/tools/Xilinx/Vivado/2021.1/bin/vivado Icon/tools/Xilinx/Vivado/2021.1/doc/images/vivado_logo.png Terminalfalse CategoriesDevelopment;Electronics;将Exec和Icon的路径替换为你的实际安装路径。保存后在应用菜单中就能找到Vivado了。2.2 Windows系统下的相对平顺之路在Windows上安装Vivado通常顺利很多基本上就是“下一步”到底。但仍有几点需要注意安装路径避免包含中文或空格的路径例如不要安装在“C:\Program Files\Xilinx\”下可以选择“C:\Xilinx\”。这能防止一些潜在的工具链路径问题。防病毒软件安装和运行过程中临时关闭Windows Defender或第三方杀毒软件的实时保护它们有时会误拦截Vivado的后台进程导致编译卡死或失败。磁盘空间确保系统盘有至少50GB的可用空间。Vivado本身占用约30GB项目编译过程中产生的临时文件也会占用大量空间。注意无论哪种系统安装完成后第一件事应该是打开Vivado创建一个简单的测试工程例如一个反相器尝试完成全流程综合、实现、生成比特流以验证整个环境是否工作正常。不要等到做复杂项目时才发现环境有问题。3. 工程创建与约束文件XDC的深度解析环境搞定后我们开始真正的硬件设计。第一步是创建工程和编写约束文件。约束文件是FPGA设计中连接逻辑世界和物理世界的桥梁它告诉工具你的信号对应到芯片的哪个引脚以及这些信号的电气特性和时序要求。3.1 创建新工程与器件选择打开Vivado点击“Create Project”。在“Part”选择页面这是关键一步。我们需要准确找到我们的芯片家族FamilyArtix-7子系列Sub-family保持默认或根据型号选择。封装Packagecpg236速度等级Speed Grade-1这是商业级芯片常见的速度等级温度等级Temp Grade通常为C商业级。 在筛选后的列表中应该能找到xc7a15t_1cpg236。务必核对一遍选错器件会导致后续引脚约束完全对不上。3.2 理解并编写XDC约束文件约束文件是本次项目的重中之重。原作者的XDC文件提供了很好的模板我们来逐条拆解其含义。时钟约束是时序逻辑的基石## 12 MHz Clock Signal set_property -dict { PACKAGE_PIN L17 IOSTANDARD LVCMOS33 } [get_ports { sysclk }]; create_clock -add -name sys_clk_pin -period 83.33 -waveform {0 41.66} [get_ports {sysclk}];set_property这条命令进行物理约束。PACKAGE_PIN L17将逻辑端口sysclk绑定到芯片封装的L17引脚。这个信息必须严格参照开发板的原理图。IOSTANDARD LVCMOS33指定该引脚的电气标准为3.3V低压CMOS。这是最常用的标准匹配大多数现代外设电平。create_clock这条命令进行时序约束它对综合和实现工具至关重要。-period 83.33时钟周期为83.33纳秒ns对应频率为12MHz1/83.33e-9 ≈ 12e6。-waveform {0 41.66}定义了时钟波形。第一个数字0表示第一个上升沿在0ns时刻第二个数字41.66表示第一个下降沿在41.66ns时刻即占空比为50%。这个信息帮助工具进行更精确的保持时间Hold Time检查。为什么必须有时序约束没有它Vivado的时序分析引擎就无法工作它不知道你的系统需要跑多快也就无法优化布局布线和报告时序违例。你的设计可能在仿真中完美但上板后却因时序不满足而运行错误。LED与按键的物理约束## LEDs set_property -dict { PACKAGE_PIN A17 IOSTANDARD LVCMOS33 } [get_ports { ausgang1 }]; set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ausgang2 }]; ## Buttons set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { eingang1 }]; set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { eingang2 }];引脚编号A17,C16,A18,B18这些同样来自原理图。每个开发板都不一样绝对不能照抄。你必须使用自己开发板提供的约束文件或原理图。信号方向ausgang德语“输出”对应LEDeingang德语“输入”对应按键。在VHDL顶层实体中端口声明必须与这里的get_ports内的名字完全一致包括大小写。高有效还是低有效这是硬件设计的一个关键细节。原作者的注释提到“please check if LEDs are high or low active”。大多数开发板的LED是低电平有效即引脚输出0时LED亮因为这样设计可以节省功耗当FPGA引脚初始化或处于高阻态时LED不亮。而按键通常是高电平有效按下时连接到3.3V输入为1。务必查阅原理图确认这个判断错误会导致逻辑完全相反。实操心得管理约束文件方法一直接编辑XDC文件。在Vivado的“Sources”窗口找到“Constraints”目录下的.xdc文件双击用内置编辑器或外部文本编辑器修改。方法二使用IO Planning视图。在综合之后打开“IO Planning”标签页你可以看到一个芯片封装的图形化视图直接在上面拖拽端口到引脚上约束会自动生成。这种方法直观但前提是你已经创建了顶层端口。版本控制XDC文件是文本文件强烈建议用Git等工具进行版本管理。每次硬件连接改动比如换用不同的引脚都应留下记录。4. Block Design图形化设计实战Vivado的Block DesignBD工具允许我们以搭积木的方式构建系统特别适合集成Xilinx提供的或自己封装的IP核。对于本项目我们要搭建一个系统按键触发信号经过一些逻辑处理最终用LED显示一个计数状态。4.1 创建Block Design并添加IP核在“Flow Navigator”中点击“Create Block Design”。在画布中右键选择“Add IP”或使用快捷键CtrlI。会弹出IP目录窗口。添加计数器CounterIP在搜索框输入“binary counter”选择“Binary Counter”。这是一个非常基础的计数器IP可以配置计数方向、宽度、加载值等。关键配置在“Re-customize IP”窗口中将“Output Width”设置为10。这意味着计数器将从0计数到2^10 - 1 1023然后翻转为0。计数时钟就是我们约束的12MHz系统时钟。这样计满一轮需要的时间是 1024 * (1/12e6)秒 ≈ 85.3微秒μs。这个速度对于人眼观察LED变化来说太快了所以我们通常不会直接用系统时钟驱动显示用的计数器而是先分频。这里原作者可能用按键来控制计数使能或者用这个快速计数器作为其他逻辑的时基。添加FIFO Generator IP搜索并添加“FIFO Generator”。FIFO先进先出队列是数据流处理中常用的缓冲组件。在这个“玩一玩”的项目里它可能用来存储按键事件或中间数据。关键配置选择“Native Ports”接口FIFO实现方式为“Common Clock Block RAM”同步FIFO使用块RAM资源。设置合适的读写数据位宽和深度。例如如果我们要存储8位数据深度设为16就能缓冲16个数据。FIFO会提供full满、empty空等状态信号非常适合用来驱动状态指示灯如原作者提到的“full-fifo LEDs”。添加Utility Vector Logic IP搜索并添加“Utility Vector Logic”。这个IP可以实现基本的位逻辑运算如与、或、非、异或等。我们可以用它来处理按键消抖后的信号或者组合多个控制信号。配置选择操作类型如AND设置输入端口数量如2和位宽如1。4.2 创建设计模块与连接除了IP核我们还需要创建代表外部接口按键、LED和可能的一些自定义逻辑的模块。创建顶层模块端口在Block Design画布空白处右键选择“Create Port”。输入端口创建sysclk(时钟)、eingang1、eingang2(两个按键输入)。输出端口创建ausgang1、ausgang2(可能用于指示FIFO状态)、led0_b(RGB LED蓝色通道)以及led0到led3(四个独立LED)。注意端口名称必须与XDC文件中定义的完全一致。连接时钟与复位将sysclk端口连接到所有IP核的时钟输入端口通常是clk。如果有复位信号本例可能没有也需要全局连接。Vivado的自动连接功能Run Connection Automation可以帮你快速完成时钟和复位网络的连接非常方便。连接数据与控制通路将按键输入端口eingang2连接到某个逻辑如Utility Vector Logic或直接连接到计数器使能端CE。将计数器的输出位例如低4位Q[3:0]连接到led0到led3这4个输出端口这样LED就能以二进制形式显示计数值。将FIFO的full信号连接到ausgang1将empty信号连接到ausgang2用于状态指示。将FIFO的写使能wr_en与按键处理逻辑相连实现按键按下时向FIFO写入数据。地址映射与寄存器切片在复杂的连接中如果数据位宽不匹配可能需要使用“Slice” IP来截取信号的一部分或者使用“Concat” IP来拼接信号。在本项目中计数器输出是10位但我们只用了低4位驱动LED这本身已经是一种“切片”操作在连线时直接选择总线中的特定位即可。4.3 生成HDL包装文件WrapperBlock Design本身是一个图形化文件.bdVivado的综合工具并不能直接处理它。我们需要将其“翻译”成硬件描述语言。在“Sources”窗口中右键点击你的.bd文件。选择“Create HDL Wrapper”。在弹出的对话框中通常选择“Let Vivado manage wrapper and auto-update”。这样Vivado会为这个Block Design生成一个顶层的VHDL或Verilog文件取决于你的项目设置并且当Block Design有改动时它会自动更新这个包装文件。生成后你会看到多了一个名为design_1_wrapper的顶层文件。这个文件就是你整个图形化设计的门面它包含了所有IP核实例化和它们之间的连接。这个包装文件就是你的设计顶层后续的仿真、综合、实现都是基于它。重要心得Block Design的“Validate Design”功能快捷键F6一定要用。它能检查未连接的端口、位宽不匹配、时钟域交叉等常见问题。在生成Wrapper之前通过验证能节省大量调试时间。5. 仿真验证用Testbench确保逻辑正确在生成比特流并烧录到板子之前仿真是验证设计功能是否正确的最经济、最快速的手段。Vivado自带的仿真器XSim足够应对中小规模设计。5.1 编写测试平台TestbenchTestbench本质上也是一个HDL模块但它不给FPGA运行只给仿真器运行。它的任务是产生激励信号时钟、复位、按键模拟等并施加到我们的设计DUT, Device Under Test上然后观察输出。 根据原作者的代码一个简单的测试平台骨架如下我将其补充完整并添加了注释library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity myDesignTB is -- 测试平台通常没有端口 end myDesignTB; architecture testbenchBeh of myDesignTB is -- 定义与设计顶层连接的所有信号 signal sysclk_tb : std_logic : 0; -- 时钟初始为0 signal eingang1_tb, eingang2_tb : std_logic : 0; -- 按键输入初始为0 signal ausgang1_tb, ausgang2_tb : std_logic; -- LED输出用于观察 signal led0_b_tb : std_logic; -- RGB LED输出 signal led0_tb, led1_tb, led2_tb, led3_tb : std_logic; -- 四位LED输出 -- 声明设计顶层组件必须与Wrapper文件中的实体名一致 component design_1_wrapper is port ( sysclk : in STD_LOGIC; eingang1 : in STD_LOGIC; eingang2 : in STD_LOGIC; ausgang1 : out STD_LOGIC; ausgang2 : out STD_LOGIC; led0_b : out STD_LOGIC; led0 : out STD_LOGIC; led1 : out STD_LOGIC; led2 : out STD_LOGIC; led3 : out STD_LOGIC ); end component; begin -- 实例化被测设计 dut: design_1_wrapper port map ( sysclk sysclk_tb, eingang1 eingang1_tb, eingang2 eingang2_tb, ausgang1 ausgang1_tb, ausgang2 ausgang2_tb, led0_b led0_b_tb, led0 led0_tb, led1 led1_tb, led2 led2_tb, led3 led3_tb ); -- 进程1生成12MHz时钟周期83.33ns占空比50% clkGen : process begin sysclk_tb 0; wait for 41.665 ns; -- 半周期 sysclk_tb 1; wait for 41.665 ns; -- 半周期 end process; -- 进程2模拟按键2的按下行为 -- 假设按键按下为高电平1释放为低电平0 setEingang2 : process begin eingang2_tb 0; -- 初始释放状态 wait for 150 ns; -- 等待一段时间 eingang2_tb 1; -- 模拟按下 wait for 1 us; -- 按下持续1微秒实际按键时间很长这里为仿真速度考虑 eingang2_tb 0; -- 释放 wait for 200 us; -- 等待200微秒 -- 可以再模拟几次按键用于测试计数器或FIFO eingang2_tb 1; wait for 1 us; eingang2_tb 0; wait; -- 永远等待结束进程 end process; -- 进程3可以模拟按键1或者添加其他激励 -- setEingang1 : process ... end process; -- 进程4结束仿真的条件可选 -- 例如仿真运行到一定时间后自动停止 stop_sim : process begin wait for 500 us; -- 仿真运行500微秒 assert false report Simulation finished successfully. severity note; std.env.stop; -- VHDL-2008语法停止仿真环境 -- 如果工具不支持std.env可以用 assert false severity failure; 来强制停止 wait; end process; end testbenchBeh;5.2 运行仿真与分析波形在Vivado中将上述Testbench文件作为“Simulation Sources”添加到工程中。在“Flow Navigator”的“Simulation”下点击“Run Simulation” - “Run Behavioral Simulation”。Vivado会自动编译设计和Testbench然后打开仿真器窗口和波形窗口。在波形窗口中添加你需要观察的信号所有顶层端口和内部关键信号。通过运行F8或工具栏按钮你可以看到信号随时间的变化。关键检查点时钟sysclk_tb是否以83.33ns的周期稳定翻转按键响应当eingang2_tb变为高电平时计数器输出led0_tb..led3_tb是否递增FIFO状态信号ausgang1_tb(full) 和ausgang2_tb(empty) 是否随之变化逻辑关系LED显示的二进制数是否符合计数器累加的预期当FIFO写满后ausgang1_tb是否拉高仿真避坑技巧初始化问题在Testbench中给输入信号赋予初始值如: 0可以避免仿真开始时出现未知状态U。仿真时间对于包含时钟的设计仿真时间单位设置很重要。确保wait for语句中的时间单位ns, us与你的时钟周期匹配。使用IEEE.STD_LOGIC_TEXTIO和IEEE.STD_LOGIC_ARITH等库可以方便地打印调试信息。观察内部信号如果需要在波形中观察Block Design内部IP核的信号需要在仿真设置中勾选“log all signals”或在仿真运行时在仿真器的“Scope”窗口中找到对应的IP核实例将其信号拖到波形图中。6. 综合、实现与上板调试仿真通过后我们就可以将设计放到真实的FPGA中运行了。这个过程包括综合Synthesis、实现Implementation和生成比特流Generate Bitstream。6.1 综合Synthesis点击“Run Synthesis”或按F11。综合器通常是Vivado自带的Vivado Synthesis会将你的HDL代码包括Wrapper文件转换成由FPGA基本逻辑单元查找表LUT、触发器FF等和块RAM、DSP等资源构成的网表Netlist。这个网表是逻辑功能的抽象表示还没有对应到具体的芯片位置。综合报告综合完成后务必查看综合报告。关注以下几点资源利用率查看LUT、FF、BRAM、DSP的占用百分比。对于这个小设计占用率应该极低1%。如果异常高可能代码有冗余循环或未优化的结构。时序估算报告会给出一个初步的时序评估主要是建立时间Setup Time。此时因为还没有布局布线这个时序并不准确但如果有严重违例如逻辑层级太深可以提前发现。警告信息仔细阅读警告Warnings。有些警告可以忽略如某些IP核的未连接端口但有些可能暗示潜在问题如多驱动源、锁存器推断等。6.2 实现Implementation综合成功后点击“Run Implementation”。实现过程包括翻译Translate、映射Map和布局布线Place Route三个子步骤。翻译将综合后的网表与约束文件合并生成一个初始的设计数据库。映射将设计中的逻辑门和寄存器映射到目标FPGA芯片的特定资源如将某个逻辑功能映射到一个LUT6上。布局布线这是最复杂的一步。布局决定每个逻辑资源在FPGA硅片上的物理位置布线则用芯片内部的连线资源将这些布局好的单元连接起来。工具的目标是满足所有时序约束同时优化功耗和面积。实现后报告实现完成后必须仔细查看时序报告Timing Report。重点关注“Setup”和“Hold”时间是否满足显示为“Met”。如果出现“Timing NOT Met”说明你的设计在当前约束下跑不到12MHz在这个简单项目中几乎不可能但复杂设计常见。你需要分析关键路径考虑是否添加流水线、优化逻辑或放松时钟约束。6.3 生成比特流与硬件编程实现时序满足后就可以生成比特流了。生成比特流点击“Generate Bitstream”。这个过程会将布局布线后的设计转换成FPGA配置存储器通常是SRAM可以加载的二进制文件.bit文件。这个过程也会进行最后的优化和校验。硬件连接用JTAG下载线如Digilent USB-JTAG连接开发板和电脑。确保驱动已安装Linux下如前文所述。打开硬件管理器在Vivado中点击“Open Hardware Manager”。点击“Open Target” - “Auto Connect”。如果一切正常应该能识别到你的FPGA设备例如xc7a15t_0。编程设备右键识别到的设备选择“Program Device”。在弹出的对话框中找到并选择刚刚生成的.bit文件路径通常为项目目录/项目名.runs/impl_1/design_1.bit。点击“Program”。观察现象编程完成后FPGA会立刻运行你的设计。此时尝试按下开发板上的按键对应eingang2观察LED灯的变化。四个LED应该以二进制形式递增。同时根据你的设计FIFO满或空的状态指示灯也应该相应亮起。6.4 上板调试常见问题排查如果上板后没有反应按以下顺序排查电源与连接确保开发板供电正常JTAG连接牢固。有时需要按一下开发板的复位键。约束文件这是最常见的问题源。再次核对XDC文件中的引脚编号是否与原理图100%一致。检查LED是高有效还是低有效逻辑设计是否与之匹配例如约束是低有效但你的代码输出1想让灯亮那就错了。时钟约束确认create_clock的周期与板上实际晶振频率一致。12MHz晶振周期就是83.33ns。如果填错时序分析会错可能导致功能异常。内部逻辑用Vivado的“Debug Core”ILA集成逻辑分析仪功能。在综合前将需要观察的内部信号如计数器输出、按键消抖后的信号标记为调试探头。生成比特流并编程后可以在硬件管理器中触发和捕获这些信号的实时波形就像在芯片内部放了一个示波器。这是定位复杂问题的终极利器。按键消抖原设计可能没有考虑按键消抖。机械按键在按下和释放时会产生一段时间的抖动多个快速的通断这会被FPGA误认为是多次按压。一个简单的消抖方法是用系统时钟采样按键信号经过一个约20ms的移位寄存器或计数器当连续采样到多次相同电平时才认为状态稳定。这是一个非常重要的实战技巧在后续项目中必须加入。7. 项目总结与扩展思考通过这个基于Artix-7和Vivado Block Design的LED计数器项目我们走完了一个完整的FPGA开发流程从环境搭建、约束编写、图形化设计、仿真验证到最终的上板调试。这个过程看似简单却涵盖了FPGA开发的核心概念和工具链使用。我个人在反复操作中最大的体会是约束文件是硬件开发的“地图”而仿真是确保不迷路的“指南针”。很多初学者急于上板看现象忽略了约束和仿真结果在调试时浪费大量时间在排查低级错误上。务必养成“编写约束 - 功能仿真 - 综合实现 - 时序仿真/分析 - 上板”的规范流程习惯。这个项目可以轻松地扩展增加功能将二进制显示改为十进制通过七段数码管或LCD显示。加入更多的按键控制模式如清零、暂停、加减计数。优化设计为按键添加消抖模块可自己用HDL写也可用IP核。使用更高效的计数器IP或者用VHDL/Verilog自己编写带使能、同步清零、加载功能的计数器。探索更多IP尝试使用Clocking Wizard IP来生成不同频率的时钟用Pmod IP核来控制外部Pmod模块或者尝试使用MicroBlaze软核处理器来构建一个简单的片上系统SoC。Block Design的强大之处在于模块化和复用。当你把按键消抖、时钟分频、显示驱动等功能都封装成独立的IP核后未来做新项目时就可以像搭积木一样快速构建系统这正是现代FPGA设计提高效率的方向。希望这个详细的实战记录能帮你打下扎实的基础少走些弯路。

相关新闻