资讯动态

数电实验全流程指南:Verilog代码、仿真波形与报告避坑技巧

发布时间:2026/10/15 18:39:27 来源:尧图企业网站定制
简介这份资料包围绕西工大数字电子技术实验整理面向高校电子工程、计算机及相关专业学生覆盖逻辑门电路、组合逻辑、时序逻辑、存储器、FPGA等经典主题。压缩包共702个文件大小约29.98MB文件类型包括VHDL/Verilog源码v、vhd、Quartus工程与仿真波形qpf、qsf、wlf、实验报告文档docx、txt以及大量截图和日志数据不同后缀对应代码设计、工程配置、仿真验证、结果记录等环节包内目录按实验或功能划分便于快速定位。已有508人学习下载。实验报告逐份包含目的、原理、设备、步骤、结果分析与结论代码附有注释截图展示硬件连线与仿真波形既能辅助初学者搭建电路、编写和调试代码也能为高年级同学复习重点、整理报告和排查问题提供一套完整可对照的参考样例是数电实验学习中有价值的实操指南。1. 数电实验报告代码截图这套资源包它真正给的是「少走弯路」的完整流程第一次走进实验室拿到数电实验指导书的人多半会搜一个叫「数电实验报告代码截图」的资源包。这个标题看着像在求现成的作业实际上它描述的是一个完整交付物实验报告文档、能编译通过的 Verilog 代码、以及用来证明实验真的跑通了的仿真波形和引脚分配截图。它的价值不在「抄」而在把「这门实验课怎么过」这件事标准化——从新建工程、写代码、仿真到排版报告的每一环都有可参照的样本。适合三类人马上要交报告的、想搞懂 FPGA 工具链到底在做什么的、以及被报告格式扣分扣到怀疑人生的。这篇笔记就按这个交付物从头拆一遍每一章都会给可直接复现的操作和参数。2. 从实验指导书到新建工程数电实验的形态认知与建工程标准动作数电实验在不同高校的课表里长得不太一样但绝大多数会按「验证型、设计型、系统型」三层递进。验证型实验一般是让你搭一个现成的时序电路观察波形设计型实验是给需求自己写组合逻辑或计数器系统型实验则把状态机、显示、分频串成一个完整小系统。理解了这三类你去看别人的实验报告和代码时就能快速定位那段代码解决的是哪一层的问题截图应该截哪个窗口。很多人拿到资源包直接翻报告却不知道代码和截图是怎么配合的最后拼接痕迹明显反而容易被扣分。2.1 工具链选型为什么这门课几乎都用 Quartus ModelSim数电实验的主流工具链是可编程逻辑器件厂商的 IDE 加独立仿真器最常见做法是 Quartus 做编译、综合、引脚分配ModelSim 做功能仿真。选这套组合的理由很实际实验箱厂商的教程全部基于它实验室电脑也预装好了你在家复现时环境一致。相比之下开源工具链虽然免费但驱动实验箱上的下载器时常要折腾半天。另一个选型决策是写 Verilog 还是画原理图。我的建议是直接用 Verilog。原理图输入在连接关系多的时候确实直观但改一个逻辑要重新连好几根线而且报告里贴原理图很难讲清楚边界条件Verilog 代码改一行重新编译就能跑仿真时信号的层次关系也清晰。实验室老师一般不会禁止 Verilog反而更认可代码规范。2.2 新建 Quartus 工程四个必须确认的参数不管是 Quartus II 还是新版的 Quartus Prime新建工程的入口都是 File → New Project Wizard。整个向导里只有四个参数会真正影响你后面的编译和下载其余选项保持默认即可。参数项怎么填说明与常见坑Project Name英文字母加下划线不能有中文也不能以数字开头。有人填了「实验1」后面仿真时文件路径带中文直接报错Top-Level Entity与顶层模块名一致Quartus 默认用工程名当顶层实体如果你代码里的 module 名和工程名不一致编译会报找不到顶层Device Family按实验箱型号选实验箱标签上会印常见的是 Cyclone 系列。选错了也能编译但下载时器件不匹配EDA Tool SettingsSimulation 选 ModelSim这一步很多人跳过会导致 Quartus 里没法直接拉起仿真后面全手动操作填完向导后会生成一个 .qpf 工程文件。这里有一个我每次都会检查的习惯工程路径不要带空格和中文。某高校实验室电脑的用户名经常是中文默认路径就会变成 C:\Users\张三...这种工程在 ModelSim 联调时大概率出幺蛾子直接在磁盘根目录建个英文文件夹最稳。2.3 第一次编译先让一个空工程跑通不要一上来就写几百行代码。我的习惯是先建一个空模块只做一次全编译确认工具链本身没问题再往里填逻辑。空模块长这样module top( input wire clk, input wire rst_n, output wire led ); assign led 1b0; endmodule这段代码没有任何功能但它能验证最基础的三件事工程路径是否干净、器件型号是否被 Quartus 正确识别、编译流程是否完整。点击 Processing → Start Compilation第一次编译通常在 30 秒到几分钟不等。编译完成后看 Processing 窗口里的报告重点看两个数字总逻辑单元占用Total logic elements和引脚使用数。如果引脚数是 0说明你还没做引脚分配那是后面的事如果编译报错九成是顶层实体名不匹配或者器件没选对。3. 实验代码怎么写三个高频实验的 Verilog 骨架与必调参数数电实验里最常出现的三个题是组合逻辑表决器、带使能的计数器、以及交通灯或流水灯类的状态机。这三个刚好覆盖了组合逻辑、时序逻辑和状态机三种核心写法实验室老师也最爱从这三个方向出题。把它们的骨架代码吃透其他题目基本都是变形。3.1 组合逻辑实验四人表决器——真值表用 case 写才不容易丢项四人表决器的需求是四人投票超过两人同意则输出 1否则输出 0。第一次做的人习惯写一大堆 if-else 嵌套条件稍微一多就漏情况。更可靠的做法是把四个输入拼成一个 4 位向量对 16 种情况用 case 全枚举。module voter4( input wire [3:0] vote, // 每人一票vote[0]~vote[3] output reg result // 1 表示通过 ); always (*) begin case (vote) 4b0011, 4b0101, 4b0110, 4b0111, 4b1001, 4b1010, 4b1011, 4b1100, 4b1101, 4b1110, 4b1111: result 1b1; default: result 1b0; endcase end endmodule代码里的 case 分支直接把所有票数≥3的组合列出来比用加法器再比较的思路更直白也方便在报告里跟真值表一一对应。参数说明vote 是 4 位输入向量位宽由板上的 4 个按键或拨码开关决定result 声明成 reg 是因为它在 always 块里被赋值这是 Verilog 的语法要求不是真的综合出寄存器。如果你把 case 换成连续赋值 assign那 result 就必须用 wire这个细节写错编译器立刻报错也是最常见的新手错误。3.2 时序逻辑实验模 10 计数器——使能和复位是评分的两条硬线计数器是时序逻辑的入门题但实验要求通常会附加条件异步复位、同步使能、计数到 9 后自动回 0。这些条件不是随便加的它们对应着实验箱上真实的按键和开关也是报告里分析波形时的重点。module counter10( input wire clk, // 实验箱上的时钟通常是 50MHz input wire rst_n, // 低电平复位按键 input wire en, // 使能开关1 才计数 output reg [3:0] q, // 计数值4 位够表示 0~9 output reg carry // 计数到 9 时输出一个高电平脉冲 ); always (posedge clk or negedge rst_n) begin if (!rst_n) begin q 4d0; carry 1b0; end else if (en) begin if (q 4d9) begin q 4d0; carry 1b1; end else begin q q 1b1; carry 1b0; end end else begin q q; carry 1b0; end end endmodule这里的两个参数值得在报告里专门写复位是异步复位因为敏感列表里既有 posedge clk 又有 negedge rst_n使能是电平使能en 为 1 时每个时钟上升沿计一次数。注意 q 和 carry 都用了非阻塞赋值 这是时序逻辑的标准写法如果混用阻塞赋值 综合出的电路会出现你意料之外的竞争。还有一个容易被问倒的细节为什么计数到 9 而不是到 10因为回 0 的时机是在检测到 9 的那一拍所以 9 这个状态会保持一个时钟周期波形上能看到 q 停在 9 的位置同时 carry 拉高。3.3 状态机实验四状态交通灯——三段式写法让仿真波形好讲交通灯实验一般要求实现十字路口东西、南北两个方向的红绿灯切换含黄灯过渡。这里的关键不是逻辑难而是状态跳转要清晰。三段式状态机把状态跳转、次态逻辑、输出逻辑分开写仿真时波形层次分明报告也好配图。module traffic_light( input wire clk, input wire rst_n, output reg [2:0] ew, // 东西方向bit0红 bit1黄 bit2绿 output reg [2:0] sn // 南北方向bit0红 bit1黄 bit2绿 ); parameter S_EW_GREEN 2d0, S_EW_YELLOW 2d1, S_SN_GREEN 2d2, S_SN_YELLOW 2d3; reg [1:0] state, next_state; reg [4:0] cnt; // 状态停留计时5 位足够 20 个周期 // 状态寄存器 always (posedge clk or negedge rst_n) begin if (!rst_n) state S_EW_GREEN; else state next_state; end // 次态逻辑每个状态停留 10 个时钟周期 always (*) begin next_state state; case (state) S_EW_GREEN: if (cnt 5d10) next_state S_EW_YELLOW; S_EW_YELLOW: if (cnt 5d3) next_state S_SN_GREEN; S_SN_GREEN: if (cnt 5d10) next_state S_SN_YELLOW; S_SN_YELLOW: if (cnt 5d3) next_state S_EW_GREEN; default: next_state S_EW_GREEN; endcase end // 输出逻辑与计时 always (posedge clk or negedge rst_n) begin if (!rst_n) begin ew 3b001; sn 3b100; cnt 5d0; end else begin if (state ! next_state) cnt 5d0; else cnt cnt 1b1; case (state) S_EW_GREEN: begin ew 3b001; sn 3b100; end S_EW_YELLOW: begin ew 3b010; sn 3b100; end S_SN_GREEN: begin ew 3b100; sn 3b001; end S_SN_YELLOW: begin ew 3b100; sn 3b010; end endcase end end endmodule参数说明状态编码用独热码还是二进制码在这个规模下无所谓我用了 2 位二进制编码是为了波形窗口里能看到状态编号递增cnt 的位宽按最长停留时间算停留 10 个周期需要 4 位留一位余量用 5 位避免计数溢出。三段式的核心价值是状态跳转逻辑独立成一个 always 块仿真时如果波形跳转不对单独看 state 信号就能定位是次态逻辑的问题还是输出逻辑的问题不用在一大段代码里翻。4. 把「截图」变成有效证据波形仿真、引脚分配与三处截图细节资源包里最容易被忽略的就是截图。代码可以抄报告可以改但截图是老师判断你「是不是真的跑过」的直接证据。很多人实验明明做出来了却因为截图模糊、没有标尺、信号名对不上而被打回重交。这一章讲清楚三张必截的图和它们各自的细节。4.1 写一个能一次性通过的 testbench时钟、复位、使能怎么给仿真不是点一下自动跑出来的你需要自己写 testbench。一个能稳定通过的 testbench 骨架长这样timescale 1ns / 1ps module tb_counter10; reg clk; reg rst_n; reg en; wire [3:0] q; wire carry; counter10 uut( .clk(clk), .rst_n(rst_n), .en(en), .q(q), .carry(carry) ); initial begin clk 0; forever #10 clk ~clk; // 50MHz 时钟周期 20ns end initial begin rst_n 0; en 0; #30 rst_n 1; // 复位结束 en 1; // 打开使能 #200 en 0; // 观察使能暂停效果 #100 $stop; end endmoduletestbench 的三个关键参数是timescale 定义时间单位10ns 对应 50MHz 时钟#30 表示复位拉低 30ns 后再释放确保计数器从初始状态开始跑。注意 en 在复位期间必须为 0否则复位和使能同时生效时波形不好解释。$stop 是让仿真停住方便截图。仿真时先跑编译再在 ModelSim 里添加需要观察的信号到波形窗口然后 run -all。如果你用的是 Quartus 自带的仿真启动方式菜单入口在 Tools → EDA Simulation Tool选 ModelSim 后它会自动打开 ModelSim 并载入工程。4.2 三张必截的图功能仿真、引脚分配、编译资源摘要第一张是功能仿真波形图证明逻辑正确。截取范围要包含复位释放、计数到 9、回 0 的完整过程最好能让波形窗口显示 5 个以上的计数周期。第二张是引脚分配图路径是 Assignments → Pin Planner截图要能看到每个信号名对应的引脚编号。第三张是编译资源摘要路径是 Processing → Compilation Report在 Fitter → Resource Section 里能看到逻辑单元占用数和引脚数这张图是证明你工程真实存在的关键。4.3 截图细节进制设置、时间光标与波形范围波形窗口的默认显示是二进制4 位计数值看起来是一排 0 和 1老师看着费劲。选中 q 信号右键 → Radix → Unsigned Decimal把计数显示成十进制波形可读性立刻提升。再用波形窗口左侧的光标工具拉一条测量线在窗口底部的 Delta 区域会显示光标所在时间点截图时把它保留在画面里这就是你的测量证据。截图位置要展示的信息常见翻车点功能仿真波形信号跳变与时钟对齐用了二进制显示审阅者看不出计数序列Pin Planner 图信号到引脚的映射截图太小引脚编号模糊或只截了一半窗口编译资源摘要逻辑单元与引脚数量与 Pin Planner 里引脚数对不上被质疑是拼图注意截图前把波形窗口的背景调成白色黑底截图打印出来一片糊。ModelSim 里在 Wave 窗口右键 → Wave Preferences → Colors 里改。5. 实验报告的组装与 5 个避坑现场从模板到评分的血泪经验代码和截图齐了最后拼报告。这章先把报告的标准结构列出来再讲 5 个我见过最多、也最好避免的坑。每一节最后都会落到「现象 → 原因 → 解决」上照着自查就行。5.1 报告的标准结构每一段填什么内容才不空大多数高校的报告模板包含六个部分实验目的、实验原理、实验内容与步骤、实验结果与分析、思考题、总结。实验目的直接从指导书抄改不必长篇实验原理写清楚你用的模块结构和关键信号比如「计数器采用异步复位、同步使能计数范围为 0~9」实验结果与分析是重头戏贴波形图、引脚分配图再配一段话解释波形里每个阶段的对应关系思考题不要抄答案用自己的话写关键结论老师一眼能看出是不是复制粘贴的。5.2 避坑现场一仿真波形全是红色的 X 或高阻现象ModelSim 里 q 和 carry 一整条红线完全没有任何跳变。原因是 testbench 里复位信号根本没生效——最常见的是 rst_n 初始值为 1复位持续时间为 0计数器一开始就在跑但状态未知。解决initial 块里先把 rst_n 拉低等 2~3 个时钟周期再释放见上一章的 testbench 写法。这条几乎是所有刚上手的学生第一次跑仿真都会撞上的遇到红线先查复位别急着查逻辑。5.3 避坑现场二管脚分配正常下载到实验箱却没反应现象Pin Planner 里每个信号都分配了引脚编译也通过下载成功但板子上的灯完全不亮。原因是时钟引脚没分配或者分配到了非专用时钟引脚上。解决打开 Pin Planner确认 clk 信号分配的引脚和实验箱标注的时钟输出一致如果实验箱用拨码开关做输入还要检查开关拨到高电平时对应的是 1 还是 0有些板子的开关默认上拉拨到 ON 反而输入低电平。极性反了之后按下去灯不亮不按反而亮这不是代码 bug是输入逻辑反了。5.4 避坑现场三改完代码重新仿真波形纹丝不动现象在 Quartus 里改了一个计数器的初始值回到 ModelSim 重新 run波形和上一次一模一样。原因ModelSim 加载的还是旧编译结果Verilog 代码修改后没有重新编译仿真库。很多人只点了 ModelSim 里的 Restart但 Restart 只是把时间归零没有重新编译设计文件。解决在 ModelSim 里执行 compile 命令重新翻译工程文件或者干脆在 Quartus 里用 EDA Simulation Tool 重新拉起 ModelSim让它重新编译然后再 run -all。这条不是玄学是工具链的缓存机制。5.5 避坑现场四截图被判「存疑」现象报告交上去反馈说截图与代码不一致——比如波形里 q 是 4 位但代码里 q 被改成了 8 位对比明显对不上。原因截图是改代码之前截的改完代码忘了重新仿真和重新截图。解决定稿前按「改代码 → 重新编译 → 重新仿真 → 重新截图 → 贴进报告」的顺序重走一遍所有截图用同一版代码生成。这个坑的经验是截图是证据链证据和代码必须同源一张旧图能毁掉整份报告的可信度。5.6 避坑现场五报告文件名带中文和空格提交失败现象实验报告上传平台时提示文件名不合法。原因文件名用了「数电实验_最终版(3).docx」这种格式括号和中文在部分系统里会被拦截。解决统一命名成 exp2_counter_report.docx 这种全英文加下划线的格式。文件下发时模板名可能自带中文另存为时改掉一份报告加一份工程源码压缩包用同样命名规则老师整理文件也省事。这是最容易被忽略的丢分点跟实验内容半点关系没有但每年都有人踩。6. 收工前 10 分钟验证实验真的跑通的三个检查技巧代码写完、截图截好、报告排版完先别着急交花 10 分钟做三个检查。第一个检查是打开 Quartus 的 RTL Viewer路径在 Tools → Netlist Viewers → RTL Viewer它能把你写的代码综合成电路图。看这张图能快速发现两类问题一是本来该有触发器的信号被综合成了纯组合逻辑二是模块之间的连线和你预期对不上比盯着代码发呆效率高很多。第二个检查是用 .do 脚本把仿真跑成一个固定流程。新建一个 sim.do 文件把 ModelSim 的常用命令按顺序写进去比如vlib work、vlog counter10.v tb_counter10.v、vsim work.tb_counter10、add wave /tb_counter10/*、run -all。以后每次改完代码执行一次do sim.do就自动完成编译和仿真不用再手动点一堆菜单。这个习惯花 5 分钟建立省的是每周实验的半小时。用 TCL 保存脚本文件后缀是 .do注意脚本里的路径要相对工程目录写换台电脑也能直接跑。第三个检查是下载到板子后按一条固定路径自测先拨复位确认输出回到初始状态再打开使能观察计数是否按预期变化最后关掉使能确认计数停止。这三点都符合实验才是真的通了。我现在每做一个实验都会先把这三个检查做完再截图写报告改过代码就重跑一遍 RTL Viewer 和仿真确认截图和代码同源才敢贴进报告。这套习惯让我的报告基本不再被打回返工希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑