ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FPGA设计流程全解析:从RTL仿真到时序收敛的工程实践

FPGA设计流程全解析:从RTL仿真到时序收敛的工程实践 fpga设计流程最容易被新手误以为是“写代码然后下载到板子上”两件事。实际上从拿到需求到板级稳定运行中间要经过需求拆解、芯片选型、RTL设计、功能仿真、逻辑综合、布局布线、时序收敛、上板调试等多个阶段。任何一个环节漏掉都可能导致仿真正常但硬件不工作。这篇内容不围绕某个具体型号的开发板讲而是给出一套在主流工具链下都能套用的流程骨架重点回答三个问题每一步要做什么、产出什么、哪些坑最常出现。如果你是 fpga 入门阶段已经能写一些 Verilog 模块但始终没有跑完一条完整工程链路或者你已经做过简单实验但不清楚综合、实现、时序约束这些东西为什么存在这篇文章可以按顺序完整看一遍。文章会包含设计流程全景表、典型代码示例、约束文件示例、自动化脚本示例、常见报错排查清单内容偏工程实操而不是讲概念。整条链路不是线性的“做完就结束”而是一个需要反复迭代收敛的过程理解这一点比记住某个按钮更重要。1. fpga设计流程全景与核心能力速览FPGA 开发与传统软件开发最大的区别在于硬件逻辑描述的是并行电路工具链会把 RTL 代码映射成实际可用的 LUT、触发器、BRAM、DSP 等资源。设计流程的最终产物不是可执行文件而是比特流文件它描述 FPGA 内部的连接关系。因此流程的每一步都围绕“让代码在真实器件上稳定运行”这一目标展开。流程阶段主要工作核心交付物典型工具需求与规格定义明确接口、时钟、功耗、资源目标设计文档、接口清单文档、电子表格FPGA 选型判断逻辑资源、IO 数量、高速接口能力选型报告厂商选型工具开发环境搭建安装工具链、配置许可证、准备模型文件可运行工程模板Vivado / Quartus / 开源工具链RTL 设计与编码编写功能代码遵守可综合风格.v / .vhd 源码文本编辑器、IDE功能仿真验证逻辑行为是否符合预期仿真波形、Testbench仿真器逻辑综合将 RTL 映射为逻辑门级网表综合后网表、资源报告Vivado / Quartus布局布线将网表映射到实际器件资源布线结果、时序报告Vivado / Quartus时序约束与收敛确保时钟和路径满足时序要求XDC/SDC 约束、时序报告工具内时序分析器板级调试下载验证、在线观测信号比特流文件、调试波形下载器、逻辑分析仪验证与发布批量测试、记录版本、归档版本包、测试报告脚本、版本管理工具其中最容易造成认知断层的是“综合”和“实现”这两步。综合负责把 RTL 转化为 FPGA 底层逻辑单元实现负责把这些逻辑单元放到真实的坐标位置上并连接起来。很多初学到 fpga 时序约束 阶段才发现自己写的代码虽然能仿真但在布局布线后因为不满足建立时间要求而导致系统偶发异常就是这个认知断层造成的。从执行方式来看设计流程既可以使用图形界面逐步操作也可以通过脚本完全自动化。实际工程中图形界面适合观察时序报告和资源利用情况脚本适合回归测试和批量构建。一个成熟工程应该同时支持这两种方式而不是完全依赖鼠标点击。2. 适用场景与流程选择FPGA 设计流程适合解决四类问题第一类是接口转换与协议桥接例如 UART、SPI、I2C、PCIe、HDMI、MIPI 等接口之间的互通第二类是实时信号处理例如 FPGA 图像处理、雷达信号预处理、无线通信中的滤波和调制第三类是高速数据采集与输出需要利用 FPGA 的并行 IO 和高速收发器第四类是硬件加速把计算密集型任务卸载到可编程逻辑上。相关 fpga 项目中接口类项目占据了非常大的比例因为 FPGA 最核心的能力就是灵活连接不同协议和不同速率的设备。如果项目需要大量复杂软件生态支持比如跑 Linux 应用、训练神经网络模型、处理动态内存分配FPGA 并不是首选方案。虽然 FPGA 内部可以集成软核处理器或硬核处理器但高效完成这类任务通常更适合 CPU、GPU 或专用芯片。另外如果产品出货量很大且逻辑固定ASIC 流片在单位成本上更有优势FPGA 的价值主要体现在“需要灵活修改硬件逻辑”“研发周期短”“中小批量生产”这些场景中。在流程选择上也要区分不同公司的工程习惯。有的团队要求每个模块先写独立 Testbench功能仿真全部通过后再做顶层集成有的团队更倾向于先搭建硬件环境通过在线逻辑分析仪直接在板级调试。主流做法是“前仿真 上板调试”并重仿真不通过绝对不综合上板有异常时优先用内部逻辑分析仪观测信号而不是靠眼睛看现象猜测问题。fpga 设计流程中仿真并不是为了应付差事而是帮你把抽象的数据通路具象化。另外需要提醒的是很多 FPGA 工程会使用第三方 IP 核或者从 GitHub 等渠道获取开源代码。使用这些内容前必须确认许可证是否允许商用或修改涉及芯片选型时也要确认器件是否符合出口管制要求。尤其在通信、医疗、工业控制等对安全性要求高的领域必须严格评估 IP 来源和授权边界不能为了赶进度直接拿未授权代码做产品。3. fpga本地开发环境准备与选型FPGA 开发环境主要分商业工具链和开源工具链两类还要区分这些平台不同的系统支持策略。下面是通用的准备思路具体版本号会持续更新实际下载以官方资源为准。3.1 商业工具链Xilinx/AMD 的 Vivado 和 ISEIntel/Altera 的 Quartus Prime 是多数 fpga 开发者会接触到的环境。选择哪家工具通常由选用的 FPGA 芯片决定。准备工具链前先做以下几件事确认操作系统版本多数版本的 Vivado / Quartus 支持 Windows 和 Linux但不同版本对系统版本的要求不同。申请许可证。商业工具通常需要 license 文件可能需要联网获取或者配置 license server。预留磁盘空间。一套完整工具链安装后占据的空间很大SSD 剩余空间不足会造成安装失败。确认所需的器件支持包。如果安装时没有勾选目标芯片型号后续需要追加安装费时费力。如果使用 Linux 服务器一定要检查用户权限、共享存储和防火墙设置开发服务器通常不适合用 root 直接跑图形界面。如果你做 FPGA 入门实验可以先用学校或公司已经搭好的环境不要一上来就追求安装最新版本。工具链版本与芯片型号有匹配关系新版本不一定支持老芯片旧版本也不一定支持新芯片。不同版本之间的工程文件兼容性也有限工程中经常遇到的“版本打不开”就是这么来的。3.2 开源工具链开源生态中Yosys 负责逻辑综合nextpnr 负责布局布线IceStorm 等项目针对特定 FPGA 芯片族还有 GHDL 和 Verilator 等仿真工具。开源工具链非常适合学习 fpga 设计流程 和跑一些中小规模实验但支持范围明显不如商业工具全面使用前应该查询目标器件是否在支持列表中。如果是纯 Linux 环境且处理器架构是 ARM需要先确认厂商工具是否提供对应支持有些工具链在 x86_64 环境下运行正常在 ARM 主机上只能做交叉仿真不能直接布线。4. fpga从RTL设计到工程创建的实施步骤在你写第一行 Verilog 之前先把接口定义清楚。例如要做一个按键消抖模块你需要明确时钟频率是 50MHz 还是 100MHz按键按下是高电平还是低电平有效消抖时间要覆盖多少毫秒输出是单周期脉冲还是持续电平。这些信息决定代码结构也会影响后续的仿真测试用例设计。下面用一个简单的输入信号边沿检测模块来演示标准流程模块功能是在 clk 上升沿采样 din当检测到 din 从低到高跳变时dout 输出一个周期的高脉冲。module edge_detect ( input wire clk, input wire rst_n, input wire din, output reg dout ); reg din_dly1; reg din_dly2; always (posedge clk or negedge rst_n) begin if (!rst_n) begin din_dly1 1b0; din_dly2 1b0; end else begin din_dly1 din; din_dly2 din_dly1; end end always (posedge clk or negedge rst_n) begin if (!rst_n) begin dout 1b0; end else begin dout din_dly1 (~din_dly2); end end endmodule这段代码采用了两级寄存器同步的方式完成边沿检测属于可综合代码。如果写成#10延时、initial语句内部赋值给寄存器或者使用循环做不可展开的复杂操作综合工具往往会报错或者额外占用大量逻辑资源。写代码时要时刻想着“这段逻辑会生成怎样的电路”而不是只想着仿真能不能出结果。4.1 创建工程与添加源文件以使用三进制组织的工程结构为例我先创建一个子模块文件edge_detect.v。在有图形界面的工具中新建工程时需要选择目标 FPGA 型号这一步最好与你的开发板对应不能用默认任意型号替代。选错芯片会导致引脚分配时报错甚至逻辑资源不够。工程创建完成后添加源文件的方式也很多既可以通过工具面板添加也可以预先在磁盘上创建文件然后用add_files命令加入工程。从工程维护角度我建议用脚本维护源代码文件列表因为手工添加文件容易漏加而且在多版本工具之间迁移时写代码更可控。# 通用 Vivado 批处理流程示例具体路径按实际工程调整 create_project proj_edge ./proj_edge -part xc7a35tcsg324-1 add_files ./src/edge_detect.v read_xdc ./constraints/edge_detect.xdc launch_runs synth_1 -jobs 4 wait_on_run synth_1 open_run synth_1 report_utilization -file ./reports/usage.rptTcl 脚本的价值在于“把流程用文本固化下来”。当你需要换一台电脑重新编译工程或者跑回归测试时不需要重新点击几十次图形界面直接执行脚本即可。不同 FPGA 流程的脚本书写风格有差异但核心命令都围绕工程创建、添加源文件、综合、布线、生成比特流这几个动作展开。4.2 功能仿真写完 RTL 后不能跳过 Testbench 直接上板。一个合格的 Testbench 至少包含时钟产生、复位时序、激励输入和结果检查。下面是针对edge_detect模块的简单仿真代码示例。timescale 1ns / 1ps module tb_edge_detect(); reg clk; reg rst_n; reg din; wire dout; edge_detect u_edge_detect( .clk(clk), .rst_n(rst_n), .din(din), .dout(dout) ); initial clk 0; always #10 clk ~clk; initial begin rst_n 0; din 0; #100; rst_n 1; #100; din 1; #40; din 0; #200; din 1; #80; din 0; #500; $stop; end endmodule这段 Testbench 关注的是“边沿检测脉冲是否在正确位置出现”。运行仿真后你会看到din从 0 跳变到 1 之后经过两个周期的短延迟dout输出一个时钟周期的高电平。如果你的模块内部寄存器级数和这里不同脉冲相对输入的延迟也会不同。在 fpga 设计流程 中对仿真结果做具体检查非常关键。初级工具使用者在跑完仿真后通常只确认“有没有波形”这不够正确的做法是通过 Testbench 里的自动比较判断输出是否符合预期。仿真的常见坑不在写 Testbench 本身而在“激励时序没有考虑建立保持时间”。如果使用#2等任意延时在非时钟沿附近前改变din仿真结果可能与综合后的实际行为不一致。更稳妥的方式是让din的变化发生在时钟沿之后一小段时间或者使用(posedge clk);之后再给激励避免代码出现不可综合的冒险。4.3 综合与资源报告功能仿真通过之后可以启动综合。综合工具会把 module 转换成 LUT、FF、RAM 和 DSP 的映射结果。综合完成后需要看三份报告第一份是资源利用率报告观察 LUT、FF、BRAM、DSP 占用比例第二份是综合日志搜索 warning 和 error重点看有没有信号被优化掉、有没有产生锁存器的提示第三份是 I/O 端口报告确认所有顶层端口都被正确保留。如果某个内部信号被综合工具优化掉但你在调试时又希望观察它就要在代码中添加(* keep true *)这样的综合属性或者使用调试工具中提供的 debug 标记。很多上板后无法观测信号的问题都是因为信号在综合时被常量传播优化了。综合完成的只是“逻辑关系正确”的网表还没决定每种逻辑放在器件的哪个位置。接下来是布局布线。布线完成后要检查有没有布线拥塞和时序违例如果出现大量 routing congestion通常是因为某个区域的逻辑过于密集或者代码中出现了不均匀的宽总线结构。4.4 引脚约束与时序约束约束文件是连接设计和物理器件的关键环节。顶层信号必须对应到具体管脚还必须给出时钟频率约束。以 Xilinx 系列 FPGA 为例约束文件扩展名通常是 XDC。一个典型的约束内容如下。create_clock -period 20.000 -name clk [get_ports clk] set_property PACKAGE_PIN Y9 [get_ports clk] set_property IOSTANDARD LVCMOS33 [get_ports clk] set_property PACKAGE_PIN T10 [get_ports din] set_property IOSTANDARD LVCMOS33 [get_ports din] set_property PACKAGE_PIN T9 [get_ports dout] set_property IOSTANDARD LVCMOS33 [get_ports dout]如果你手里只有电路原理图引脚号不能凭空猜测必须根据板卡原理图查清 FPGA 管脚命名和对应的电平标准。插错引脚很难直接烧毁芯片但会占错通道或导致接口电平不匹配。最容易忽略的是“时钟约束”这件事。工程里如果忘了create_clock时序工具会认为所有路径不受时钟约束报告里看起来没有违例实际电路却可能因为建立时间不足而随机出错。fpga 时序约束 不是可有可无它是把设计变可靠的必要输入。引脚分配后运行布局布线。如果时序违例例如建立时间裕量为负值首先要做的不是随便改代码逻辑而是检查代码中的组合逻辑链是否过长、关键路径是否经过了太多级联的 LUT以及时钟约束周期是否与实际时钟频率一致。再用工具里的时序报告定位到违例路径判断是跨时钟域问题、路径过长、扇出过高还是布局位置不合理。5. 功能测试与上板验证FPGA 的最终交付必须有板级验证。比特流文件生成后使用下载器把程序写入 FPGA这一步通常会在上位机软件中触发。下载成功后先确认板卡主时钟是否起振、复位按键的电平是否与代码预期一致。很多初学者把复位接反导致整个模块一直处于复位状态却误以为代码逻辑有问题。上板测试要用可观测的中间信号做判断。如果你的设计只是点亮一个 LED那可以直接观察如果设计内部有复杂状态机或数据总线不能只靠猜测需要使用工具集成的逻辑分析仪例如 Vivado 的 ILA实时捕获信号。添加 ILA 有几种不同路径可以在代码中实例化一个调试 IP也可以综合后使用标记调试。后者更灵活不用改代码只需要在综合设置中添加需要观测的信号然后布局布线时自动插入观测逻辑。# 通过 Tcl 增加调试探针的示意命令具体功能以工具版本为准 set_property MARK_DEBUG true [get_nets {dout din_dly1 din_dly2}]上板后的交互节奏通常是这样的先触发一次采集下载抓取信号如果波形与预期不符回看 RTL分析是异步问题还是状态机跳转问题修改代码后重新做仿真仿真通过后再综合布线再一次进行板级验证。这个过程需要回归所以建议把每一轮修改都记到工程日志里否则很容易出现“仿真和上板对不上但又不知道哪次改动引起的”这种麻烦。如果把功能测试当作批处理任务来管理可以把多个测试场景写成一个集成 Testbench或者用脚本统一控制比特流生成和下板命令。对于 FPGA 上板流程batch 模式的回归并不是像软件测试那样每次都能自动运行所有用例但至少可以实现“每晚自动跑一遍所有仿真用例并汇总日志”这能在早期发现百分之八十的回归错误。6. 自动化批处理与工程接口能力很多人在学习 fpga设计流程 时只记得图形界面按钮到了工作上需要提交服务器批量跑综合时就开始卡住。这里要区分两个层面的接口一个是工具的命令行和 Tcl 脚本另一个是设计内部模块之间的接口规范。无论是哪种目的都是让流程可控和可重复。工具层面商业 FPGA 软件普遍支持脚本驱动。比如 Vivado 支持-mode batchQuartus 支持命令行quartus_map、quartus_fit、quartus_asm等命令组合。把脚本写好后多个版本工程、不同约束文件的测试可以统一用配置文件管理。下面是一段更完整的批处理思路# 通用批处理流程示意图 # 实际需要先切换到对应工具的环境变量再调用工具命令 vivado -mode batch -source ./scripts/synth_flow.tcl在批处理中要特别关注退出码。因为综合一个工程通常耗时较长如果在 batch 模式中跑挂了日志末尾不一定有明显错误关键词。建议在每一条关键运行命令后检查是否有ERROR再结合工具返回码决定是否继续执行而不是盲目串联所有命令。设计层面的“接口能力”是指工程中各模块间要有清晰的总线规范。即使不依赖 AXI 等高级协议模块间也应该自己约定好握手信号。很多 FPGA 工程的复杂度不是单个模块逻辑复杂而是模块之间的时序关系不清晰A 模块在 B 模块信号有效之前就开始采样或者跨时钟域信号没有打拍处理。AXI 之类的标准化接口不是必须的但是在 fpga 项目中如果数据交互相对复杂尽可能先参考统一接口协议会显著减少对接成本。7. 资源占用与性能观察方法FPGA 没有像 GPU 那种“显存占用”的概念但同样存在资源占用问题。每次综合后都应该观察三类指标逻辑资源利用率LUT/FF/BRAM/DSP、布线成功率和时序裕量。这些指标决定一个 RTL 代码能否在给定器件上稳定运行也为后续选型提供判断依据。在查看资源报告时不能只看 LUT 用了百分之多少。有些模块 BARM 占比上升明显是因为综合器把小型内存实现方式从分布式 RAM 调整成了 BRAM有些模块 LUT 大量被用做移位寄存器也会影响整体功耗。要结合模块对应的数据通路宽度、存储深度、算法结构来分析。例如DDR 等复杂接口的读写控制逻辑通常占用较多状态机资源和 IO 逻辑不能只看存储器容量。性能观察要区分几个层次寄存器到寄存器路径的时序裕量是衡量设计能否被“留有余量”运行的标准输入输出路径的约束通常不够精确这需要结合具体板级连接时机分析跨时钟域路径如果没有做同步处理在时序报告中可能并不崩溃但在温度和电压变化下偶发错误时钟资源占用是另一个容易忽视的问题多数中小规模设计只用单一时钟网络但多时钟设计里要关注每个时钟域是否跑在建议频率范围以内。优化资源的关键思路是不要过早做手工优化。代码写完先跑综合由工具报告决定瓶颈如果关键路径过长第一步是检查触发器之间组合逻辑的层级第二步是插入流水线或者修改算法结构第三步才是使用 Pblock 之类的位置约束。不要一上来就到处加流水线寄存器那样会让代码难以阅读而且可能影响功能。8. fpga设计流程常见问题与排查方法下面列出 fpga 开发环境中最常碰到的几类问题和对应处理思路。这些经验既包括 RTL 编写阶段也包括综合、布线、上板阶段。问题现象可能原因排查方式解决方案功能仿真正常上板后输出不变复位极性定义反了、引脚约束错误、时钟未起振检查原理图、约束文件和 ILA 信号修正复位逻辑用 ILA 抓取复位与时钟信号确认综合报告显示信号被优化掉输出信号未被使用或常量传播搜索综合 warning 信息增加 keep 属性或者在 Debug 中标记该信号布线后时序违例保持时间为负组合逻辑链过长、时钟偏斜过大查看时序报告定位关键路径在路径中插入触发器、优化组合逻辑或调整布局两个模块仿真时数据对不上接口时序没有统一约定或存在亚稳态在模块间波形上比较数据有效信号增加握手信号或标准总线接口添加跨时钟域同步上板后功能偶尔正常偶尔异常跨时钟域信号未经同步排除软件逻辑观察异常出现规律对跨时钟域信号打拍或使用异步 FIFO下载器连接不上 FPGA驱动未安装、硬件复位不正常、JTAG 链路中断查看系统设备管理器确认下载器枚举是否正常重装驱动检查排线连接和电源上电顺序布局布线后资源使用严重超标代码生成了大量锁存器、切片利用率高查看资源报告中 Log 类资源检查 if/case 分支是否完整避免无意的 latch只改几行代码重新综合后结果变化很大代码风格不稳定、工具版本不同对比两版资源及时序报告统一代码风格使用脚本固定综合策略如果遇到“仿真过了但上板没反应”最优先排查的不是改功能代码而是确认约束和时钟是否可靠。先用逻辑分析仪抓内部信号判断是信号没到、复位没有释放还是状态机没有正确跳转。FPGA 设计流程里定位问题需要逐层缩小范围引脚到寄存器寄存器到内部逻辑内部逻辑到输出引脚每一段都能单独验证。如果你把前一个模块的输出直接引到一个测试引脚用示波器看波形就能确定到底是哪一层出现了异常。另外fpga时序违例 不只是工具报告里一个红色数字那么简单。当工艺、电压和温度发生变化时同一段代码在不同批次芯片上的表现可能差异很大。出现负裕量后必须修复不要靠“板子当前能跑”来认为工作已完成。9. 工程化最佳实践与合规提醒第一个建议是每个工程都要建立一套最小可运行配置。所谓最小可运行是指代码中只保留最基本的模块、一个可访问的输出接口和一个可观测的测试点先用这版配置跑通下载链路上的所有软件和硬件交互再逐步补充新功能。很多团队在项目初期就把几十个模块同时放进工程一旦出现问题很难判断是哪个模块引起的。第二个建议是把源文件、约束文件、脚本、仿真文件、器件型号说明、工程版本、已知问题集中放在一个版本管理仓库里。每次综合和上板验证都要保留日志至少记录综合时间、工具版本、器件型号、结果状态。这样在对比不同优化手段时才有依据也可以保证在你出差或换电脑后仍能重新构建。第三个建议是用脚本定住构建过程。虽然图形界面很方便但它是“增量操作”无法完整记录每一步的状态。建议在一开始写一个核心流程脚本后续从添加源文件到生成比特流都先尝试用脚本跑一遍保持至少每周能完整执行一次 clean 构建。自动化流程看起来前期耗时但到了需要一次批量跑很多个相关模块时就非常划算。第四个建议是代码里要有清晰的复位策略和时钟域管理。同步复位和异步复位的实现差别不只是语法更关乎 STA 结果和芯片内部复位释放时序。如果设计内既有软核处理器又有外设逻辑可靠复位策略非常影响系统启动。跨时钟域要统一打拍策略或使用异步 FIFO跨时钟域处理不当导致的问题是仿真很难覆盖、现场很难复现的那一类。第五个建议重视仿真覆盖但也不要迷信仿真。仿真的价值在于验证逻辑意图正确而物理层面问题比如信号完整性、驱动能力、时序收敛只能靠板级验证去覆盖。在改动接口、引脚约束、高速收发器相关配置后要注意报错信息是否指向布线或时序同时确认板级硬件是否满足对应电平标准。涉及 DDR 等高速接口时要关注读写校准过程和调试报告涉及 MIPI、PCIe、HDMI 等协议接口时要提前确认参考时钟和复位时序。合规与授权方面需要反复提醒凡是使用任何 IP、参考代码、芯片资料都要先确认授权范围。商业工具和对应工艺库文件一般不允许在未授权环境中传播开源 IP 核可能有自己的许可证约束使用第三方代码做产品前要弄清楚是否允许商用。涉及采集人脸、指纹、车牌等信息的 fpga应用要在源头上确认数据授权和处理边界涉及通信设备、加密算法、军工或敏感行业的项目更必须遵守当地法律法规并严格走合规审批不要自行绕过限制。10. 总结与下一步方向把 fpga设计流程完整走一遍并不需要掌握多少高深理论。先定需求、选型号、建工程、写代码、做功能仿真、加引脚和时钟约束、综合布线、上板调试这个顺序不能乱。最容易踩的坑不是语法而是跳步把仿真通过了当成一切正常忽略时序收敛和板级信号质量或者不做功能仿真直接上板遇到问题只能靠反复改代码碰运气。如果你是 fpga 入门学习者下一步建议按顺序做三个小实验作为自测第一写一个按键控制的呼吸灯或流水灯把输入输出引脚约束完整跑一遍第二把几个模块用标准握手信号组织在一起并通过仿真验证接口时序第三故意在测试工程中加入一个跨时钟域信号看它在不同场景下的表现理解亚稳态为何需要同步处理。这三个实验做完你对整个 fpga设计流程 的把控会比只看教材牢固很多。如果你是工程经验较少的中级开发者下一阶段可以重点研究时序约束和接口协议例如 PCIe 的 TLP 包处理、DDR 读写控制、HDMI 输出时序这些协议都依赖稳定可靠的底层流程支撑。之后去官方文档中翻看具体对应工程的时序报告和 pin selection效率会比听别人零散讲经验高得多。真正完整跑过几次 fpga 工程后建议把常用流程整理成自己的模板形成标准化的工程结构之后再切入更复杂的 fpga应用领域时会轻松不少。
返回列表