EGo1下板_数码管动态显示

1. 分时复用

  • 单个数码管的显示电路中,每个数码管都需要有7个LED管和1个小圆点,需要8个IO端口。
  • 为了减少实际使用的FPGA芯片的IO端口,可采用分时复用的扫描显示方案进行数码管驱动。分时复用的扫描显示利用了人眼的视觉暂留特性,如果公共端控制信号的刷新速度足够快,人眼就分辨不出LED的闪烁,认为数码管时同时点亮的。控制信号的最佳刷新频率为1000Hz左右
  • 以四个数码管显示为例,采用扫描显示方案进行驱动时,四个数码管的8个段码并接在一起,再以4个IO分别控制每个数码管的公共端,动态点亮数码管。这样只用12个IO口就可以实现4个数码管的显示控制,比静态显示方法的32个IO口数量少多了。

位选信号:用于控制哪个数码管亮;
段选信号:用于控制数码管显示的内容;

2. 代码

module top_led_dynamic(
    output  reg    [7:0]    seg,	// 数码管的公共段选信号
    output  reg    [3:0]    an,		// 作为4个数码管的位选信号
    
    input   wire            clk,
    input   wire            rst,
    input   wire    [3:0]   in3, in2, in1, in0
    );
    	// EGo1数码管是共阴极的,需要连接高电平,对应位置被点亮
	   parameter   _0 = ~8'hc0;
	   parameter   _1 = ~8'hf9;
	   parameter   _2 = ~8'ha4;
	   parameter   _3 = ~8'hb0;
	   parameter   _4 = ~8'h99;
	   parameter   _5 = ~8'h92;
	   parameter   _6 = ~8'h82;
	   parameter   _7 = ~8'hf8;
	   parameter   _8 = ~8'h80;
	   parameter   _9 = ~8'h90;
	   parameter   _a = ~8'h88;
	   parameter   _b = ~8'h83;
	   parameter   _c = ~8'hc6;
	   parameter   _d = ~8'ha1;
	   parameter   _e = ~8'h86;
	   parameter   _f = ~8'h8e;
	   parameter   _err = ~8'hcf;
	   
	   parameter   N = 18;
    
       
    reg     [N-1 : 0]  regN; 
    reg     [3:0]       hex_in;
    
    always @ (posedge clk or posedge rst)   begin
        if (rst == 1'b0)    begin
            regN    <=  0;
        end else    begin
            regN    <=  regN + 1;
        end
    end
    // regN实现对100MHz的系统时钟的2^16分频
    always @ (*)    begin
        case (regN[N-1: N-2])
            2'b00:  begin
                an  <=  4'b0001;
                hex_in  <=  in0;
            end
            2'b01:  begin
                an  <=  4'b0010;
                hex_in  <=  in1;
            end
            2'b10:  begin
                an  <=  4'b0100;
                hex_in  <=  in2;
            end
            2'b11:  begin
                an  <=  4'b1000;
                hex_in  <=  in3;
            end
            default:    begin
                an  <=  4'b1111;
                hex_in  <=  in3;
            end
        endcase
    end
    
    always @ (*)    begin
        case (hex_in)
            4'h0:   seg <=  _0;
            4'h1:   seg <=  _1;
            4'h2:   seg <=  _2;
            4'h3:   seg <=  _3;
            4'h4:   seg <=  _4;
            4'h5:   seg <=  _5;
            4'h6:   seg <=  _6;
            4'h7:   seg <=  _7;
            4'h8:   seg <=  _8;
            4'h9:   seg <=  _9;
            4'ha:   seg <=  _a;
            4'hb:   seg <=  _b;
            4'hc:   seg <=  _c;
            4'hd:   seg <=  _d;
            4'he:   seg <=  _e;
            4'hf:   seg <=  _f;
            default:seg <=  _err;
        endcase
    end
            
endmodule

EGo1下板_数码管动态显示_第1张图片
EGo1下板_数码管动态显示_第2张图片
EGo1下板_数码管动态显示_第3张图片

你可能感兴趣的:(Verilog实验,fpga开发)