静态数码管

一、数码管简介

        数码管是一种用于数字显示的电子元件,通常由多个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

        仿真波形:

###本文参考正点原子视频,如有侵权,请联系删除。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值