简介这份资源是西北工业大学数字电子技术实验的完整学习资料包面向电子工程、计算机科学等专业正在修读数电课程或准备实验考核的本科生。内容涵盖逻辑门电路、组合与时序逻辑、存储器及FPGA等主题包含实验报告、VHDL/Verilog HDL设计代码与仿真截图可帮助读者对照实验目的、原理、步骤与结果分析快速理解布尔代数、状态机设计等核心概念。压缩包共702个文件约29.98MB以v、vhd源码文件qpf、qsf等Quartus工程配置cdb、hdb、rdb等仿真数据库以及docx报告、txt说明、wlf波形和sof烧录文件为主完整保留了从设计到验证的工程目录结构。目前已有510人学习下载适合需要参考完整实验流程、排查代码与仿真差异、补齐报告撰写的同学使用。1. 从一份“数电实验全家桶”说起报告、代码、截图到底怎么配如果你正在做数字电子技术实验大概率经历过这种场面仿真波形跑通了代码烧进去没反应报告写到“实验结果分析”那一栏发现截图忘了存过两周回头看自己的 Verilog连模块端口都认不出来。这份资源就是冲着这些场景来的——它把数电实验的报告、源码和运行截图打包在一起按实验项目分门别类放好。适合两类人一类是刚上手数电实验、需要照着模板把流程走通的新手另一类是已经能写代码、但想把实验报告和工程文件整理成可复用模板的老手。下面我按“先看结构、再跑仿真、后改代码”的顺序把这份资源拆开讲一遍。2. 资源结构与技术栈先看清目录再动手2.1 目录层级与文件类型拿到压缩包后第一件事不是急着打开代码而是把目录树扫一遍。这类数电实验资源通常按“实验序号 实验名称”建文件夹每个文件夹里再分报告、源码、截图三个子目录。常见结构如下数电实验/ ├── 实验一_组合逻辑电路/ │ ├── report/ │ │ └── 实验一报告.docx │ ├── src/ │ │ ├── top.v │ │ └── tb_top.v │ └── screenshots/ │ ├── 仿真波形.png │ └── 引脚分配.png ├── 实验二_时序逻辑电路/ │ ├── report/ │ ├── src/ │ └── screenshots/ └── README.md报告一般是 Word 或 PDF源码以 Verilog 为主部分实验可能带 VHDL 或原理图文件截图则覆盖仿真波形、综合后 RTL 图、引脚分配和开发板实物连接。先确认每个实验文件夹里这三类文件是否齐全缺哪一类后面复现时就会卡在哪一步。2.2 技术栈与工具链数电实验的工具链相对固定常见组合是环节常用工具说明代码编写Vivado / Quartus / ModelSim按学校实验室环境选功能仿真ModelSim / Vivado Simulator跑 testbench 看波形综合与实现Vivado / Quartus生成比特流或配置文件板级验证开发板厂商下载工具烧录后看 LED、数码管等报告撰写Word / LaTeX插入截图和波形如果资源里的源码是.v文件那基本就是 Verilog如果是.vhd就是 VHDL。先看文件扩展名再决定用哪套工具打开。我一般会先打开README.md里面通常会写清楚每个实验对应的工具版本和开发板型号这一步能省掉很多“打开报错”的时间。2.3 报告与截图的对应关系报告里的“实验结果”章节通常会引用截图截图文件名如果和报告里的图注对不上后期整理会很痛苦。建议先按实验序号把截图重命名成exp1_waveform.png、exp1_pin.png这种格式再对照报告里的图注逐个核对。这一步看起来琐碎但等到你要二次开发或者写新报告时能直接复用这套命名规则不用再翻文件夹找图。3. 跑通第一个实验从仿真到波形的完整链路3.1 环境准备与工程导入以最常见的组合逻辑实验为例假设你用的是 Vivado。先新建工程器件型号按开发板选不确定就翻报告里的“实验环境”那一页。然后把src目录下的.v文件全部添加进去注意top.v是顶层tb_top.v是 testbench两者要分开添加。添加完成后在 Sources 窗口里把tb_top设为仿真顶层这一步如果设错仿真会直接报“找不到模块”。# 在 Vivado Tcl Console 里快速建工程并添加源码 create_project exp1 ./exp1 -part xc7a35tftg256-1 add_files -fileset sources_1 ./src/top.v add_files -fileset sim_1 ./src/tb_top.v set_property top top [current_fileset] set_property top tb_top [get_filesets sim_1]这段 Tcl 脚本的作用是建一个名为exp1的工程器件选xc7a35tftg256-1常见 Artix-7 型号把top.v加到设计源文件tb_top.v加到仿真源文件并分别指定顶层。参数-part后面的型号要按你实际开发板改改错会导致后续引脚约束对不上。3.2 跑仿真与看波形工程建好后直接点 Run Simulation选 Behavioral Simulation。ModelSim 或 Vivado 自带仿真器会启动跑完后波形窗口会弹出。重点看几个信号输入激励是否按 testbench 里的initial块变化输出是否在预期时刻翻转。如果波形是红色的X说明有信号没初始化或者模块端口没接对。// tb_top.v 里常见的激励写法 initial begin a 0; b 0; // 初始输入清零 #10 a 1; // 10ns 后 a 拉高 #10 b 1; // 再 10ns 后 b 拉高 #10 a 0; // 继续变化 #20 $stop; // 暂停仿真方便看波形 end这段 testbench 的逻辑是先给a、b赋初值然后每隔 10ns 改变一次输入最后用$stop暂停。#后面的数字是延时单位由timescale决定常见是1ns/1ps。如果波形里信号变化时刻和这里对不上先检查timescale是否写对。3.3 综合、实现与烧录仿真通过后点 Run Synthesis等综合完成看有没有 critical warning。常见警告是“端口未连接”或“多驱动”前者检查顶层端口是否都分配了引脚后者检查有没有两个always块驱动同一个信号。综合通过后跑 Implementation生成比特流再用硬件管理器烧录到开发板。烧录后对照截图里的现象比如 LED 亮灭顺序、数码管显示的数字确认和报告里写的一致。提示烧录前先把开发板连好电源和数据线都插稳。如果下载器识别不到器件先换 USB 口再检查驱动。4. 核心模块拆解组合逻辑与时序逻辑的代码骨架4.1 组合逻辑模块的写法组合逻辑实验通常要求用assign或always (*)实现真值表。以三输入多数表决器为例资源里的代码大概率长这样module majority_vote( input a, b, c, output reg y ); always (*) begin case ({a, b, c}) 3b000: y 0; 3b001: y 0; 3b010: y 0; 3b011: y 1; 3b100: y 0; 3b101: y 1; 3b110: y 1; 3b111: y 1; default: y 0; endcase end endmodule这段代码用case穷举了三个输入的所有组合输出y在多数为 1 时为 1。{a, b, c}是位拼接把三个 1 位信号拼成 3 位向量。default分支不能省否则综合工具可能推断出锁存器。如果你想把代码改得更简洁可以换成assign y (a b) | (a c) | (b c);效果一样但可读性看个人习惯。4.2 时序逻辑模块的写法时序逻辑实验一般要求用时钟驱动典型是计数器或移位寄存器。下面是一个带异步复位的 4 位计数器module counter4( input clk, input rst_n, output reg [3:0] q ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 4b0000; // 复位时清零 else q q 1b1; // 每个时钟上升沿加一 end endmoduleposedge clk表示上升沿触发negedge rst_n表示复位低有效。q q 1b1是非阻塞赋值时序逻辑里必须用用会出竞争。复位信号建议同步化处理但实验里异步复位更常见因为代码短、波形直观。改参数时注意位宽q是 4 位加到4b1111后会回绕到4b0000这是预期行为。4.3 顶层模块与引脚约束顶层模块负责把子模块例化并连到实际引脚。资源里的top.v通常只做例化和端口映射真正的逻辑在子模块里。引脚约束文件.xdc或.qsf里会写清楚哪个信号接哪个引脚这部分直接照抄报告里的表格即可。如果烧录后现象不对先核对约束文件里的引脚编号和开发板原理图是否一致。5. 避坑与常见问题仿真过了板子没反应怎么办5.1 波形全红或全蓝现象仿真跑完波形里信号全是X或Z。原因通常是 testbench 里没给输入赋初值或者模块端口名拼错导致悬空。解决先检查initial块里是否所有输入都有初值再核对例化时端口名和子模块定义是否完全一致大小写敏感。5.2 综合报多驱动错误现象综合时提示“signal has multiple drivers”。原因是一个信号在多个always块里被赋值或者同时用了assign和always。解决把该信号的驱动逻辑合并到一个always块里或者改成用中间信号过渡。5.3 烧录后 LED 不亮现象比特流下载成功但板子上 LED 没反应。原因可能是引脚约束写错、时钟没接对、或者复位信号一直有效。解决先用万用表量时钟引脚有没有波形再检查复位按键是不是常闭。如果约束文件里引脚编号和原理图对不上也会出现这种情况。5.4 报告截图和代码版本对不上现象报告里写的波形和当前代码跑出来的不一样。原因通常是改了代码没重新截图或者截图存了旧版本。解决每次改完代码重新跑仿真截图按“实验序号_日期_版本”命名报告里引用时写清楚对应版本。5.5 工程换电脑后打不开现象把工程拷到另一台电脑Vivado 提示找不到器件或 IP。原因工程里引用了绝对路径或者器件型号没装。解决拷贝时用“Archive Project”功能打包或者手动把.srcs、.xdc、.v一起拷过去重新建工程再添加。6. 二次开发与改造把实验代码变成可复用模板这份资源最大的价值不是让你照抄一遍而是把它当成模板库来改。我一般会做三件事第一把每个实验的顶层模块抽出来统一端口命名规则比如时钟统一叫clk、复位统一叫rst_n这样后面做综合实验时可以直接拼接。第二把 testbench 里的激励写成任务task比如task apply_input(input [2:0] val);换实验时只改任务内容不用重写整个initial块。第三把引脚约束按开发板型号分成不同文件换板子时只换约束文件代码不动。// 把激励封装成 task方便复用 task apply_input; input [2:0] val; begin {a, b, c} val; #10; end endtask initial begin apply_input(3b000); apply_input(3b001); apply_input(3b010); // 后续继续调用 end这段代码把输入赋值和延时封装成一个任务调用时只传向量值。改实验时只需要改任务里的赋值逻辑initial块的结构不用动。参数val是 3 位输入向量#10是每个激励之间的间隔按需调整。验证改造是否成功我通常用“三步法”先跑行为仿真看波形是否和原实验一致再跑综合后仿真确认没有时序违例最后烧录到板子对照原截图看现象。三步都过说明改造没引入新问题。如果只跑了行为仿真就烧板子很容易翻车——综合后的网表和仿真模型可能有差异尤其是用了initial块给寄存器赋初值的写法。从那以后我每次改完代码都强制走一遍“仿真-综合-烧录”三步哪怕只是改了一个引脚约束。希望这份拆解能帮你把这份数电实验资源真正跑起来而不是让它躺在硬盘里吃灰。本文还有配套的精品资源点击获取