数逻实验6 七段数码管显示译码器设计与应用
某不烦
2021年02月03日 14:25
收录于文集
共13篇

写在前面

        实验六制作的是一位七段数码管译码。虽然能通过开关控制四位小数点、数字是否显示,但其实显示地都是同一位数字。之后的实验可以复用实验六设计的模块实现4位16进制七段数码管的显示。

        七段数码管显示译码器设计实验是后续实验的基础,后续实验的输出显示基本都以其为子模块。并且大程的输出显示最基础的要求便是七段数码管显示,因此务必理解实验原理。


实验六 七段数码管显示译码器设计与应用

1. 实验目的和要求

  • 掌握七数码管显示原理

  • 掌握七段码显示译码设计

  • 进一步熟悉 Xilinx ISE 环境及 SWORD 实验平台

2. 实验内容和原理

2.1 实验内容

  • 任务1:原理图设计实现显示译码 MyMC14495 模块

  • 任务2:用 MyMC14495 模块实现数码管显示

2.2 实验原理

2.2.1 显示译码 MyMC14495 模块设计

        七段数码管有 a-g 7个输出,再加上 ‘.’ 一个输出,所以由此考虑可以用 3-8 译码器实现这一数码管的亮灭控制

图表1 七段数码管构造示意图

        注:不一定输出为 1 时灯才亮,也有可能输出为 0 灯亮。

        如下图,当一端接低电平时,输入为 1 才亮;当接高电平时,输入为0,有电压差才亮

图表2 其他七段数码管示意图

        具体显示方式如下图所示:

图表3 BCD七段数码管译码器对应的十六进制数

        根据以上 16 个不同的显示情况,可以写出下图的真值表:

图表4 七段数码管BCD译码器真值表

        由卡诺图可以简化得到如下函数:

图表5 卡诺图简化后函数

        根据函数可以绘制如下逻辑电路图:

图表6 七段数码管BCD译码器逻辑电路图

2.2.2 用MyMC14495 模块实现数码管显示

        自定义生成一个 MyMC14495 以后,可以用自动生成的符号绘制如下电路图:

图表7 原理图绘制数码管显示模块

        导出到 SWORD 实验板上进行验证。

3. 主要仪器设备

  • 装有 Xilinx ISE 14.7 的计算机 1 台

  • SWORD 开发板 1 套

4. 操作方法和实验步骤

4.1 设计实现显示译码 MyMC14495 模块

4.1.1 创建工程

  1. 新建工程,工程名称为”MyMC14495”

  2. 右键 Source 窗口空白处,新建 schematic 源文件,文件名称用 MyMC14495

图表8 新建工程和源文件

4.1.2 用原理图方式绘制电路

  1. 双击新建的 MyMC14495.sch,绘制如下电路图

图表

    2. 绘制完成以后对电路进行错误检查,点击 Process 窗口的 Design -> Check Design Rules 进行语法检查,确认无误后点击 Design Utility -> View HDL Functional Model,查看并学习电路图的 Verilog HDL 代码

4.1.3 仿真波形测试

    1. 新建一个测试文件, 选择 Verilog Test Fixture,命名为 MyMC14495_Number_sim.v

    2. 输入下列代码进行测试:

代码块
Rust
自动换行
复制代码
`timescale 1ns / 1ps

module MyMC14495_3190103044_MyMC14495_3190103044_sch_tb();
// Inputs
   reg D2;
   reg D1;
   reg D0;
   reg D3;
   reg LE;
   reg point;
// Output
   wire p;
   wire g;
   wire f;
   wire e;
   wire d;
   wire c;
   wire b;
   wire a;
// Bidirs
// Instantiate the UUT
   MyMC14495_3190103044 UUT (
		.D2(D2), 
		.D1(D1), 
		.D0(D0), 
		.D3(D3), 
		.LE(LE), 
		.point(point), 
		.p(p), 
		.g(g), 
		.f(f), 
		.e(e), 
		.d(d), 
		.c(c), 
		.b(b), 
		.a(a)
   );
// Initialize Inputs
	integer i;
	initial begin
		D3 = 0;
		D2 = 0;
		D1 = 0;
		D0 = 0;
		LE = 0;
		point = 0;
		
		for (i=0; i<=15;i=i+1) begin
			{D3,D2,D1,D0}=i;
		point = i;	#50;
		end
		
		#50;
		LE = 1;
	end

endmodule
复制成功

    3. 测试完成后点击 Simulate Behavioral Model,将生成的波形图与理论进行对照,如果一致则证明电路图绘制无误;如果有错误,检查后改正或者重新绘制

4.1.4 生成逻辑符号图和 .v 文件

        点击 Process 窗口下的 Design Utilities -> Create Schematic Symbol,在工程文件夹里可以找到相应的 .sym 文件。

        注:自动生成的符号可以修改:可以用 Tools 菜单的 Symbol Wizard,也可以打开 .sym 文件直接修改;View HDL Function Model 会产生 MyMC14495.vf 文件,在工程文件夹里可以找到

图表6 生成逻辑符号图和 .vf 文件

4.2 用 MyMC14495 模块实现数码管显示

4.2.1 创建工程

    1. 新建工程 DispNumber_sch

    2. 新建 schematic 文件 DispNumber_sch

    3. 复制 MyMC14495.sym 和 .vf 到工程根目录,并将其添加到工程中

    4. 创建完成后的工程如下图所示:

图表7 新建工程

4.2.2 绘制测试电路图

        在 symbol 框中的第一个元件就是 MyMC14495(命名为 MyMC14495_Number),点击就可以进行绘制。绘制电路图如下:

图表8 测试电路图绘制

        注:这里 a-g 的输出要与实际 SWORD 板上一致,不然最后的结果是错误的。建议 a-g 按照 0-6 的顺序,p 连接 7

4.2.3 引脚定义

        新建 Implementation Constraints File 文件,命名为 K7.ucf,添加如下代码:

代码块
Rust
自动换行
复制代码
NET "SW[0]"				LOC = AA10  | IOSTANDARD = LVCMOS15;
NET "SW[1]"				LOC = AB10  | IOSTANDARD = LVCMOS15;
NET "SW[2]"				LOC = AA13  | IOSTANDARD = LVCMOS15;
NET "SW[3]"				LOC = AA12  | IOSTANDARD = LVCMOS15;

NET "SW[4]"				LOC = Y13   | IOSTANDARD = LVCMOS15; #AN0
NET "SW[5]"				LOC = Y12   | IOSTANDARD = LVCMOS15; #AN1
NET "SW[6]"				LOC = AD11  | IOSTANDARD = LVCMOS15; #AN2
NET "SW[7]"				LOC = AD10  | IOSTANDARD = LVCMOS15; #AN3
               		
NET "point"				LOC = AF13  | IOSTANDARD = LVCMOS15 ;#SW[14]
NET "LE"				LOC = AF10  | IOSTANDARD = LVCMOS15 ;#SW[15]

NET "SEGMENT[0]"		LOC = AB22     	| IOSTANDARD = LVCMOS33 ;#a
NET "SEGMENT[1]" 		LOC = AD24		| IOSTANDARD = LVCMOS33 ;#b
NET "SEGMENT[2]" 		LOC = AD23		| IOSTANDARD = LVCMOS33 ;
NET "SEGMENT[3]" 		LOC = Y21		| IOSTANDARD = LVCMOS33 ;
NET "SEGMENT[4]" 		LOC = W20		| IOSTANDARD = LVCMOS33 ;
NET "SEGMENT[5]" 		LOC = AC24		| IOSTANDARD = LVCMOS33 ;
NET "SEGMENT[6]" 		LOC = AC23		| IOSTANDARD = LVCMOS33 ;#g
NET "SEGMENT[7]" 		LOC = AA22		| IOSTANDARD = LVCMOS33 ;#point

NET "AN[0]" 			LOC = AD21      | IOSTANDARD = LVCMOS33 ;
NET "AN[1]" 			LOC = AC21      | IOSTANDARD = LVCMOS33 ;
NET "AN[2]" 			LOC = AB21      | IOSTANDARD = LVCMOS33 ;
NET "AN[3]" 			LOC = AC22      | IOSTANDARD = LVCMOS33 ;
复制成功

4.2.4 导出检验

图表9 检验逻辑功能

        通过以上检测后,点击 Configure Target Device -> Manage Configuration Project,导出到 SWORD 实验板上进行验证

5. 实验结果和分析

5.1 显示译码器 MyMC14495

        经过调试,最终正确的仿真波形测试的结果如下:

图表10 仿真波形

        将测试结果与理论对比后发现二者一致,绘制电路图功能正常

5.2 用 MyMC14495 模块实现数码管显示

        导出到 SWORD 实验板的实验结果如下图所示,测试顺序按照实验原理的真值表:

6. 讨论与心得

6.1 绘制原理图

6.1.1 原理图画板尺寸修改

Lab6 的实验原理图比较复杂,使用初始的画板尺寸很难规整地画下来,需要修改画板尺寸。

方法:双击白色背景,可以设置画板尺寸。

6.1.2 原理图纠错

技巧1:对比物理验证过程中显示有误的数字所对应的仿真图,检查数字显示有误对应的电路图模块。

技巧2:检查时选中 “branch” 进行查看,可以看到被选中的 branches 全部高亮(红色)显示,更清晰地看到它们的连接状态。在修改时则在 Option 中将选项修改为 Select Segment,便于删除、移动线段。

6.2 仿真测试

6.2.1 仿真测试中各项波形的对比

先将各项位置调整成与理论结果中各项位置一致,再进行比较,更容易看出错误,降低遗漏差异的概率。

6.2.2 修改原理图后再仿真

有时修改原理图后再进行仿真会不成功,点击按钮无反应或运行成功但没有进入仿真窗口。这个时候可以选择假装修改仿真代码,使其重新检测加载。若无效,可以将原有的文件 remove 后,新建一个仿真文件进行仿真。


        本次实验让我深刻体会到了鼠标的重要性。实验课前一天鼠标坏了,课上用触控板绘图画的我很自闭。七段数码管BCD译码器的原理图比较复杂,连线容易出错,也可以通过 verilog 代码的形式,直接根据真值表对其进行赋值。这种方法简便很多,这里不展开。

        欢迎评论区或私信讨论,感谢三连与批评指正。