【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_数码管

写在前面:本章主要内容为理解七点数码管显示的概念,并使用 Verilog 实现。生成输入信号后通过仿真确认各门的动作,通过 FPGA 检查在 Verilog 中实现的电路的操作。


Ⅰ. 前置知识

七段数码管是利用多重输出功能的非常有用的元件。该元件用于字符化,如十进制、十六进制数等。适当配置 7 个 

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_数码管_02

 元件,如图(a)所示,在每个端子上施加电压(logic "1"),使其发光,从而呈现字形(图b)。数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_git_03

(decimal point)。

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_git_04

七段数码管的工作原理 

多个发光二极管封装在一起的七段数码显示器按其连接形式可分为共正极显示器和共负极显示器。图7-1所示的共阳极和共阴极七段数码管,除显示数字必须是七笔外,还提供小数点。共阳极显示器的阳极连接在一起,向阳极提供正电压,阴极由限流电阻控制为高电平或低电平,以确定其是暗还是亮。共阴极显示器的阴极连接在一起,阴极可以接地,阴极可以由限流电阻控制为高电平或低电平,以确定它是亮还是暗。

Ⅱ.  练习(Assignment)

通过 (A) 完成真值表,通过真值表绘制出卡诺图,通过 Verilog 实现 0~F 并确认 Simulation 结果。

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_git_05


真值表:

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_fpga开发_06

卡诺图:

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_bc_07

a_out = b’d’+ad’+ab’c’+a’bd+a’c+bc

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_数码管_08

b_out = b’c’+b’d’+a’c’d’+a’cd+ac’d

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_数码管_09

c_out = a’b+ab’+c’d+a’c’+a’d

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_fpga开发_10

d_out = b’c’d’+b’cd+a’cd’+bc’d+abd’

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_bc_11

e_out = b’d’+cd’+ab+ac

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_bc_12

f_out = c’d’+bd’+a’bc’+ac+ab’

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_git_13

g_out = a’b’c+cd’+a’bc’+ab’+ad

💬 Design source:

`timescale 1ns / 1ps

module seven_segment(
input a, b, c, d,
output A, B, C, D, E, F, G, DP, digit
);
assign A = (b & c) | (~a & c) | (a & ~d) | (~b & ~d) | (~a & b & d) | (a & ~b & ~c);
assign B = (~b & ~d) | (~b & ~c) | (~a & c & d) | (a & ~c & d) | (~a & ~c & ~d);
assign C = (~c & d) | (~a & d) | (a & ~b) | (~a & b) | (~b & ~c);
assign D = (~a &c & ~d) | (~b & c & d) | (b & ~c & d) | (a & b & ~d) | (~b & ~c & ~d);
assign E = (c & ~d) | (a & c) | (a & b) | (~b & ~d);
assign F = (a & c) | (a & ~b) | (b & ~d) | (~c & ~d) + (~a & b & ~c);
assign G = (a & c) | (~b & c) | (a & ~b) | (b & ~c & d) | (~a & b & ~d);
assign digit =A|B|C|D|E|F|G;
assign DP = 1;

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module seven_segment_tb;
reg aa, bb, cc, dd;
wire A, B, C, D, E, F, G, DP, digit;

seven_segment u_seven_segment(
.a(aa),
.b(bb),
.c(cc),
.d(dd),
.A(A),
.B(B),
.C(C),
.D(D),
.E(E),
.F(F),
.G(G),
.DP(DP),
.digit(digit)
);

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;

always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;

initial begin
#1000
$finish;
end

endmodule

🚩 运行结果如下:

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_数码管_14

Schematic:

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_fpga开发_15

结果如下:

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_fpga开发_16

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display_fpga开发_17

📌 [ 笔者 ]   王亦优
📃 [ 更新 ] 2023.2.19
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.