verilog实现数码管动态扫描

数码管为共阳极连接,低电平有效,包括段选信号seg和和位选信号sel。代码包括参数定义,计数器,数码管动态扫描三个部分。源代码如下:

端口定义与参数设置:

module seg(
    input   wire            clk     ,
    input   wire            rst     ,
    input           [31:0]  dsp_num ,
    output  reg     [7:0]   seg     ,
    output  reg     [7:0]   sel
);

localparam idle = 8'b1111_1111;
localparam DSP_COUNT = 20'd50000;//1ms
reg  [19:0]     dsp_count;
reg  [ 3:0]     bits     ;

wire [31:0]     bcd      ;
reg  [ 7:0]     num [9:0];
initial begin //定义显示数字
    num[0] = 8'hC0;
    num[1] = 8'hF9;
    num[2] = 8'hA4;
    num[3] = 8'hB0;
    num[4] = 8'h99;
    num[5] = 8'h92;
    num[6] = 8'h82;
    num[7] = 8'hF8;
    num[8] = 8'h80;
    num[9] = 8'h90;
end
//控制显示位数
assign bcd[31:28] = dsp_num[31:16] % 10000 / 1000;
assign bcd[27:24] = dsp_num[31:16] % 1000  / 100 ;
assign bcd[23:20] = dsp_num[31:16] % 100   / 10  ;
assign bcd[19:16] = dsp_num[31:16] % 10          ;
assign bcd[15:12] = dsp_num[15: 0] % 10000 / 1000;
assign bcd[11: 8] = dsp_num[15: 0] % 1000  / 100 ;
assign bcd[ 7: 4] = dsp_num[15: 0] % 100   / 10  ;
assign bcd[ 3: 0] = dsp_num[15: 0] % 10          ;

 1ms计数器

//1ms counter
always @(posedge clk or posedge rst) begin
    if(rst) 
        dsp_count <= 20'd0;
    else begin
        if(dsp_count == DSP_COUNT - 1) begin
            dsp_count <= 20'd0;
        end
        else
            dsp_count <= dsp_count + 20'd1;
    end
end

数码管动态显示(标识符为C,记录两位数)

//dynamic display
always @(posedge clk or posedge rst) begin
    if(rst) begin
        seg  <= 8'b1111_1111;
        sel  <= 8'b1111_1111;
    end else begin
        if(dsp_count == DSP_COUNT - 1) begin
            if(bits == 4'd8)
                bits <= 4'd0;
            else
                bits <= bits + 4'd1;
            case(bits)
                4'd0: begin sel <= 8'b1111_1110; seg <= 8'b1100_0110;  end//标识符
                4'd1: begin sel <= 8'b1111_1111; seg <= (dsp_num[31:16] >  16'd999) ? num[bcd[27:24]] : idle;  end  
                4'd2: begin sel <= 8'b1111_1111; seg <= (dsp_num[31:16] >  16'd9  ) ? num[bcd[23:20]] : idle;  end
                4'd3: begin sel <= 8'b1111_1111; seg <= (dsp_num[31:16] >  16'd0  ) ? num[bcd[19:16]] : idle;  end
                4'd4: begin sel <= 8'b1111_1111; seg <= (dsp_num[15: 0] >  16'd999) ? num[bcd[15:12]] : idle;  end
                4'd5: begin sel <= 8'b1111_1111; seg <= (dsp_num[15: 0] >  16'd99 ) ? num[bcd[11: 8]] : idle;  end
                4'd6: begin sel <= 8'b1011_1111; seg <= (dsp_num[15: 0] >  16'd9  ) ? num[bcd[ 7: 4]] : idle;  end
                4'd7: begin sel <= 8'b0111_1111; seg <= (dsp_num[15: 0] >= 16'd0  ) ? num[bcd[ 3: 0]] : idle;  end
            endcase
        end
    end      
end

上述代码可实现共阳极7段数码管的动态显示,结合按键控制模块,UART,SPI,IIC等串口通信协议即可实现更加丰富的功能

        tips:

该代码复位按键为高电平有效

如何显示小数?代码示例如下

begin sel <= 8'b1101_1111; seg <= num[bcd[11: 8]]-8'b1000_0000;  end//显示小数点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值