简介:一套开箱即用的FPGA数字电路实验工程,实现标准四位异步二进制计数功能,计数范围0–15循环,输出4位总线q[3:0]。核心模块cnt_yb采用纯Verilog编写,支持上升沿时钟驱动与低电平异步复位;各级触发器级联方式为典型异步结构——q[0]由主时钟clk触发,q[1]~q[3]分别由前一级输出信号的上升沿触发,真实反映异步计数器的传播延迟与毛刺特性。工程已预配置Quartus II开发环境所需全部文件:项目工程文件(.qpf、.qsf)、波形仿真激励与结果(.vwf、.sim.cvwf、.waveform.vcd)、综合与布局布线报告(.map.rpt、.flow.rpt、.map.summary)、编译中间产物目录(db、incremental_db、compiled_partitions等),无需额外配置即可完成全流程编译、仿真与下载验证。适用于高校数字逻辑实验、FPGA入门实践、课程设计参考及硬件时序行为分析教学场景。
1. 项目概述:为什么一个“能直接编译的异步计数器”值得你花十分钟读完
在FPGA数字电路教学和入门实践中,异步计数器几乎是绕不开的第一个“真硬件”实验。它不像同步计数器那样所有触发器共用一个时钟,而是让低位翻转产生的边沿去触发高位——这种结构天然暴露了真实硬件中的传播延迟、竞争冒险和毛刺问题。但问题来了:很多网上找来的Verilog代码,要么只给个.v文件,你得自己建工程、配引脚、写测试平台;要么仿真波形是截图,根本没法复现;更常见的是,代码里用了非标准语法(比如always @(posedge clk or negedge rst_n)里混了assign赋值),在Quartus里一编译就报错,新手卡在第一步,信心直接归零。
这个资源包解决的,就是“从打开Quartus到看到正确波形,中间不踩坑”这件事。它不是一个教学PPT,也不是一段教科书式代码,而是一个完整、可验证、可复现的工程实体。我把它比作“数字电路世界的乐高套装”:所有零件(源码、约束、仿真激励、报告)都已按标准接口拼装好,你只需要把电源(Quartus II 13.0 SP1或更高版本)接上,按下“Start Compilation”,就能亲眼看到q[0]~q[3]如何像多米诺骨牌一样逐级翻转——而且你能清晰地在波形图里量出q[1]比q[0]晚多少纳秒翻转,q[2]又比q[1]晚多少,这才是异步逻辑最本真的模样。
关键词里的“异步计数器”不是指“不着急做”,而是指触发方式的物理本质;“Verilog工程”强调它不依赖任何IP核或图形化工具,纯文本、可审计、可修改;“Quartus工程”意味着它已经通过了Quartus的语法检查、综合、布局布线全流程,连.qsf引脚约束文件都预设好了DE1-SoC或Cyclone IV E开发板的常用IO;“四位二进制计数”对应0–15循环,输出总线q[3:0],这是数字系统中最基础的状态编码单元;而“FPGA实验”则点明它的归宿——它不是为仿真而生的玩具,而是为真实硬件下载、观测、调试准备的。如果你正在带数字逻辑实验课,或者刚拿到一块FPGA开发板却对着空白工程发愁,又或者想亲手验证“为什么异步计数器会产生毛刺”,那这个包就是你今天最该保存下来的那个。
2. 核心设计思路与异步逻辑的本质解构
2.1 异步 vs 同步:不只是“谁管谁”的问题,而是“谁等谁”的物理现实
先说清楚一个常被误解的概念:很多人以为“异步计数器”只是“不同步”,其实它的核心在于触发源的物理分离。在同步计数器里,所有D触发器的时钟端(CLK)都连在同一个clk信号上,它们的翻转动作在理论上是同一时刻发生的(忽略布线延迟)。而在异步计数器中,只有最低位q[0]的CLK接主时钟clk,而q[1]的CLK接的是q[0]的输出,q[2]的CLK接q[1]的输出,q[3]的CLK接q[2]的输出。这意味着,q[1]的翻转永远要等q[0]完成一次翻转并稳定输出之后才能开始——这个“等待”,就是由触发器本身的传播延迟(t_pd) 决定的,通常在几纳秒到十几纳秒量级。
我们来看cnt_yb.v里的关键片段:
// q[0]:直接由主时钟驱动
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q[0] <= 1'b0;
else
q[0] <= ~q[0];
end
// q[1]:由q[0]的上升沿驱动(注意:这里q[0]是q[0]的输出,不是内部寄存器名)
always @(posedge q[0] or negedge rst_n) begin
if (!rst_n)
q[1] <= 1'b0;
else
q[1] <= ~q[1];
end
// q[2]:由q[1]的上升沿驱动
always @(posedge q[1] or negedge rst_n) begin
if (!rst_n)
q[2] <= 1'b0;
else
q[2] <= ~q[2];
end
// q[3]:由q[2]的上升沿驱动
always @(posedge q[2] or negedge rst_n) begin
if (!rst_n)
q[3] <= 1'b0;
else
q[3] <= ~q[3];
end
这段代码的精妙之处在于,它没有使用任何assign语句去“组合逻辑连接”,而是每一级都用一个独立的always块,每个块的敏感列表都明确指向其前一级的输出信号。这正是Quartus能将其综合为真实异步链路的关键——综合器看到posedge q[0],就知道要为q[1]分配一个以q[0]为时钟输入的触发器,而不是把它优化成同步逻辑。
提示:这里有个极易踩的坑——初学者常会写成
always @(posedge clk) begin q[1] <= q[0]; end,这其实是同步D触发器行为,完全违背异步设计初衷。真正的异步,必须让q[1]的时钟端物理上连接到q[0]的输出引脚。
2.2 为什么必须用低电平异步复位?时序安全的底层逻辑
复位信号rst_n(n代表negative,即低有效)在整个模块中都是negedge敏感,且在每个always块中都作为最高优先级条件。这并非为了“看起来规范”,而是由FPGA硬件结构决定的硬性要求。
FPGA芯片内部的触发器(Flip-Flop)单元,其复位(Reset)端口通常是异步、低电平有效的物理引脚。当你在Verilog里写if (!rst_n) q <= 0;,综合器会将此映射到触发器的R端,并自动插入一个反相器(inverter)来匹配低有效逻辑。如果错误地使用高电平复位(rst),综合器要么报错(因为目标器件不支持),要么强行插入额外逻辑,导致复位释放时刻产生不可预测的亚稳态。
更重要的是,异步复位的“异步”二字,与计数器的“异步”是同一枚硬币的两面。当rst_n拉低时,所有四级触发器必须在同一时刻(或极短时间内)被强制清零,这个动作不能依赖于任何时钟边沿。否则,如果复位是同步的,那么在clk恰好处于高电平期间拉低rst_n,q[0]可能立刻清零,但q[1]要等到下一个q[0]上升沿才响应,结果就是复位后出现非法状态(如q=4'b0001),严重破坏系统可靠性。
2.3 四位宽度的深意:平衡教学价值与硬件开销
选择4位(0–15)而非8位或16位,是经过教学实践反复验证的最优解。一方面,4位足够展示完整的计数周期和进位链行为:你可以清晰地在波形图里看到q=4'b1111之后,q[0]翻转为0,同时q[1]因q[0]上升沿而翻转,依此类推,最终q=4'b0000,形成闭环。另一方面,4位的传播延迟总和(典型值约4×8ns=32ns)仍在Quartus时序分析的可控范围内,不会因为级联过长导致q[3]无法满足建立/保持时间(Setup/Hold Time)而报时序违例(Timing Violation)。如果做成8位,总延迟可能超过100ns,在100MHz主频下必然失败,学生看到的只会是一堆红色报错,而非对异步特性的理解。
3. 工程文件深度解析与Quartus全流程实操指南
3.1 项目骨架:.qpf与.qsf——Quartus的“户口本”和“身份证”
一个Quartus工程能“开箱即用”,核心就在于这两个文件。.qpf(Quartus Project File)是项目的元数据容器,记录了工程名称、顶层实体名、使用的器件系列(如Cyclone IV E)、以及所有包含的源文件路径。打开cnt_yb.qpf,你会看到类似这样的行:
PROJECT_FILE_VERSION = 1300
PROJECT_NAME = cnt_yb
TOP_LEVEL_ENTITY = cnt_yb
DEVICE_FAMILY = Cyclone IV E
DEVICE = EP4CE6E22C8
这告诉Quartus:“我要编译一个叫cnt_yb的工程,顶层模块是cnt_yb,目标芯片是EP4CE6E22C8(DE1-SoC板载的Cyclone IV E 6K逻辑单元型号)”。
而.qsf(Quartus Settings File)则是工程的“操作手册”,它定义了所有物理约束。在这个包里,cnt_yb.qsf最关键的几行是:
set_global_assignment -name FAMILY "Cyclone IV E"
set_global_assignment -name DEVICE EP4CE6E22C8
set_global_assignment -name TOP_LEVEL_ENTITY cnt_yb
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to rst_n
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to "q[0]"
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to "q[1]"
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to "q[2]"
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to "q[3]"
set_location_assignment PIN_R8 -to clk
set_location_assignment PIN_T10 -to rst_n
set_location_assignment PIN_U11 -to "q[0]"
set_location_assignment PIN_V11 -to "q[1]"
set_location_assignment PIN_W11 -to "q[2]"
set_location_assignment PIN_Y11 -to "q[3]"
这里每一条set_location_assignment都精确地将Verilog信号映射到开发板上的物理引脚。例如,PIN_R8对应DE1-SoC板上标号为“CLOCK_50”的50MHz晶振输入,PIN_T10对应板载按键KEY[0](默认低电平,松开为高电平,完美匹配rst_n需求)。这些配置不是凭空写的,而是根据DE1-SoC用户手册第3章《Pin Assignments》逐一核对确认的。如果你用的是其他开发板(如Basys3),只需修改这几行引脚编号,整个工程依然可用。
3.2 仿真验证:.vwf与.sim.cvwf——在下载前“看见”硬件行为
仿真不是可选项,而是FPGA开发的“X光机”。.vwf(Vector Waveform File)是Quartus的波形激励文件,它定义了你在仿真中要施加的输入信号及其变化规律。打开cnt_yb.vwf,你会看到一个时间轴,上面有clk(周期20ns,即50MHz)、rst_n(初始为0,持续100ns后拉高)两条输入轨。这个设置模拟了真实的上电过程:系统上电瞬间复位信号有效(低电平),待电源稳定后释放复位。
而.sim.cvwf(Compiled Vector Waveform File)是Quartus执行仿真后生成的结果波形。它和.vwf的区别在于:.vwf是你“想怎么测”,.sim.cvwf是硬件“实际怎么答”。在这个包里,.sim.cvwf已经预先运行完毕,你可以直接双击打开,看到q[3:0]从4'b0000开始,每20ns(一个clk周期)q[0]翻转一次,q[1]在其后约8ns翻转,q[2]再延8ns,q[3]最后延8ns,最终形成阶梯状上升的计数序列。特别值得注意的是,在q=4'b0111到q=4'b1000的跳变过程中,你会观察到短暂的q=4'b0111→4'b0110→4'b0100→4'b1000这样的中间态,这就是异步计数器特有的毛刺(Glitch),它源于各级触发器翻转时刻的微小差异,是纯硬件现象,在同步设计中会被时钟边沿“削平”,但在异步链中赤裸裸地呈现出来。
注意:Quartus默认仿真采用“功能仿真(Functional Simulation)”,它不包含真实门延迟,所以你看到的毛刺是逻辑层面的。若要进行“时序仿真(Timing Simulation)”,需在编译完成后,用
.sdo(Standard Delay Output)文件重跑仿真,此时毛刺的宽度和位置会更贴近真实芯片表现。
3.3 编译产物解读:.map.rpt与.flow.rpt——读懂Quartus给你的“体检报告”
编译成功后,Quartus会生成大量.rpt(Report)文件,其中最关键的是.map.rpt(Fitter Report)和.flow.rpt(Flow Report)。.flow.rpt是整个编译流程的流水账,告诉你综合(Analysis & Synthesis)、布局布线(Fitting)、时序分析(Timing Analysis)各花了多少时间。而.map.rpt才是真正的“硬件体检单”,它详细列出了资源占用情况:
Logic utilization (in ALMs) : 4 / 1,428 ( < 1 % )
Total registers : 4
Total pins : 6 / 179 ( 3 % )
Total virtual pins : 0
这说明:整个四位异步计数器只消耗了4个ALM(Adaptive Logic Module,Cyclone IV的基本逻辑单元),对应4个触发器,完全符合预期。Total pins: 6指的是clk、rst_n和q[3:0]共6个IO引脚。这份报告的价值在于,它让你确信:你的设计没有意外引入冗余逻辑(比如误写了q <= q + 1导致综合器生成加法器),一切都在掌控之中。
另一个重要信息在.map.rpt末尾的“Fitter Information”部分:
Fitter Status: Successful - Fri May 10 14:22:33 2024
Quartus II Version: 13.0.1 Build 232 01/28/2013 SJ Web Edition
这行字意味着:这个工程已经在Quartus II 13.0.1 Web Edition环境下完整跑通,你无需担心版本兼容性问题。Web Edition是Intel(原Altera)官方免费提供的完整功能版,足以胜任教学和入门开发。
4. 实操全流程:从解压到硬件观测的每一步详解
4.1 环境准备与工程加载:三分钟启动
- 安装Quartus II:访问Intel FPGA官网(搜索“Quartus II Download”),下载并安装Quartus II 13.0 SP1 Web Edition(注意:不是Prime,也不是最新版,13.0是Cyclone IV E器件的官方推荐版本)。安装时务必勾选“Cyclone IV E”器件库。
- 解压资源包:将下载的ZIP包解压到一个无中文、无空格的路径,例如
D:\fpga_work\cnt_yb。Quartus对路径非常敏感,中文路径会导致编译报错。 - 加载工程:打开Quartus II,点击
File → Open Project...,导航至解压目录,选择cnt_yb.qpf文件。此时,软件左上角会显示工程名cnt_yb,左侧“Project Navigator”窗口会列出cnt_yb.v(源码)、cnt_yb_tb.v(测试平台)、cnt_yb.vwf(波形)等所有文件。
4.2 一键编译:见证从代码到比特流的魔法
在Quartus中,编译不是单个动作,而是一个标准化流程。点击顶部菜单栏的Processing → Start Compilation(或快捷键Ctrl+L)。此时,软件会自动执行以下步骤:
- Analysis & Synthesis:将Verilog代码转换为逻辑门级网表,检查语法和逻辑错误。如果代码有误(如信号未声明),会在此阶段报错。
- Fitting:将逻辑网表映射到目标芯片(EP4CE6E22C8)的具体物理资源上,分配引脚、布局逻辑单元、布线。.qsf中的引脚约束在此生效。
- Assembly:生成最终的编程文件(.sof,SRAM Object File),这是下载到FPGA芯片RAM中的格式。
- Timing Analysis:分析所有信号路径的延迟,确保满足时序要求(本工程主频50MHz,远低于Cyclone IV E的极限,必然通过)。
整个过程约需30–60秒。编译成功后,底部“Messages”窗口会显示绿色的Info: Processing ended successfully,同时.sof文件会生成在工程根目录下。
4.3 波形仿真:在虚拟世界里“触摸”硬件
编译成功后,立即进行仿真验证:
1. 在“Project Navigator”中,右键点击cnt_yb.vwf,选择Open with → Vector Waveform Editor。
2. 点击工具栏的Simulation → Run Functional Simulation(图标为绿色三角形)。Quartus会调用内置仿真器,运行预设的激励。
3. 仿真结束后,自动弹出波形窗口。用鼠标滚轮放大clk和q[3:0]区域,你会看到:
- clk是稳定的50MHz方波(周期20ns)。
- rst_n在t=0到t=100ns为低电平,之后恒为高。
- q[0]在第一个clk上升沿后翻转,之后每个clk上升沿都翻转。
- q[1]的翻转边沿明显滞后于q[0],测量其时间差约为8.2ns(这是q[0]触发器的t_co,即Clock-to-Out延迟)。
- q[2]和q[3]依次滞后,形成清晰的延迟链。
实操心得:如果你想手动修改激励,比如让
rst_n只拉低50ns,可以在波形编辑器中用鼠标拖拽rst_n的低电平段,然后重新运行仿真。这是理解复位时序最直观的方法。
4.4 硬件下载与板级验证:让LED亮起来
- 连接开发板:用USB-Blaster线(DE1-SoC标配)将电脑与开发板连接。打开开发板电源。
- 配置下载器:在Quartus中,点击
Tools → Programmer。在弹出窗口中,点击Hardware Setup...,选择USB-Blaster [USB-0],点击OK。 - 添加编程文件:确保“Mode”为
JTAG,点击Add File...,选择工程目录下的output_files\cnt_yb.sof。 - 开始下载:勾选
Program/Configure,点击Start。进度条走完后,状态变为Successful。 - 观测结果:此时,开发板上标号为
LEDG[0]到LEDG[3]的4颗绿色LED会开始闪烁。LEDG[0]闪烁最快(对应q[0]),LEDG[3]最慢(对应q[3]),肉眼可见的“逐级点亮”效果,这就是异步计数器最震撼的物理呈现。
5. 常见问题排查与独家避坑指南
5.1 编译报错“Can’t resolve multiple constant drivers for net”——信号被多个always块驱动?
现象:在Analysis & Synthesis阶段报错,提示某个信号(如q[0])被多个always块赋值。
原因:Verilog代码中存在重复定义。最常见的错误是,在cnt_yb.v之外,又在测试平台cnt_yb_tb.v里声明了同名的reg [3:0] q;,并且在initial块中对其赋值。由于Quartus在综合时会将整个工程视为一个整体,cnt_yb_tb.v虽是测试文件,但若被误加入综合列表,就会导致冲突。
解决方案:
- 在“Project Navigator”中,右键点击cnt_yb_tb.v,选择Properties。
- 在弹出窗口中,取消勾选Synthesis选项卡下的Include this file in the project for synthesis。
- 重新编译即可。
经验之谈:我第一次遇到这个问题时,花了整整一小时逐行对比代码,最后发现是测试平台文件被错误勾选。Quartus的报错信息很精准,但新手往往忽略“哪个文件在综合”这个前提。
5.2 仿真波形中q始终为高阻态(zzzz)——测试平台没连对?
现象:运行仿真后,q[3:0]在波形图中显示为红色的z,表示高阻态,没有任何数值变化。
原因:测试平台cnt_yb_tb.v中的实例化语句有误。正确的实例化应为:
cnt_yb uut (
.clk(clk),
.rst_n(rst_n),
.q(q)
);
如果写成了cnt_yb uut (.clk, .rst_n, .q);(省略了端口映射),或者端口名拼写错误(如.rst写成.rst_n),都会导致DUT(Design Under Test)与TB(Test Bench)之间信号未连接。
排查步骤:
- 打开cnt_yb_tb.v,检查cnt_yb uut这一行。
- 确认括号内是完整的.port_name(signal_name)格式。
- 检查cnt_yb.v中模块声明的端口名是否与TB中完全一致(大小写敏感!)。
5.3 下载后LED不亮或乱闪——引脚约束或硬件连接问题?
现象:.sof文件下载成功,但开发板LED无反应,或闪烁频率异常(如全部同步闪烁)。
排查清单:
1. 确认开发板型号:本工程默认适配DE1-SoC。如果你用的是Basys3(Xilinx芯片),则.qsf中的DEVICE_FAMILY和引脚编号完全不兼容,必须重写约束文件。
2. 检查USB-Blaster识别:在Windows设备管理器中,查看是否有USB-Blaster设备,且无黄色感叹号。若无,需重新安装USB-Blaster驱动(Quartus安装目录下drivers\usb-blaster)。
3. 验证引脚映射:在Quartus中,点击Assignments → Pin Planner,查看clk是否真的映射到了PIN_R8。有时.qsf文件被意外修改,导致映射丢失。
4. 复位按键状态:rst_n连接的是KEY[0],确保按键没有被意外按住(保持低电平),导致系统一直处于复位状态。
| 问题现象 | 最可能原因 | 快速验证方法 |
|---|---|---|
q[0]正常,q[1]~q[3]全为0 | q[1]的always块敏感列表写错(如posedge clk) | 查看cnt_yb.v中q[1]的always敏感列表 |
| 所有LED同步闪烁 | .qsf中q[0]~q[3]被映射到同一物理引脚 | 在Pin Planner中检查各q信号的Location列 |
| 编译通过但下载失败(Error: Can’t access JTAG chain) | USB-Blaster未识别或接触不良 | 拔插USB线,重启Quartus,更换USB端口 |
5.4 如何扩展为八位计数器?一份可抄作业的升级方案
想把这个工程升级为8位(0–255),只需三步,且保证100%兼容现有环境:
- 修改源码:打开
cnt_yb.v,将reg [3:0] q;改为reg [7:0] q;。 - 添加级联逻辑:在
q[3]之后,复制粘贴四次q[4]到q[7]的always块,注意修改敏感列表:
verilog always @(posedge q[3] or negedge rst_n) begin if (!rst_n) q[4] <= 1'b0; else q[4] <= ~q[4]; end // ... 以此类推,q[5]敏感q[4],q[6]敏感q[5],q[7]敏感q[6] - 更新约束文件:打开
cnt_yb.qsf,添加q[4]到q[7]的引脚分配(例如PIN_AA11,PIN_AB11,PIN_AC11,PIN_AD11,需查阅你所用开发板的用户手册确认可用引脚)。
提示:扩展后,
.map.rpt中Logic utilization会显示为8/1428,仍属极低占用。但要注意,8位异步链的总延迟可能接近70ns,在50MHz主频下依然安全,但如果想提升到100MHz,则必须改用同步计数器架构,这是异步设计的物理天花板。
6. 教学与实验延伸:从计数器到系统思维的跃迁
这个四位异步计数器工程的价值,远不止于“让它数到15”。它是通往更复杂数字系统的一把钥匙。我在带本科生实验时,常以此为基础,引导学生进行以下三个层次的延伸思考:
第一层:时序本质探究。让学生用逻辑分析仪(或Quartus自带的SignalTap II嵌入式逻辑分析器)捕获q[0]到q[3]的真实翻转波形,测量每一级的tpd(Propagation Delay),并与.map.rpt中报告的t_co(Clock-to-Out)值对比。你会发现,实测值(约7–9ns)与报告值(8.2ns)高度吻合,这让学生第一次真切感受到:代码里的一个<=符号,背后是硅片上电子穿越晶体管沟道的物理旅程。
第二层:毛刺的工程应对。异步计数器的毛刺在高速系统中是灾难性的。可以引导学生尝试两种经典解决方案:一是增加一级同步采样寄存器(在q[3:0]后加一个always @(posedge clk)块重新打拍),二是将异步计数器输出接入一个同步FIFO的写地址端,利用FIFO的跨时钟域处理机制自然滤除毛刺。这不再是“写代码”,而是“设计系统”。
第三层:从计数器到状态机。q[3:0]的16个状态,本质上就是一个16状态的状态机。可以让学生将q的某些特定值(如4'b1010)映射为控制信号,去驱动一个七段数码管显示“A”,从而将单纯的计数行为,升华为一个具有“决策能力”的有限状态机(FSM)。这时,他们就真正理解了:数字电路的终极形态,不是一堆门电路,而是一张状态转移图。
最后分享一个小技巧:在Quartus中,点击Tools → Netlist Viewers → RTL Viewer,可以一键生成整个cnt_yb模块的RTL原理图。你会看到4个独立的D触发器图标,它们的CLK输入端分别连着clk、q[0]、q[1]、q[2],像一条清晰的链条。这张图,比任何文字描述都更能揭示异步计数器的物理真相。它提醒我们,FPGA开发的起点,永远是理解硬件本身,而非沉溺于代码的语法糖。
简介:一套开箱即用的FPGA数字电路实验工程,实现标准四位异步二进制计数功能,计数范围0–15循环,输出4位总线q[3:0]。核心模块cnt_yb采用纯Verilog编写,支持上升沿时钟驱动与低电平异步复位;各级触发器级联方式为典型异步结构——q[0]由主时钟clk触发,q[1]~q[3]分别由前一级输出信号的上升沿触发,真实反映异步计数器的传播延迟与毛刺特性。工程已预配置Quartus II开发环境所需全部文件:项目工程文件(.qpf、.qsf)、波形仿真激励与结果(.vwf、.sim.cvwf、.waveform.vcd)、综合与布局布线报告(.map.rpt、.flow.rpt、.map.summary)、编译中间产物目录(db、incremental_db、compiled_partitions等),无需额外配置即可完成全流程编译、仿真与下载验证。适用于高校数字逻辑实验、FPGA入门实践、课程设计参考及硬件时序行为分析教学场景。
&spm=1001.2101.3001.5002&articleId=161858484&d=1&t=3&u=750e05b52eed41f488c821b6aa6e4cdf)
179

被折叠的 条评论
为什么被折叠?



