ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LiberoSoc数字逻辑仿真验证实验报告:74HC与Verilog

LiberoSoc数字逻辑仿真验证实验报告:74HC与Verilog

简介:面向数字逻辑与EDA课程学习者及需要完成仿真验证实验的本科生,这份文档汇编了两个实验报告:一是基于LiberoSoc的Verilog数字逻辑设计与仿真,覆盖基本门电路、组合逻辑和时序逻辑的建模、激励设置与波形分析;二是基于数字逻辑实验箱的门电路测试,涉及74HC00、74HC02、74HC04、74HC08、74HC32、74HC86等芯片,以及74HC148编码器、74HC4511译码显示和74HC161十进制计数器的综合应用,并延伸到组合及时序逻辑综合实验。压缩包仅含1个docx,约1.43MB,以文字报告、数据表格和截图组织内容,便于查阅实验目的、仪器清单、原理说明、输入输出状态表与结果讨论,也保留了实验箱连线、七段数码管驱动和清零法或置数法的设计思路。已有938人学习,适合广东工业大学等相关课程学生对照完成预习、实验记录和报告撰写,也可为Verilog入门与EDA工具操作提供参考。

1. 一份数字逻辑课设,为什么要交两套实验报告

数字逻辑与 EDA 设计这门课,交付物通常有两套:实验箱上接线实测的 74HC 门电路数据,以及 LiberoSoc 里用 Verilog 建模、综合、仿真出的波形记录。这套基于 LiberoSoc 的数字逻辑设计仿真及验证实验报告把两套放在了一起——硬件侧做基本门电路、74HC148 加 74HC4511 的组合逻辑、74HC161 时序逻辑和最后的综合实验;EDA 侧用 Verilog 把同一批芯片重新描述一遍,跑仿真出波形,再用 SmartDesign 做顶层连线。合起来是九张真值表和六种门电路的仿真截图。

它适合两类人:正在赶数字逻辑课设、需要一份能照着填数据、能对上波形的人;以及要给课程准备实验指导的人。真正的难点不在写代码,而在两侧数据必须自洽——实验箱上测出 74HC00 输入 11 输出 0,仿真波形里也得是 0,答辩时被指着截图问一句,答不上来就露馅了。

2. 需求拆解与技术选型:两套报告、八个小项、九张数据表

2.1 两套报告各自考核什么

硬件侧那份报告的骨架是四个实验:基本门电路及门电路综合、组合逻辑电路、时序逻辑电路、组合及时序综合。前三个是验证性实验,第四个是设计性实验——用 74HC148 接八个按键,按下 0 到 7 让 74HC4511 驱动的七段数码管显示对应数字;再用 74HC161 搭一个十进制计数器,把计数值以 1Hz 频率送到数码管上。考核点很明确:你会不会看芯片手册的引脚定义,会不会处理控制类引脚(EI、LT、BI、CEP、CET、PE、MR 这些),以及能不能把"没有按键按下时数码管不显示"这种边界条件写进结果表里。

EDA 侧那份报告的骨架同样是四块:用 Verilog 写六种基本门、仿真 74HC148 与 74HC4511、仿真 74HC161、最后用 SmartDesign 做综合。区别在于多了一步"综合结果"——必须把综合后的资源占用或电路结构交上来,这就决定了工具不能只当仿真器用。两个实验箱实验和两个 EDA 实验在内容上一一对应,74HC00 对应 Verilog 里的一条 assign,74HC161 对应一个带异步清零和同步置数的 always 块,做完硬件再做仿真,理解会顺很多。

素材里有一张"实验内容完成情况"表,序号 1 到 8 依次是四个硬件实验和四个 EDA 实验,这张表其实是整份报告的目录,写报告时先把这八项列出来,再逐项填数据,结构就不会散。

2.2 为什么选 LiberoSoc 而不是随手找个仿真器

如果只是验证逻辑功能,任何能跑 Verilog 的仿真器都够用。但报告要求交综合结果和布局布线后的信息,就必须走完整流程:设计输入、综合、仿真、布局布线。LiberoSoc 覆盖的正是这条链路,同一套工程里既能看波形,也能看综合出来的门级结构,省掉了在两个工具之间来回导网表的麻烦。我一般会建议在新建工程时就把目标器件和工艺参数设好,别等综合报错了才回头改,改一次工程配置,前面的仿真结果就得重跑一遍。

另一个理由是器件库。74HC 系列是 CMOS 工艺的通用逻辑,课程实验箱上用的就是这一批芯片,LiberoSoc 的综合库对这类基础逻辑单元的映射比较直接,写出来的 assign 语句和最终电路能对得上,看完综合结果能反推自己代码写歪在哪。这一点对初学者特别重要——你写的~(a & b)和一个真实的与非门之间,隔着的就是综合这一步。

2.3 环境、器件与工具清单

把清单列清楚是报告的第一页,也是后面所有数据表的索引。硬件侧统一用数字逻辑与系统设计实验箱,配 74HC 系列直插芯片;软件侧统一用 LiberoSoc。下表按用途归类,写报告时可以直接当成"实验仪器及元器件"那一节的内容。

类别型号 / 工具实验中的角色使用要点
基本门74HC00四路二输入与非门输入接开关,输出接 LED 或逻辑笔
基本门74HC02四路二输入或非门引脚排列与 74HC00 不同,别插错
基本门74HC04六路反相器六路独立,实验只用其中几路
基本门74HC08四路二输入与门与 74HC00 引脚兼容性最好
基本门74HC32四路二输入或门同上
基本门74HC86四路二输入异或门常用于半加器验证
编码74HC1488-3 优先编码器输入输出均为低有效,注意 EI 与 EO
译码74HC4511BCD 到七段锁存译码驱动LT、BI 低有效,LE 锁存
显示LN3461Ax四位共阴极数码管段码高电平点亮
计数74HC161四位二进制同步计数器异步清零、同步置数
平台数字逻辑实验箱供电、时钟、LED、逻辑笔1Hz 时钟与单脉冲都要会取
软件LiberoSoc设计、综合、仿真、布局布线工程建好先设目标器件

清单里最容易被忽略的是 LN3461Ax 的"共阴极"三个字。共阴极意味着段码给高电平才亮,这决定了 74HC4511 的输出极性判断,也决定了后面写 Verilog 段码表时是7'b0111111还是它的按位取反。这一步搞反,实验箱上第一次上电就是全暗或者全亮,白折腾半小时。

3. 总体设计:从门电路到综合实验的四层模块划分

3.1 四层递进关系与每层的验收物

整套实验按能力递进分成四层。第一层是门级验证,验收物是表 1 到表 6 六张输入输出状态表,加上 EDA 侧的六段模块代码和对应波形截图。第二层是组合逻辑,硬件侧验证 74HC148 的编码功能和 74HC4511 的译码显示,验收物是表 7 和表 8;软件侧把这两个芯片用 Verilog 行为描述写出来,跑同样的输入组合,波形要和表 7、表 8 逐行对得上。第三层是时序逻辑,核心是 74HC161 的控制端优先级,验收物是表 9 那份功能表。第四层是综合实验,把前面三层的模块拼起来:硬件侧做按键到数码管的完整链路,软件侧用 SmartDesign 画顶层连线。

这四层的关系不是并列而是叠加。做第四层综合实验时,如果 4511 的段码表写错了,问题会表现为数码管显示乱码;如果 161 的清零方式选错,会表现为计数多跳一拍。这时候排查要往下钻一层,回到第二层或第三层找原因。我习惯在报告里给每一层单独留一节,把该层的模块清单、引脚定义、验收物列成小表,出问题时能快速定位是哪一层塌了。

层与层之间还有一条隐性约束:信号极性必须全程统一。74HC148 的输入低有效、74HC4511 的 LT 和 BI 低有效、74HC161 的 MR 和 PE 低有效,这一串"低有效"如果在中途某一层理解反了,后面所有波形都对不上。建议在报告开头就写一句极性约定,比如"本报告所有带横线的信号均以低电平为有效,代码中统一用!sig表示",这句约定能省掉后面一半的争论。

3.2 模块接口定义与信号命名约定

六个门电路模块的接口高度一致:两个输入向量、一个输出向量,位宽按芯片实际路数定。74HC00、74HC02、74HC08、74HC32、74HC86 都是四路,输入输出用 4 位向量;74HC04 是六路反相器,用 6 位向量。74HC148 的接口复杂一些:EI 使能输入、8 位数据输入、3 位编码输出、GS 和 EO 两个状态输出。74HC4511 是 LT、BI、LE 三个控制端加 4 位 BCD 输入、7 位段码输出。74HC161 是 MR、CP、CEP、CET、PE 五个控制端加 4 位数据输入、4 位输出、1 位进位输出 TC。

命名上我一般坚持三条:控制信号用芯片手册里的缩写,不自创名字;多位向量统一高位在左,写[3:0]而不是[0:3];测试平台里的激励信号加tb_前缀或者干脆用a、b这种和端口名对应的短名,避免和被测模块内部信号撞名。第三条看着琐碎,但真出过问题:测试平台里的 reg 变量和实例化模块的端口同名时,有些工具会给警告有些直接静默连接错,波形上一片 X,查半天以为是代码逻辑错。

3.3 九张数据表的填写口径

表 1 到表 6 是六种门电路的真值表,格式统一为"输入端 A、B(或单输入 A)、输出端 Y、LED 亮灭、逻辑状态"五列。填写口径要提前定死:LED 亮记逻辑 1,灭记逻辑 0,这一条在报告里必须写明,否则读者不知道你的"亮"代表什么。表 7 是 74HC148 的输入输出状态表,要覆盖 EI 有效和无效两种情况,以及八个输入端的优先级关系,表里用 X 表示任意状态。表 8 是 74HC4511 的译码表,要覆盖 LT 灯测试、BI 消隐和正常译码三种模式,还要覆盖 BCD 输入 1010 到 1111 这六个非法码对应的输出。表 9 是 74HC161 的功能表,按 MR、CP、CEP、CET、PE 的组合分五类:异步清零、同步置数、计数、保持、保持(TC 输出低)。

表 8 里那六个非法码是很多人漏掉的部分。74HC4511 对 1010 到 1111 的输出是"无显示",这个"无"在表里要写成全 0 段码,不能留空。同时报告里有一个思考题:"如果要同时显示 4 个数字,应如何处理?"这道题的正确方向是动态扫描——四位共用段码线,用位选信号分时点亮,靠视觉暂留合成四个数字。回答时把扫描频率和占空比的关系说清楚就够了,不用写代码。

表 9 的另一个思考题问"接连续的时钟信号中任何一路有何区别",问的其实是 CP 上升沿触发这个前提。74HC161 是上升沿触发,如果实验箱给的时钟是下降沿有效的,计数就会在错误的边沿动作,表现为数码管跳变和预期差半拍。回答这类思考题,把触发边沿、控制端有效电平、优先级顺序三件事讲明白,比堆公式有用。

4. 实现:六种门电路、编码译码与计数器的 Verilog 与仿真

4.1 六种门电路的 assign 建模

门电路的 Verilog 描述几乎没有设计空间,一条按位操作符就够。真正需要交代清楚的是位宽和端口方向——这两个参数直接决定波形对不对。

// 74HC00:四路二输入与非门,a/b 为 4 位输入向量,y 为按位与非结果 module HC00( input wire [4:1] a, input wire [4:1] b, output wire [4:1] y ); assign y = ~(a & b); endmodule // 74HC04:六路反相器,一个向量覆盖全部六路 module HC04( input wire [6:1] A, output wire [6:1] Y ); assign Y = ~A; endmodule

剩下四个门只是在运算符上换一下:74HC02 用~(a | b),74HC08 用a & b,74HC32 用a | b,74HC86 用a ^ b,位宽都是[4:1]。这里保留了原报告里[4:1]的下标写法,没改成更常见的[3:0],原因是报告正文的表 1 到表 6 是按 A、B 两列逐个填的,[4:1]的向量在波形窗口里从下往上数第 4 位到第 1 位,和表格的行序对得上,截图贴进报告时读者不用做心算换算。

参数上唯一要注意的是wire和reg的区别。assign语句的左边必须是wire,写成reg会直接编译报错;反过来在always块里赋值的信号必须是reg,写成wire同样报错。这个规则在写门电路时不会踩,写到 74HC148 和 74HC161 时一定会踩,因为那两个模块内部用的是always块。

4.2 测试平台的激励序列怎么排

测试平台决定波形上能看到什么。原报告里的激励写法很朴素:先把输入置成0000和0001,然后每过一个延时把 b 左移一位,走完四位;再把 a 换成全 1,重复一遍 b 的移位。这样一轮下来正好覆盖"a 全 0"和"a 全 1"两组条件下 b 的四种取值,六种门的真值表都能填满。

`timescale 1ns/1ns module tb_HC00(); reg [4:1] a, b; wire [4:1] y; HC00 u1(.a(a), .b(b), .y(y)); // 端口按名连接,避免顺序错位 initial begin a = 4'b0000; b = 4'b0001; // 第一组:a 全 0,b 逐位左移 #15 b = b << 1; #15 b = b << 1; #15 b = b << 1; a = 4'b1111; b = 4'b0001; // 第二组:a 全 1,b 再走一遍 #15 b = b << 1; #15 b = b << 1; #15 b = b << 1; #15 $stop; // 停在波形便于截图 end endmodule

timescale 1ns/1ns定义时间单位和精度,两个都是 1ns 时,#15就是 15 个时间单位。原报告里 74HC00 的测试平台用#15,其余五个门用#10,这个差异不影响正确性,只是波形横轴刻度不同;如果要贴进同一份报告,建议统一成#10,六张截图的时间轴一致,看起来也整齐。$stop放在最后是为了让仿真停在波形窗口而不是直接退出,方便调整窗口大小再截图。

例化时用.a(a)这种按名连接而不是按位置连接,是我强烈建议保留的习惯。六种门的端口名不统一(有的叫a/b,有的叫A/B),按位置连接时一旦记错顺序,仿真不会报错,只会输出一个错误的结果,波形上看起来还挺正常,这种错误最难查。

4.3 74HC148 与 74HC4511 的行为建模

74HC148 是 8-3 优先编码器,难点全在"低有效"和"优先级"两个词上。八个输入端 I0 到 I7 低电平有效,I7 优先级最高;输出 A2A1A0 是反码形式,也就是输入 I7 有效时输出 000。EI 是使能输入,低有效,EI 为高时芯片不工作,所有输出拉高。GS 表示有有效输入,EO 用于级联。

// 74HC148:输入输出均低有效,I7 优先级最高 module HC148( input wire EI, // 使能输入,低有效 input wire [7:0] I, // I0~I7,低有效 output reg [2:0] A, // 编码输出,反码 output reg GS, // 有有效输入时拉低 output reg EO // 级联输出 ); always @(*) begin if (EI) begin // EI 为高,芯片禁用 A = 3'b111; GS = 1'b1; EO = 1'b1; end else if (I == 8'b1111_1111) begin A = 3'b111; GS = 1'b1; EO = 1'b0; // 无输入,EO 拉低供级联 end else begin GS = 1'b0; EO = 1'b1; casez (I) // casez 用 ? 作通配,按高位优先匹配 8'b0???????: A = 3'b000; // I7 按下 8'b10??????: A = 3'b001; 8'b110?????: A = 3'b010; 8'b1110????: A = 3'b011; 8'b11110???: A = 3'b100; 8'b111110??: A = 3'b101; 8'b1111110?: A = 3'b110; 8'b11111110: A = 3'b111; // I0 按下 default: A = 3'b111; endcase end end endmodule

casez的匹配是从上往下逐条判断,第一条命中就跳出,所以把 I7 写在最前面就实现了优先级。用casez而不是case,是因为输入组合里有大量"不关心位",用?通配比把所有 256 种组合列全要现实得多。这个写法还有个好处:仿真时如果多个按键同时按下,输出由位置最高的那条分支决定,和真实芯片的行为一致,正好对应报告里"需要模拟多个按键按下时的输入输出映射"那条要求。

74HC4511 是 BCD 到七段译码驱动器,带锁存。控制端里 LT 是灯测试(低有效,全亮),BI 是消隐(低有效,全灭),LE 是锁存使能。段码输出 a 到 g 高电平有效,对应共阴极数码管。

// 74HC4511:BCD 到七段译码,段码高有效,SEG = {g,f,e,d,c,b,a} module HC4511( input wire LT, // 灯测试,低有效 input wire BI, // 消隐,低有效 input wire [3:0] DIN, // BCD 输入,DIN[3] 为最高位 output reg [6:0] SEG ); always @(*) begin if (!LT) SEG = 7'b1111111; // 灯测试优先,全亮 else if (!BI) SEG = 7'b0000000; // 消隐优先于译码 else begin case (DIN) 4'd0: SEG = 7'b0111111; 4'd1: SEG = 7'b0000110; 4'd2: SEG = 7'b1011011; 4'd3: SEG = 7'b1001111; 4'd4: SEG = 7'b1100110; 4'd5: SEG = 7'b1101101; 4'd6: SEG = 7'b1111101; 4'd7: SEG = 7'b0000111; 4'd8: SEG = 7'b1111111; 4'd9: SEG = 7'b1101111; default: SEG = 7'b0000000; // 1010~1111 非法码,无显示 endcase end end endmodule

段码按{g,f,e,d,c,b,a}从高到低排列,数字 0 对应 a 到 f 亮、g 灭,写成0111111。这个顺序如果和实际接线顺序不一致,显示出来的数字会是镜像或者乱序,所以报告里必须写清段码的位序定义。default分支处理 1010 到 1111,输出全 0 即无显示,这和表 8 里那六行的"无"一一对应。

4.4 74HC161 与十进制计数器的两种写法

74HC161 是四位二进制同步计数器,控制端有五个,优先级从高到低是:MR 异步清零、PE 同步置数、CEP 和 CET 同时有效时计数、否则保持。TC 是进位输出,计数值到 1111 且 CET 有效时拉高。

// 74HC161:异步清零、同步置数、双使能计数 module HC161( input wire MR, // 异步清零,低有效,不看时钟 input wire CP, // 上升沿触发 input wire CEP, CET, // 计数使能,两者同时为高才计数 input wire PE, // 同步置数,低有效 input wire [3:0] D, output reg [3:0] Q, output wire TC ); assign TC = (Q == 4'b1111) & CET; // 计满且 CET 有效时进位 always @(posedge CP or negedge MR) begin if (!MR) Q <= 4'b0000; // 异步清零,不等待时钟 else if (!PE) Q <= D; // 同步置数,等上升沿 else if (CEP && CET) Q <= Q + 1'b1; // 计数 // 其余情况保持,不写赋值语句即为保持 end endmodule

敏感列表里negedge MR这一项是异步清零的关键,少了它清零就要等时钟沿,功能表里"复位,异步清零"那一行就对不上。反过来,PE 只出现在always块内部,靠posedge CP触发,所以是同步置数。这两个词的区别在表 9 里就体现为 CP 那一列有没有"↑"符号。

十进制计数器有清零法和置数法两条路。清零法是让计数器自然计到 1010,用译码出的信号拉低 MR,异步清回 0000;置数法是在计到 1001 时拉低 PE,等下一个上升沿把 0000 同步装进去。

// 置数法实现十进制:计到 9 后由 PE 同步回卷,无毛刺 module cnt10_load( input wire CP, RSTn, output wire [3:0] Q ); wire [3:0] q; wire at9 = (q == 4'b1001); // 到 9 就准备回卷 HC161 u_cnt( .MR (RSTn), .CP (CP), .CEP(1'b1), .CET(1'b1), .PE (~at9), // 低有效,到 9 时拉低 .D (4'b0000), .Q (q), .TC () ); assign Q = q; endmodule

置数法的好处是回卷发生在时钟上升沿,Q 从 1001 直接变成 0000,中间不会出现 1010 这个瞬时状态。清零法虽然也能得到十进制的循环,但 Q 会短暂出现 1010,如果这个计数器的输出同时送到译码器,数码管上会闪一下不该出现的字符——这就是后面避坑章节要讲的多跳一拍。两种方法在报告里都写一遍,再说明为什么最终选置数法,比只写一种更有说服力。

4.5 实验箱接线与 SmartDesign 综合

硬件侧的综合实验是这么接的:八个开关模拟按键 0 到 7,接到 74HC148 的 I0 到 I7,EI 接地保持使能;148 的 A2A1A0 接 4511 的 BCD 输入,注意 148 输出是反码,接线时要么在中间加反相器,要么在报告里说明这是反码直连、显示值按反码解释;4511 的段码输出接 LN3461Ax 的 a 到 g,LT 和 BI 接高电平保持正常译码。没有按键按下时 148 的 GS 为高,可以用 GS 控制 4511 的 BI,实现"无按键时数码管不显示"这条设计要求——这是这道题里最能体现设计水平的一处细节,比单纯连线得分高。

时序侧的综合实验是 74HC161 加置数法反馈构成十进制,CP 接实验箱的 1Hz 时钟,Q 接 4511 的 BCD 输入,再把 4511 驱动数码管。1Hz 是肉眼能看清跳变的上限,再快就只能看到"8"字常亮。

软件侧的 SmartDesign 是把前面写好的 HC148、HC4511、HC161 三个模块在图形界面里例化、连线、生成顶层。这一步的验收物是顶层连接图加综合报告。连线时容易出现的问题是端口方向搞反——把 output 连到 output,工具通常只给警告不给错误,综合出来是一堆悬空网络。我的做法是生成顶层后先跑一次综合,看有没有 unconnected 或者 multi-driven 的警告,有就回头查连线,别急着跑仿真。

5. 避坑与排查:五条最容易翻车的点

5.1 波形一片 X:向量方向写了 [4:1] 却按 [3:0] 赋值

现象:仿真跑完,波形窗口里 y 一直是红色的 X,输入 a 和 b 倒是正常跳变。

原因:模块端口声明成[4:1],测试平台里却按[3:0]去赋值或者取位。Verilog 不会因为下标越界报错,只会让没被驱动到的位保持 X,而门电路的按位运算只要有一位是 X,结果那一整位就是 X。另一个同类原因是端口声明成wire却在always块里赋值,或者例化时端口顺序写错。

解决:全篇统一位宽写法,要么全程[4:1],要么全程[3:0],改的时候模块和测试平台一起改。例化一律用按名连接.a(a)。跑仿真前先看编译日志里的 warning,位宽不匹配的警告一条都别放过。

5.2 数码管全暗或显示乱码:共阴共阳和 LT/BI 接反

现象:上电后数码管要么一位都不亮,要么显示的字符缺笔画,要么数字顺序全乱。

原因:三个可能性。一是数码管极性搞错,LN3461Ax 是共阴极,段码要给高电平才亮,如果按共阳极的思路去理解,段码表整个取反。二是 4511 的 LT 和 BI 都是低有效,直接接地会进入灯测试或者消隐模式,看起来就像坏了。三是段码位序和实际接线顺序不一致,a 到 g 接反了,显示出来的数字是镜像的。

解决:先单独测一段——把 4511 的 LT 拉低,看是不是全亮,全亮说明数码管和连线没问题,问题在译码输入;再检查 BI 是否被误拉低;最后用数字 1 做基准,1 只点亮 b、c 两段,看亮的是不是右上和右下两段,以此确认位序。

5.3 计数器多跳一拍:把异步清零当同步用

现象:十进制计数器在 9 之后没有回到 0,而是跳了一下才归零,或者计数到 15 才回卷,中间多出几个非法状态。

原因:清零法和置数法混用了。74HC161 的 MR 是异步清零,信号一到立刻生效,不等时钟;PE 是同步置数,要等下一个上升沿。如果用译码 1010 去驱动 MR,1010 这个状态会真实存在极短一段时间,下游译码器就会把它当成非法码处理一次。如果用 1001 去驱动 MR,那计数器根本到不了 9,最多显示 8。

解决:改用置数法,译码 1001 去拉低 PE,让 0000 在上升沿同步装入;或者干脆把反馈信号打一拍再用。判断依据是看波形上 Q 有没有出现过不该出现的值,出现了就是异步路径在作怪。

5.4 仿真跑完没有波形:测试平台没被设为顶层

现象:点了仿真,进度条走完了,波形窗口是空的,或者只有几条平线。

原因:仿真工具默认跑的是当前选中的顶层模块,如果选中的是被测模块本身而不是测试平台,激励就没人施加,输入保持初始值 X 或 0,波形自然没内容。另一种情况是测试平台里忘了写$stop或者$finish,仿真一直跑但波形窗口没刷新。

解决:仿真前确认顶层是tb_xxx而不是HCxxx,跑完手动把波形窗口的缩放调到全览。养成在测试平台末尾加$stop的习惯,跑完停下来再截图,别在仿真还在跑的时候截。

5.5 截图返工:白底、缩放、标注三件事没做

现象:报告交上去被打回,理由是波形截图看不清或者没注明对应哪个门电路。

原因:默认波形窗口是深色背景,打印出来一片黑;窗口没调整大小,波形挤在一起看不清跳变沿;六张截图长得一样,读者分不清哪张是 74HC00 哪张是 74HC32。

解决:仿真前把波形窗口背景改成白色,跑完调整窗口到合适大小让波形完整显示,截图时把模块名和输入输出信号名一起框进去。每张图下面加一行文字说明,写清是哪个芯片、哪组输入输出。这活儿花不了几分钟,但省下的返工时间远不止几分钟。

6. 验收与答辩:把九张表和六张波形串成一条证据链

验收时最有说服力的不是代码写得多漂亮,而是数据能对上。我的建议是在报告最后加一张"数据对照表",把每一张硬件数据表和它对应的仿真波形列在同一行,这样翻报告的人一眼就能看出两边是否自洽。

硬件侧数据对应仿真物对照要点
表 1 至表 6 门电路真值表六个门模块的波形截图同一组输入下 LED 状态与波形电平一致
表 7 74HC148 状态表HC148 仿真波形优先级顺序、EI 无效时全高
表 8 74HC4511 译码表HC4511 仿真波形段码位序、非法码输出全 0
表 9 74HC161 功能表HC161 仿真波形清零是否等时钟、计数是否双使能
综合实验接线表SmartDesign 顶层连接图148 反码输出如何接 4511

答辩最常被问的三个问题,提前准备好答案能省掉一半紧张。第一个是"为什么用置数法不用清零法",答案落在异步清零会产生瞬时非法状态、下游译码会闪一下。第二个是"148 输出是反码,你怎么让数码管显示正确的数字",答案要么是在中间加一级反相,要么是明确说这里按反码解释、并在报告里标注。第三个是"多个按键同时按下会怎样",答案在casez的优先级匹配上——位置最高的输入说了算,这正是优先编码器名字的由来。

还有一个常被忽略的细节:报告里的思考题不是装饰。表 8 后面问"同时显示 4 个数字怎么处理",问的是动态扫描;表 9 后面问"接连续时钟的任意一路有何区别",问的是上升沿触发和分频。这两道题答得好,答辩时老师基本不会再往深里问。

我头一回带这类实验报告的时候,吃过一次亏:硬件侧测出来 74HC02 的输出和仿真波形差了一位,当时以为是芯片坏了,换了两块板子都一样,最后发现是测试平台里b的移位次数少写了一次,波形上少了一个状态,对着表一填就串行了。从那以后我每次交报告前都强制走一遍"表格逐行对波形、波形逐段对代码"的流程,宁可多花二十分钟,也不要在答辩现场被人指着截图问"这一行哪来的"。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进