最专业的FPGA ZYNQ论坛--黑金动力社区

 找回密码
 注册
查看: 140|回复: 1

数码管0~9999数字显示遇到的问题

[复制链接]
movit 发表于 2017-9-5 20:26:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
操作目的是每过一秒,数据加一,从0至9999,并显示在四段数码管上,显示的数据参考黑金建模篇进行处理,然后对各个位进行SMG编码,位选扫描信号选中哪一位,就将对应位的数据送入段选。实际的效果是数码管从9999递减,并且每次减九,不知道是什么原因,还请大家指教;






/****************************************************************

                                                                0~9999数字循环显示
                                                               
****************************************************************/



module disnum(clk,rst,segcn,segdis);

input clk,rst;
output reg [3:0] segcn=4'b1110;
output reg [7:0] segdis;

reg [7:0] segdis_qian,segdis_bai,segdis_shi,segdis_ge;
reg [25:0] timer0;        //1ms定时器reg [10:0] countnum1;
reg [13:0] disnumer;                  //显示数字

//1ms扫描,segtemp存储位选信号,第一次直接取反,随后移位取反;移位三次后,segtemp置0001;
always@(posedge clk or negedge rst)

if(!rst)
        begin
                countnum1<=11'd0;
                timer0<=26'b0;
                segcn<=4'b1110;
        end
       
else if(timer0>=26'd10_0000)
        begin
                timer0<=0;
                segcn<={{segcn[2:0]},segcn[3]};
                countnum1<=countnum1+1;
                if(countnum1>500)
                        countnum1<=0;
        end                       
               
else
        timer0<=timer0+26'd1;


       
//每扫描一周,显示数据加一,并获得各位数;       
reg [3:0] qian,bai,shi,ge;
always@(posedge clk or negedge rst)

begin

        if(!rst)
                begin
                        disnumer<=14'd0;
                        ge[3:0]<=4'd0;
                        shi[3:0]<=4'd0;
                        bai[3:0]<=4'd0;
                        qian[3:0]<=4'd0;
                end
               
        else if(countnum1==500)
                begin
                        disnumer<=disnumer+14'd1;
                       
                        ge[3:0]<=disnumer%10;
                        shi[3:0]<=(disnumer/10)%10;
                        bai[3:0]<=(disnumer/100)%10;
                        qian[3:0]<=disnumer/1000;

                        if(disnumer>9999)
                                disnumer<=14'd0;
                end
        else;
               
end


//将四位十进制数的各位表示成smg码;
always@(disnumer)

begin
        case(qian)
                4'd0:segdis_qian<=8'b0000_0011;
                4'd1:segdis_qian<=8'b1001_1111;
                4'd2:segdis_qian<=8'b0010_0101;
                4'd3:segdis_qian<=8'b0000_1101;
                4'd4:segdis_qian<=8'b1001_1001;
                4'd5:segdis_qian<=8'b0100_1001;
                4'd6:segdis_qian<=8'b0100_0001;
                4'd7:segdis_qian<=8'b0001_1111;
                4'd8:segdis_qian<=8'b0000_0001;
                4'd9:segdis_qian<=8'b0000_1001;
                default:segdis_qian<=8'b1111_1111;
        endcase
               
        case(bai)
                4'd0:segdis_bai<=8'b0000_0011;
                4'd1:segdis_bai<=8'b1001_1111;
                4'd2:segdis_bai<=8'b0010_0101;
                4'd3:segdis_bai<=8'b0000_1101;
                4'd4:segdis_bai<=8'b1001_1001;
                4'd5:segdis_bai<=8'b0100_1001;
                4'd6:segdis_bai<=8'b0100_0001;
                4'd7:segdis_bai<=8'b0001_1111;
                4'd8:segdis_bai<=8'b0000_0001;
                4'd9:segdis_bai<=8'b0000_1001;
                default:segdis_bai<=8'b1111_1111;
        endcase
       
        case(shi)
                4'd0:segdis_shi<=8'b0000_0011;
                4'd1:segdis_shi<=8'b1001_1111;
                4'd2:segdis_shi<=8'b0010_0101;
                4'd3:segdis_shi<=8'b0000_1101;
                4'd4:segdis_shi<=8'b1001_1001;
                4'd5:segdis_shi<=8'b0100_1001;
                4'd6:segdis_shi<=8'b0100_0001;
                4'd7:segdis_shi<=8'b0001_1111;
                4'd8:segdis_shi<=8'b0000_0001;
                4'd9:segdis_shi<=8'b0000_1001;
                default:segdis_shi<=8'b1111_1111;
        endcase
               
        case(ge)
                4'd0:segdis_ge<=8'b0000_0011;
                4'd1:segdis_ge<=8'b1001_1111;
                4'd2:segdis_ge<=8'b0010_0101;
                4'd3:segdis_ge<=8'b0000_1101;
                4'd4:segdis_ge<=8'b1001_1001;
                4'd5:segdis_ge<=8'b0100_1001;
                4'd6:segdis_ge<=8'b0100_0001;
                4'd7:segdis_ge<=8'b0001_1111;
                4'd8:segdis_ge<=8'b0000_0001;
                4'd9:segdis_ge<=8'b0000_1001;
                default:segdis_ge<=8'b1111_1111;
        endcase

end

//数码管数据显示,扫描至第几位,显示相应数;
always@(segcn)
begin
segdis<=8'b1111_1111;
if(segcn==4'b1110 )
segdis<=segdis_ge;
else if(segcn==4'b1101 )
segdis<=segdis_shi;
else if(segcn==4'b1011 )
segdis<=segdis_bai;
else if(segcn==4'b0111 )
segdis<=segdis_qian;
else
segdis<=8'b1111_1111;
end

endmodule



lzl51113212 发表于 2017-9-6 18:54:55 | 显示全部楼层
可以仿真一下就知道原因了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|@2009-2016 芯驿电子科技(上海)有限公司|小黑屋|手机版|Archiver|黑金动力社区 ( 沪ICP备11013590沪公网安备 31011702000003号

GMT+8, 2017-9-21 20:10 , Processed in 0.083880 second(s), 15 queries , Gzip On.

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表