ARTICLE DETAIL

资讯详情

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

数字电路与数字逻辑实验报告:真值表、卡诺图与Verilog波形验证

数字电路与数字逻辑实验报告:真值表、卡诺图与Verilog波形验证 简介《数字电路与数字逻辑实验报告》文档面向高校电子信息、自动化、计算机等专业学生及实验指导教师用于数字电路与数字逻辑课程实验的参考、报告撰写与复习。内容覆盖十个典型实验TTL集成逻辑门逻辑功能测试、组合逻辑电路设计与测试、译码器及数据选择器应用、触发器与计数器、移位寄存器、数字时钟、555时基电路及智力竞赛抢答装置。每个实验包含目的、原理、设备、内容步骤、电路图、测试结果和实验心得涉及74LS00、74LS138、74LS153、74LS151等常用芯片。资源包共1个doc文件约841KB便于直接查阅和修改。已有5297人学习。适合需要完成实验报告、理解逻辑门与中规模集成器件应用、掌握数字系统设计思路的读者参考。1. 一份数字电路与数字逻辑实验报告.doc卡住人的往往不是电路实验室里最常见的一幕面包板上 74 系列芯片插得整整齐齐数码管按预期跳字示波器上的时钟沿干净利落可回到宿舍打开那个数字电路与数字逻辑实验报告.doc光标停在「实验数据与分析」那一行写不出东西。问题通常不在电路而在于做实验时只记了「现象对不对」没记「条件是什么、改了什么、边界在哪里」。这份文档要解决的事情很具体把数字电路实验从一次性的演示变成一份别人照着能复现的记录——真值表从哪来、卡诺图怎么圈、波形在哪个时刻截、实测与仿真的差异怎么解释。它适合三类人正在做数字电路基础实验的低年级学生、需要把组合逻辑与时序逻辑讲清楚再交报告的人以及带实验课、想统一起一份模板的助教。接下来的内容按报告的实际写作顺序推进每一步都给出可以直接抄的命令、代码和字段表。2. 数字逻辑实验报告的骨架真值表、卡诺图与逻辑表达式的对账一份能拿得出手的数字电路实验报告结构上其实只有四块硬骨头条件、真值、化简、数据。条件写不清后面全是空话真值和化简对不上等于自己承认没验证数据没有字段设计就只能写「现象正常」这四个字。2.1 器材与工具清单把可复现条件写进报告第一页数字逻辑实验的结论高度依赖器件状态。同一张真值表用 74HC00 和 74LS00 做出来在阈值和边沿速度上完全不是一回事同一段计数器代码在 50 MHz 和 1 Hz 时钟下看到的「毛刺」根本不是同一个东西。所以报告的第一页不该是「实验目的」而是一张条件表。记录项填写示例为什么必须写实验箱/开发板数字电路实验箱板载 ±5V决定电平标准与时钟源质量芯片型号74LS00、74HC161LS 与 HC 输入阈值、扇出不同供电与电平判据5VTTL 高 ≥2.0V、低 ≤0.8V判定高低电平的唯一依据时钟源信号源 1 kHz 方波占空比 50%时序实验的全部时间基准仿真工具Icarus Verilog GTKWave波形差异可归因到工具链测量仪表100 MHz 示波器 / 万用表决定能不能看到 ns 级毛刺填这张表有个实用判断凡是「换掉之后结果可能变」的东西都写进去。芯片批次、连线长度、实验箱跳线接触情况这些在理论课上不需要提在实验报告里恰恰是数据可复现的前提。2.2 真值表生成与逻辑表达式化简手算和工具算各记一份数字电路基础知识里最容易被跳过的环节是「真值表到表达式」的中间过程。多人写报告时直接抄一个化简结果问起来说不清怎么来的。稳妥做法是双轨记录手算一遍写进报告用工具再算一遍做对账两者不一致就是发现错误的时机。# truth_sop.py 输入变量个数与逻辑函数输出最小项列表与 SOP/POS 形式 from itertools import product from sympy.logic import SOPform, POSform # 示例三变量多数表决器1 的个数 2 时输出 1 def majority(a, b, c): return int(a b c 2) # product 的枚举顺序是 (0,0,0) - (1,1,1)正好对应最小项编号 0~7 minterms [i for i, (a, b, c) in enumerate(product([0, 1], repeat3)) if majority(a, b, c)] dontcares [] # 有无关项时按编号填进来例如 [2, 5] print(最小项编号:, minterms) print(SOP(与或式):, SOPform([a, b, c], minterms, dontcares)) print(POS(或与式):, POSform([a, b, c], minterms, dontcares))这段代码的逻辑是先用product穷举 2³ 个输入组合索引即最小项编号把输出为 1 的编号交给SOPform做奎恩-麦克拉斯基化简。参数上要注意两点dontcares只在实验允许某些输入组合不出现时才填乱填会让表达式在非预期输入下输出错误值变量名列表的顺序决定输出表达式里字母的排列报告里必须和引脚分配表一致否则对着波形核对时容易看串行。2.3 卡诺图圈组的三条硬规则与常见错圈手算化简的价值在于卡诺图而卡诺图扣分点几乎全在圈法上。硬规则只有三条每个圈必须包含 2ⁿ 个「1」格每个圈至少要有一个只被本圈覆盖的「1」否则是冗余圈圈要尽可能大、数量尽可能少。三变量多数表决器按这三条圈出来是 y ab ac bc三个两格圈每个圈都有独占格没有冗余。常见错圈有三种。第一种是把卡诺图当成普通表格以为第一行和第四行不相邻——实际上卡诺图首尾、四角都算相邻这也是格雷码排列的意义所在。第二种是圈了 3 个、6 个这种非 2ⁿ 数量。第三种最隐蔽为了让表达式看起来更短把无关项当 1 用圈出一个更漂亮的结果但这个结果在无关项真实出现时会翻车。遇到这种取舍报告里应该明确写「此处将某个无关项取为 1理由是实验中该组合不会出现」而不是默默圈掉。提示卡诺图化简结果与 2.2 的SOPform输出不一致时先检查变量排列顺序再看无关项取值最后才怀疑化简本身。2.4 数据记录表的字段设计让每行数据都能追溯到波形数字电路实验报告里最没信息量的一句话是「测量结果与理论一致」。要让它变得可检查记录表至少要包含输入向量、理论输出、实测输出、测量时刻、判定结论和备注六列。序号输入向量 (A B C)理论输出 Y实测输出 Y测量时刻/条件是否一致备注10 0 000上电稳定 5s 后是—20 1 111上电稳定 5s 后是—31 0 110clk 上升沿后 20ns否输出跳变滞后见波形图 341 1 011上电稳定 5s 后是—「测量时刻」这一列是真有用。组合逻辑的不一致绝大多数来自测量点选在了信号跳变附近时序逻辑的不一致则多半是复位未撤销或者时钟边沿对齐问题。备注列写清归因方向分析部分的文字就有了落脚点不用再硬凑。填表时不要只填「一致」的行把所有不一致的行原样留下报告的分析深度恰恰来自这些行。3. 组合逻辑实验怎么跑出可截图的波形Verilog 加 iverilog 的最小闭环上板之前先在仿真里把组合逻辑跑对是数字电路实验里性价比最高的一步。真实原因不是「仿真更先进」而是组合逻辑的错通常错在穷举不全手工测了 5 组输入就下结论剩下 3 组恰好是输出异常的那几组。3.1 组合逻辑先仿真的三个理由第一是可穷举。四输入以内的组合逻辑一共 16 种输入组合仿真可以一组不漏地跑完手测做不到。第二是可留痕。仿真结果能以 VCD 文件保存截图、放大、量时间差都不依赖示波器当场的状态。第三是可分离变量。板上输出不对原因可能是芯片、连线、接触、电源之一仿真输出不对原因只可能是逻辑本身这就把排查范围压缩了一个数量级。3.2 四选一多路选择器的可综合写法// mux4.v —— 4 选 1 多路选择器纯组合逻辑 module mux4 ( input wire [3:0] d, // 四路数据输入 input wire [1:0] sel, // 选择端2 位共 4 种取值 output reg y ); always (*) begin case (sel) 2b00: y d[0]; 2b01: y d[1]; 2b10: y d[2]; 2b11: y d[3]; default: y 1b0; // 兜底分支避免综合出锁存器 endcase end endmodule关键点有三个。always (*)是组合逻辑的敏感列表写法等价于把右侧所有信号都列进去漏信号会综合出意外锁存器。default分支不能省虽然 2 位sel已经覆盖全部取值但综合工具对不完整分支的处理是补锁存器仿真和上板结果可能不一致。输出声明成reg只是因为它在always块里被赋值并不代表它会寄存这一点在报告里值得单独写一句免得被当成时序逻辑。3.3 testbench、iverilog 编译与 GTKWave 看图// tb_mux4.v —— 穷举 sel 的四种取值逐行打印结果 timescale 1ns/1ps module tb_mux4; reg [3:0] d; reg [1:0] sel; wire y; integer i; mux4 u_mux (.d(d), .sel(sel), .y(y)); initial begin $dumpfile(tb_mux4.vcd); // 波形文件名GTKWave 读它 $dumpvars(0, tb_mux4); // 0 表示记录本层及以下所有信号 d 4b1010; // 固定输入图案 1010便于逐位核对 for (i 0; i 4; i i 1) begin sel i[1:0]; #10; // 每档保持 10ns远大于门延时 $display(t%0t sel%b d%b - y%b, $time, sel, d, y); end $finish; end endmodule编译与运行# 把设计和 testbench 一起编译成 vvp 可执行文件 iverilog -g2012 -o tb_mux4.vvp tb_mux4.v mux4.v # 运行仿真终端会打印四行 sel/y 对应关系 vvp tb_mux4.vvp # 打开波形配合上面的 vcd 文件做截图 gtkwave tb_mux4.vcd 参数说明-g2012指定按 SystemVerilog-2012 语法子集解析用到了i[1:0]这类位选写法时不加会报错-o后面是输出文件名扩展名随意但习惯用.vvp$dumpvars(0, tb_mux4)的第一个参数是层级深度写 0 表示从当前层往下全部记录只在信号极多时才需要限制。#10的延时值只要远大于组合逻辑门延时即可写太小会导致波形上看起来像有毛刺。3.4 波形截图规范与静态险象的记录方式波形截图是报告里最容易糊弄、也最容易被追问的部分。规范只有一条截图上必须有时间轴、信号名和被测时刻的对应关系。截图时把sel、d、y三条信号放在一起光标停在跳变后的稳定区而不是跳变瞬间。观察项组合逻辑实验中的判据报告中怎么写输出稳态值跳变后 5ns 内稳定且等于真值表值附四个 sel 取值的截图跳变延时从 sel 变化到 y 变化的时间标注实测值与门级延时估算对比毛刺跳变瞬间出现的窄脉冲记录脉宽与出现条件注明是否影响后级静态险象输入变化前后理论输出应保持不变时出现窄脉冲结合卡诺图上的相邻圈解释成因静态险象是组合逻辑实验里最值得写的一段。它的成因可以在卡诺图上直接看出来两个相邻圈相切但不相交时输入在相切处变化会短暂失去覆盖输出出现窄脉冲。报告里写清「哪个输入变化、哪个圈失去覆盖、脉宽约多少」比写十句「存在竞争冒险现象」有价值得多。4. 时序逻辑实验触发器、模 10 计数器与状态机的验证写法时序逻辑的报告难点不在代码而在于把「时间」这件事写进文字里。组合逻辑只要一张真值表时序逻辑需要时钟沿、复位时刻、建立保持时间和状态序列四样东西同时对齐。4.1 时钟、复位与建立保持时间在报告里的落点时序逻辑的一切结论都以时钟沿为原点。报告里至少要说清三件事时钟频率和占空比、复位是高有效还是低有效、复位撤销发生在时钟沿的哪一侧。第二件事决定波形怎么读第三件事决定第一拍数据对不对。常见错误是复位在时钟上升沿附近撤销导致第一拍进入亚稳态输出看起来「随机错一次」这种问题在报告里应记为「复位撤销时刻与时钟沿过近」而不是笼统的「电路不稳定」。建立时间和保持时间在实验报告里不需要推导公式但需要一次实测或仿真观察把数据信号故意放在时钟沿前后 12ns 处变化看输出是否出现亚稳态。这个观察做一次报告的分析部分就有内容可写了。4.2 模 10 计数器的可综合实现与自检 testbench// cnt10.v —— 模 10 计数器带使能和进位输出 module cnt10 ( input wire clk, input wire rst_n, // 低电平异步复位 input wire en, // 计数使能低电平时保持 output reg [3:0] q, output wire carry // 计到 9 且使能有效时输出 1 ); assign carry (q 4d9) en; always (posedge clk or negedge rst_n) begin if (!rst_n) q 4d0; // 异步复位优先 else if (en) q (q 4d9) ? 4d0 // 到 9 回卷 : q 1b1; end endmodule// tb_cnt10.v —— 自检式 testbench出错时打印 FAIL 并计数 timescale 1ns/1ps module tb_cnt10; reg clk 0, rst_n, en; wire [3:0] q; wire carry; integer err 0; cnt10 u_cnt (.clk(clk), .rst_n(rst_n), .en(en), .q(q), .carry(carry)); always #5 clk ~clk; // 周期 10ns上升沿在 5,15,25... task check(input [3:0] exp, input [127:0] tag); begin if (q ! exp) begin err err 1; $display(FAIL %0s: q%0d 期望%0d, tag, q, exp); end else begin $display(PASS %0s: q%0d, tag, q); end end endtask initial begin rst_n 0; en 0; #12 rst_n 1; // t12 撤销复位 (negedge clk); // t20此时 q 仍为 0 check(4d0, 复位撤销后); en 1; // 在下降沿拉高远离上升沿避免竞争 repeat (9) (negedge clk); // 经历 9 个上升沿q 计到 9 check(4d9, 计到 9); (negedge clk); check(4d0, 回卷到 0); // 验证模 10 是否真的成立 en 0; repeat (3) (negedge clk); check(4d0, 使能拉低后保持); $display(总错误数 %0d, err); $finish; end endmodule参数说明check任务用!而不是!是为了把 X 和 Z 也判为失败模 10 计数器的回卷条件如果写错很容易出现 X 而普通比较会漏掉en 1放在negedge clk之后是为了让使能变化远离时钟上升沿这是 testbench 里避免竞争的标准做法-g2012编译选项在这里同样需要127位宽的字符串参数属于 SystemVerilog 扩展。运行方式与第 3 章一致把两个文件一起编译再vvp。终端会逐行打印 PASS/FAIL报告里的「数据分析」可以直接引用这些行并配上 GTKWave 里q从 9 回到 0 的那一段波形。4.3 状态机实验状态转移表怎么画才和波形对得上状态机实验最常被扣分的地方是状态转移表和波形对不上。原因往往是用了二进制编码、状态编号跳号或者输出写成了次态的函数。稳妥做法是先用状态名写转移表再单独说明编码方式。以检测序列「101」的 Moore 型状态机为例现态输入次态输出S0未匹配0S00S01S10S1已匹配 10S20S11S10S2已匹配 100S00S21S30S3已匹配 1010S21S31S11表里输出只跟现态有关这就是 Moore 机的定义也是波形上输出会比输入晚一个时钟沿的原因。如果报告里输出的时刻对不上先检查是不是按 Mealy 机的直觉去读了波形。编码方式建议在表后面单列一行比如用独热码或三位格雷码并说明为什么选它——独热码状态翻转少、译码快代价是触发器数量翻倍这个取舍写在报告里就是加分项。4.4 触发器实验记录字段与竞争冒险的区分做 D 触发器、JK 触发器这类基础实验时记录表的字段要比组合逻辑多两项时钟沿类型和触发前状态。异步置位、复位端与时钟端同时有效时输出的行为往往就是「竞争」和「冒险」的分界点。竞争指的是多个信号到达先后不确定冒险指的是这种不确定最终导致了错误输出两者不能混用。报告里写「存在竞争但未导致输出错误」和写「存在冒险」含义完全不同。5. 实验报告收尾的进阶技巧实测与仿真的三点锚定与 Word 排版避坑报告的最后一公里是把两套数据捏到一起一套来自仿真波形一套来自示波器或万用表。捏不好就会出现「仿真对、实测错」却解释不清的局面。5.1 实测与仿真的三点锚定不要逐点比对那样只会淹没在噪声里。只锚定三个时刻复位撤销后的第一拍、状态首次达到终值的那一拍、回卷或翻转发生的那一拍。锚点仿真值来源实测值来源允许偏差偏差过大时的排查方向复位后第一拍testbench 打印的第一行 q示波器上复位撤销后第一个时钟沿0 个状态复位有效电平、撤销时刻首次到终值计数到 9 / 状态进入 S3数码管或示波器首次数值0 个状态计数条件、使能逻辑回卷时刻q 由 9 变 0 的那个沿数码管由 9 跳 0≤1 个时钟周期回卷判断写法、门延时累积这张表填完实测和仿真的差异就有了明确归因分析段落也就自然成形。偏差出现在第一拍问题在复位出现在终值问题在条件判断出现在回卷问题常出在组合逻辑的累积延时时钟频率越高越明显。5.2 Word 里的波形图与表格返工点排版上的返工几乎都来自三个习惯。第一个是把波形图当图片直接缩放结果时间轴刻度看不清改法是在 GTKWave 里调整缩放后导出 PNG保持原始宽高比插入宽度占页面 80% 左右。第二个是数据表手工敲数字改一次数据就要核对一遍改法是前面所有表格都从 CSV 或仿真终端输出里用制表符整理后粘贴再用「文本转换成表格」一次性成型插图编号用交叉引用删表加表时按 F9 更新域编号自动重排。第三个是省略条件只写结论改法是把 2.1 的条件表放在报告最前面后面任何一处数据都能回指到具体条件。最后一个实际改动最省事的技巧把 testbench 的$display输出重定向到文件用重定向符号存成.txt再把内容按制表符替换后贴进 Word 表格这样每次重新仿真只需要重新贴一次贴板不用挨个单元格改数字——报告改到第五版时这一个习惯能省下大半个晚上。本文还有配套的精品资源点击获取
返回列表