简介:西工大数字电子技术实验的完整资料包,涵盖实验报告、HDL设计代码和现场截图,适合电子工程、计算机科学等专业正在完成数电实验、准备课程考核或需要参考完整实验流程的本科生。内容围绕逻辑门、组合逻辑、时序逻辑、存储器与FPGA可编程器件等主题,将实验目的、原理、设备清单、操作步骤、结果分析和结论等要素整合进报告,并配有Verilog/VHDL源码与仿真波形截图,方便读者对照复习和复现实验。压缩包共702个文件,大小约29.98MB,以Quartus/ModelSim工程文件(cdb、hdb、qdb、v、qsf、wlf)为主,另有docx报告、txt说明、vhd源文件以及大量仿真日志、运行记录和脚本,呈现较完整工程目录结构。已有508人学习,读者可借助报告快速梳理实验思路,也能从代码和波形图中核对设计细节,适合考前突击、课程设计参考及动手能力进阶。
1. 某高校数电实验:报告、代码、截图三件套,其实是一套工程习惯
在某高校的数电实验里,每次做实验最烦的往往不是电路本身,而是交报告时要凑齐代码、截图和一堆分析。标题里的三件套看着独立,实际是一条流水线:实验要求决定代码结构,代码决定仿真波形,波形和截图又决定报告怎么写。
这里把这条流水线拆开,先分清实验形态,再写代码、搭测试、截波形、排版报告,最后给一份避坑清单。适合正在做数电实验、被报告格式卡住、或者想少跑两次实验室的人。
2. 数电实验的三种形态:仿真、面包板、FPGA,先分清再动手
拿到一个数电实验题目,先别急着写代码,先判断你的实验属于哪种形态。同一道“三人表决器”,在仿真型实验里要交的是源码和波形;在面包板型实验里要交的是接线图和实物照片;在FPGA型实验里还要多一份引脚约束和资源报告。方向搞错了,后面所有积累都白费。
2.1 实验形态决定交付物:先看指导书里的三句话
怎么判断形态?看实验指导书里的动词。出现“用XX工具搭建并仿真”,是仿真型;出现“在面包板上插接芯片”,是面包板型;出现“下载到开发板”,是FPGA型。如果同时出现“绘制原理图”和“编写Verilog代码”,一般是仿真加FPGA混合型。
我一般会把这三句话抄在报告开头,这本身就是“实验步骤”的一部分。你还会看到一些关键词:仿真型会提到“testbench”“波形”,面包板型会提到“74LS系列”“LED”,FPGA型会提到“引脚约束”“下载配置文件”。把这些词记下来,后面内容全围绕它们写。
2.2 仿真型:波形图要对上真值表,代码得能跑
仿真型实验的结果全靠软件算出来。原理是仿真工具把Verilog代码翻译成内部模型,再按testbench里的激励一步步推进仿真时间,最终输出波形文件。很多同学把testbench写得太随便,导致波形图只有一两个周期,报告根本没法分析。
常见做法是把真值表的每一行都变成一组激励,每个状态持续10到20纳秒。以三人表决器为例,有3个输入,8种组合,每种给10ns,总时长至少80ns,我一般会设成100ns。截图前把波形窗口缩放到全视图,确认输入信号从000一路切换到111,输出跟随变化,再把光标放在一个关键切换沿。
仿真工具的波形窗口通常有缩放选项,右键可以放大缩小。如果你觉得输入变化太密集,可以把每个组合的延时从10ns改成20ns,代价是仿真时间翻倍,但报告里看得更清楚。波形图里如果有毛刺,不要删,用文本备注“竞争冒险导致”,这反而是加分项。
2.3 面包板型:接线图要画清,实物照片要标引脚
面包板实验用的是74系列芯片、电阻、LED和导线。它的原理没有仿真那么抽象:真值表每一行,都能在物理连线上找到一个对应关系。交付物重点是“可验证”:接线图上要标清芯片型号、引脚编号、电源和地的位置,实物照片要能从多个角度看清走线。
我一般会先画一张逻辑连接图,再在照片上用箭头把关键连线标出来。拍照时手机镜头和板子保持垂直,不要斜着拍;光线要均匀,导线颜色用红黑区分电源和地。拍完放大检查每个引脚号都能看清,否则重拍。
面包板实验的测量表至少要有五列:输入A、输入B、输入C、理论输出、实测输出。用LED判断高低电平时,如果亮度不够,多半是限流电阻选太大,换成常见做法里的220Ω。
2.4 FPGA型:代码、约束、资源报告三件套
FPGA实验交付物最重。除了源码和仿真波形,还必须包含引脚约束文件和资源占用报告。原理是FPGA内部有大量可配置逻辑块,综合工具把代码映射成查表、触发器和布线;引脚约束告诉工具某个信号走哪个物理管脚;资源报告显示用了多少查找表、寄存器和引脚。
下载上板后,我一般会先按板载复位键让模块回到初态,再拨动开关逐行验证真值表。检查上板是否成功的常用做法是看LED亮灭是否符合预期,同时看下载工具警告里有没有“引脚未约束”的字样。
资源报告在编译或综合报告的资源利用摘要里。截图时把逻辑单元利用率和IO引脚数两段截全,这两个数字能直接对上你的实验复杂度。如果资源报告写得很满但上板后灯不亮,大概率是引脚约束没有真正生效,先检查约束文件有没有被加进工程。
三种形态的交付物差异很大,整理成表格会更直观:
| 形态 | 核心交付物 | 截图重点 | 常见扣分点 |
|---|---|---|---|
| 仿真型 | 源码、testbench、仿真波形 | 完整的输入/输出时序 | 波形不完整、没有对应真值表 |
| 面包板型 | 逻辑连接图、实物照片、测量表 | 芯片引脚和连线走向 | 未标电源/地、照片看不清 |
| FPGA型 | 源码、约束文件、资源报告、上板照片 | 引脚分配表和资源利用率 | 引脚未约束、仿真和上板不一致 |
选型只是第一步,交报告时真正体现差距的,是能不能把每一步的产物说清楚。下一章就把报告结构展开。
3. 实验报告怎么写得像工程文档:结构、状态表、时序图
报告不是给导师“看”的,是给下一个做这个实验的人“复现”的。所以结构要固定,数据要可查,每个结论都要有出处。如果用一句话定义好报告,那就是“把实验变成可重复的过程说明”。
3.1 五段式报告骨架:目的、原理、步骤、结果、分析
数电实验报告最常见的结构是五段式:实验目的、实验原理、实验步骤、实验结果、实验分析。这个顺序是固定的,导师翻起来不费劲。
- 实验目的:写清楚要验证什么功能,不要照抄题目。比如“验证三人表决器逻辑,比较卡诺图化简前后的电路实现”。
- 实验原理:把真值表、卡诺图、状态图放进来,说明化简过程。这里的重点是“推导”而不是“背诵”。
- 实验步骤:按操作顺序写,包含工具、参数、下载流程。每个步骤要有产物。
- 实验结果:放表格和截图,每个结果都要有编号,比如“表1 真值表、图1 仿真波形”。
- 实验分析:把实测值和理论值对比,说明误差来源。没误差也要说一句“本次实验未发现明显偏差”。
实验步骤这一节最容易写成流水账。正确写法是每个步骤都有产物:“打开工程,新建voter.v,产物是源码文件”;“编译并通过,产物是编译日志和资源报告”;“下载到开发板,产物是LED亮灭照片”。这样导师检查时,能顺着步骤找到对应交付物。
| 章节 | 核心内容 | 常用篇幅 |
|---|---|---|
| 目的 | 一句话描述功能验证目标 | 200字 |
| 原理 | 真值表、状态表、卡诺图 | 800字 |
| 步骤 | 可复现的操作流程 | 500字 |
| 结果 | 表格+截图 | 不限 |
| 分析 | 对照理论解释差异 | 600字 |
表格里的篇幅只是参考,实际以打印页数为准。有一类报告会被打回来:原理写了一大堆粘贴的段落,结果放了几张图没有编号,分析写“结果正确”。这不是报告,是草稿。
3.2 用真值表和状态表代替文字描述
数电报告的语言是布尔代数和表格,不是小说。很多同学实验原理写一大段:“当输入为0时输出为0,当输入为1时……”这种文字没人看。正确的做法是直接上真值表。以三人表决器为例:
| A | B | C | Y |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
把输出为1的行圈出来,合并最小项得到 Y = AB + AC + BC。卡诺图画出相邻圈,报告里放上卡诺图,代码逻辑和真值表就能相互印证。
时序逻辑的状态表要列出现态、次态、输出,并且状态转移图画清箭头。注意区分Mealy型和Moore型:输出由现态决定的是Moore型,由输入和现态共同决定的是Mealy型。报告里要标明状态编码方式,是用二进制编码还是独热码,因为这会直接影响卡诺图化简和代码写法。
3.3 时序图和波形图的落图规范
波形图不是截个图塞进去就行。规范做法是:时间轴从左到右,信号名在左边,输入在上、输出在下。截图前把仿真光标放在关键位置,比如计数器的回零沿。截图分辨率统一调到150dpi左右,太模糊导师看不清,太高文件太大。
画时序图时,如果有多个信号,可以用颜色区分:时钟用黑色,复位用红色,数据用蓝色。或者用虚线标注影响输出的关键路径。截图之后加一行图注,比如“图3 计数器回零时刻波形”。图注是报告规范的一部分,没有图注的图在排版层面就是不合格的。
波形图里的毛刺别藏。如果仿真里看到毛刺,用文本标注“竞争冒险现象,原因是……”。这反而是分析能力的体现。导师看的是你有没有理解现象,不是看一个完美但毫无解释的波形。
4. 代码与仿真:从真值表到Verilog的最短路径
代码是数电实验的核心交付物,但很多同学喜欢用复杂写法。其实数电实验代码不需要奇技淫巧,能跟真值表一一对应最好。越简单越好,因为报告里要解释每一行。
4.1 组合逻辑:case语句直接翻译真值表
组合逻辑没有时钟,输出只取决于当前输入。用always @(*)配合case语句,是最不容易出错的方式。以三人表决器为例,Y为1的条件是输入中至少有2个1,真值表里对应4行。用case可以直接把这四行列出来:
module voter( input [2:0] x, // 三个输入,bit0=A, bit1=B, bit2=C output y // 多数通过时输出1 ); reg y; always @(*) begin case (x) 3'b011, 3'b101, 3'b110, 3'b111: y = 1'b1; default: y = 1'b0; endcase end endmodule逻辑说明:case列表里的四个编码,正好对应真值表中Y=1的四个最小项。default保证其他输入输出0。参数说明:输入位宽是3位,所以case表达式x用3'b前缀;输出是1位reg类型,因为always块中使用过程赋值。组合逻辑的敏感列表用@(*),意思是只要有输入变化就重新计算。
这里要特别提醒:case必须写全。如果漏掉default,综合工具在输入没匹配到时保持原输出,最终会给你生成一个锁存器。锁存器在报告里很显眼,因为导师只要看到设计文档里有latch就会问为什么。所以这个警告值得写在代码注释里。
4.2 时序逻辑:计数器代码的时钟与复位
时序逻辑的特点是输出不仅和当前输入有关,还和之前的状态有关。代码中必须有时钟边沿触发。下面是一个模10计数器,计到9后自动回零:
module cnt10( input clk, // 时钟,上升沿触发 input rst_n, // 异步复位,低有效 output reg [3:0] q // 计数值0~9 ); always @(posedge clk or negedge rst_n) begin if (~rst_n) q <= 4'd0; else if (q == 4'd9) q <= 4'd0; else q <= q + 1'b1; end endmodule逻辑说明:rst_n是低有效复位,所以条件写if(~rst_n)。当q等于9时,下一个时钟沿到来,q回到0;否则加1。参数说明:4'd0和4'd9分别是4位十进制常量;非阻塞赋值<=用于时序逻辑,模拟寄存器在时钟边沿的捕获行为。如果在这里写成阻塞赋值=,仿真时容易在输出上出现不确定的中间态。
代码里复位名称用的是rst_n,工程惯例是下划线n表示低有效。如果你用rst,那复位条件要改成if(rst),千万别混。我的习惯是:复位命名要么rst_n,要么rstb,并在注释里写清有效电平。
4.3 testbench激励:让仿真波形可复现
testbench相当于给待测模块一组按时间排列的输入。常见做法是每隔10ns改变一次输入,把所有组合走一遍。组合逻辑不需要时钟,但如果你把多个实验的testbench放在一起,最好习惯性加一个时钟生成块。下面是三人表决器的testbench:
`timescale 1ns/1ps module tb_voter; reg [2:0] x; wire y; voter uut(.x(x), .y(y)); initial begin $monitor("x=%b y=%b", x, y); x = 3'b000; #10; x = 3'b001; #10; x = 3'b010; #10; x = 3'b011; #10; x = 3'b100; #10; x = 3'b101; #10; x = 3'b110; #10; x = 3'b111; #10; $display("all input cases done"); $stop; end endmodule逻辑说明:timescale 1ns/1ps定义时间单位是1ns,精度1ps。#10表示延时10个时间单位,所以每组输入保持10ns。8组输入走完,波形上就是一段10ns一拍的阶梯。参数说明:reg类型用于initial块中赋值;wire类型用于连接模块输出;$monitor在每个x变化时打印,这个打印串正好就是真值表的一行,方便和仿真波形对照。
注意:如果你要验证时序逻辑,需要单独生成时钟激励,例如在initial块里写
clk = 0; forever #5 clk = ~clk;。没有时钟的时序逻辑仿真不会出结果。
4.4 常见EDA流程:分析、仿真、约束三步命令
这个流程在不同工具里名称不同,但顺序一致:先把源码加入工程,然后编译或综合,再跑仿真,最后如果需要上板就做引脚约束并下载。
EDA工具的命令行版本一般长这样,具体命令名按你的工具改:
# 通用流程:编译源码 -> 跑仿真 -> 导出波形 eda_compile voter.v tb_voter.v eda_sim tb_voter --run 100ns --output wave.vcd eda_pin_assign --add SW[0] x[0] --add LED[0] y参数说明:--run 100ns一定要覆盖testbench所有激励。三人表决器8种组合共80ns,所以100ns够。wave.vcd是波形文件,截图工具直接打开这个文件再导出PNG。eda_pin_assign是示意命令,实际工具里用引脚规划器图形界面点选。如果实验是纯仿真,这一步可以忽略。
在图形界面里,常见做法是先执行分析综合,再打开仿真,最后在引脚规划器里分配管脚。编译日志里有错误记得优先看第一条,因为很多错误是连锁的,第一条解掉后面全通过。
5. 数电实验避坑指南:五个让报告返工的高频问题
做数电实验这几年,我见过最多的返工原因不是电路炸了,而是交付物不规范。下面五个坑按“现象、原因、解决”写,截图和代码相关的最多。
5.1 截图截不全:波形图没包含完整周期
现象:报告的波形图只有输出变化的一段,看不清对应的输入组合。 原因:仿真时间设太短,或者截图前没把时间轴拉到位。 解决:仿真时间至少覆盖所有输入组合的总时长。比如testbench里写了8个10ns激励,仿真就跑到100ns以上。截图前把波形窗口缩放到全视图,确认从第一个输入变化到最后一个输入变化都在屏幕里,再按截图键。我一般会在波形图上放一条测量光标,对齐到第一个输入翻转沿,这条光标线同时也给报告提供了时间参考。
如果你用的是图形界面,注意看波形窗口左下角的时间单位,有时候是ns,有时候是ps,按错单位会截出一个几乎空白的图。
5.2 代码与仿真结果对不上:多半是位宽或赋值顺序
现象:仿真波形输出比预期晚一拍,或者出现高阻态Z、不定态X。 原因:时序逻辑里用了阻塞赋值,或者位宽不匹配。比如4位计数器输出接在2位信号上,高位直接被截断。 解决:时序逻辑统一用非阻塞<=,组合逻辑用阻塞=。检查位宽:在波形窗口里右键信号看数值,如果显示X,说明信号没有被正常驱动;如果显示Z,说明漏了连接或引脚悬空。赋值顺序引起的怪现象,代码里只要看到always块混用=和<=,基本就是它了。
5.3 真值表与卡诺图不一致:中间态没列全
现象:报告里的真值表写着“输入001时输出X”,卡诺图却把X当0化简,最后表达式对不上。 原因:把约束项和任意项混在一起,没有任何说明。 解决:实验里出现的无关项要单独列在真值表下方,并注明“本实验将输出视为X”。卡诺图圈1时,如果要用无关项辅助化简,用虚线圈并在旁边标X。如果把它直接当成1合并,综合到硬件后可能和预期不符,这在答案里是硬伤。
5.4 实物接线图不标注模块和引脚,导师不想猜
现象:照片里芯片和导线拍得很清楚,但看不出哪个引脚接什么。 原因:没有画连接图,直接拿实物照片当接线图。 解决:先用图形工具画出芯片图,标好引脚编号和连到的信号,再附一张实物照片。照片上至少标出VCC、GND、输入端、输出端。没有标注的接线图等于没有图。我自己的习惯是:连线图用直线画,照片上的导线颜色和连接图标颜色保持一致,这样对起来很快。
5.5 资源报告和板载现象相互矛盾,扣分最冤枉
现象:FPGA实验报告里资源利用率正常,但下载后LED不亮。 原因:引脚约束没有生效,或者复位一直处于无效电平,模块没进入正常工作。 解决:下载前检查引脚约束文件是否被包含进工程。下载后先按板载复位键,再拨动输入开关逐行验证真值表。报告里同时放资源图和板载LED照片,证明上板结果与仿真一致。如果上板现象和仿真不同,先看复位信号的电平和代码里的有效电平是否一致。
遇到截图或者现象对不上的情况,我一般按三步排查:第一步看仿真日志有没有X或Z;第二步看波形被测信号是不是高阻;第三步看约束文件有没有引脚冲突。这三步能解决八成问题。剩下两成属于硬件接触不良或电源问题,从供电和地线查起。
6. 提效技巧:一份自检清单和一次保存全套截图的小习惯
交实验报告之前,我会固定跑一遍自检清单,这比反复看报告更省时:
- 真值表每一行都有仿真波形对应
- 波形截图包含完整时间轴和信号名
- 代码里没有未初始化信号,没有锁存器警告
- 接线图或照片上标注了引脚编号
- 资源报告与上板照片一致
这个清单是我从第一次翻车之后慢慢攒起来的。原来自检只查电路能不能用,不查报告完整性,结果提交后因为没有波形对应的截图被打回一次。从那以后,清单里永远第一项就是“真值表行数等于波形段数”。
再给一个保存截图的小技巧:仿真工具导出截图时默认文件名经常是一串无意义的编号,多个实验混在一起根本分不清。我会写一个简单脚本批量重命名:
#!/usr/bin/env bash # 把仿真工具导出的截图统一命名,带上实验号和模块名 for f in wave_*.png; do mv "$f" "lab3_voter_$f" done这样报告里引用截图时,文件名就是实验名加模块名,排版不会乱。脚本不复杂,但能省一次人工改名。数电实验的分数往往不是靠电路多复杂,而是靠交付物完整、步骤可复现。希望这篇能把报告、代码、截图这三件套变成你自己的流水线。希望帮到你。
本文还有配套的精品资源,点击获取