一、数码管简介
数码管是一种用于数字显示的电子元件,通常由多个LED(发光二极管)组成。它们可以用来显示数字、字母、符号等,广泛应用于各种电子设备和仪器中,如时钟、计时器、温度计、测量仪表等。常见的七段数码管由七个LED组成,每个LED表示显示数字的一个部分。这七个LED排列成数字“8”的形状,同时加上小数点。通过控制这七个LED的点亮和熄灭,可以显示0到9的数字和一些字母。
二、显示原理
以6位7段数码管为例,一共有6×(7+1)=48个LED灯,每个LED灯都需要单独控制则一共需要48个IO端口,十分占用硬件资源。因此将位选信号进行共阳极连接,进行同时位选驱动(对于动态显示有其他处理方法),于是一共只需要6+8=14个IO端口。如下图所示,对于共阳极的数码管,当位选信号SEL为高电平时,段选信号为低电平时该位的某些LED灯被点亮(共阴极则相反)。当LEDSEG_CH为高电平时,SEL_T为高电平,此时PNP三极管截止,SEL位选信号为低电平,未被导通。因此对于PNP 型共阳极数码管,FPGA上输出的位选信号位低电平,段选信号位为0时被点亮。
对于PNP型共阳极数码管,段选信号输出组合可以唯一的对应到数字,下面是其真值表:
三、Verilog代码实现
主程序代码:
module seg_led_static(
input clk ,
input rst_n ,
output reg [3:0] seg_sel, //位选信号为1时被选通
output reg [7:0] seg_led, //段选信号为0时被选通
//output reg [25:0]cnt
);
reg [3:0] num ;
wire add_num;
wire end_num;
reg [25:0]cnt ;
wire add_cnt;
wire end_cnt;
//计数部分,cnt计数到1s
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt <= 25'd0;
else if(add_cnt)begin
if(end_cnt)
cnt <= 25'd50_000_000;
else
cnt <= cnt+25'd1;
end
end
assign add_cnt = (cnt < 25'd50_000_000) ? 1'b1 : 1'b0;
assign end_cnt = add_cnt && (cnt == 25'd50_000_000) ? 1'b1 : 1'b0;
//修改num
//每1秒时,num加1,直到4'hf
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
num <= 4'h0;
else if (add_num)begin
if(end_num)
num <= 4'h0;
else
num <= num+1'b1;
end
end
assign add_num = (cnt == 25'd50_000_000) ? 1'b1 :1'b0;
assign end_num = add_num && (num == 4'hf) ? 1'b1 :1'b0;
//译码部分
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
seg_sel <= 4'b000000000;
seg_led <= 8'b111111111;
end
else begin
seg_sel <= 4'b111111111;
case(num)
4'h0: seg_led <= 8'b1100_0000;
4'h1: seg_led <= 8'b1111_1001;
4'h2: seg_led <= 8'b1010_0100;
4'h3: seg_led <= 8'b1011_0000;
4'h4: seg_led <= 8'b1001_1001;
4'h5: seg_led <= 8'b1001_0010;
4'h6: seg_led <= 8'b1000_0010;
4'h7: seg_led <= 8'b1111_1000;
4'h8: seg_led <= 8'b1000_0000;
4'h9: seg_led <= 8'b1001_0000;
4'ha: seg_led <= 8'b1000_1000;
4'hb: seg_led <= 8'b1000_0011;
4'hc: seg_led <= 8'b1100_0110;
4'hd: seg_led <= 8'b1010_0001;
4'he: seg_led <= 8'b1000_0110;
4'hf: seg_led <= 8'b1000_1110;
default: seg_led <= 8'b1100_0000;
endcase
end
end
endmodule
测试代码:
`timescale 1 ps/ 1 ps
module seg_led_static_vlg_tst();
reg clk;
reg rst_n;
wire [7:0] seg_led;
wire [3:0] seg_sel;
seg_led_static i1 (
.clk(clk),
.rst_n(rst_n),
.seg_led(seg_led),
.seg_sel(seg_sel)
);
initial
begin
clk = 1'b0;
rst_n = 1'b0;
#40 rst_n = 1'b1;
end
always #10 clk = ~clk;
endmodule
仿真波形:
###本文参考正点原子视频,如有侵权,请联系删除。