lsjshengll 发表于 2011-7-22 16:47:41

整理后再一次求助两个并联hc595驱动四位数码管的问题,已经显示了,数不对。。求求各位

前天发了一个差不多的贴,没有解决,经过自己在实验,最后终于算是把数码管点亮了。不过显示的数值不对。很乱,这次我整理了程序,有说明,而且程序没了警告,请求大家再次帮看看怎么回事。。我已经弄两三天啦,昨天还搞到病了。。。程序电路在下面。。。程序目的是数码管动态显示 1234。


先谢谢大家帮忙。。。

`timescale 1ns / 1ps


module led1(clk,dclk,dlk,drst,dain);
       
          input clk;                                //内部时钟,接P83
    output reg dclk;                        //输出移位时钟到hc595,接P94
    output reg dlk;                        //输出锁存时钟到hc595,接P95
    output drst;                                //输出复位时钟到hc595,接P98
    output reg dain;                        //输出串行数据口到hc595,接P99
       reg flag,ready;                        //flag标志用来赋值给
       reg tim;                        //时间计数器 根据tim 为的00,01,10,11 来却分位选和个各段选
       reg buf1;                        //数据寄存器
       reg dat;                        //段选寄存器
       reg cou=0;                        //数据传送计数器
               
       assign drst=1;                        //复位输出等于0
       
          parameter
                zero = 8'b1100_0000,
                one= 8'b1111_1001,
                two= 8'b1010_0100,
                three= 8'b1011_0000,
                four = 8'b1001_1001,
                five = 8'b1001_0010,
                six= 8'b1000_0010,
                seven= 8'b1111_1000,
                eight= 8'b1000_0000,
                nine = 8'b1001_0000;

        always @(posedge clk)
                begin
                        tim=tim+1;                                //计数
                                if(!flag) begin flag<=1; buf1<=16'h1234;end                                //第一次给显示数据:1234       
                                else
                                        begin
                                        if(!ready)      //是否将译码后数据最高位放到dain(串行输出)口上                                                                                       
                                                                begin
                                                                dclk<=0;                        //移位时钟下降沿:准备下次给dain数据
                                                                        if(!buf1)                //判断译码后数据是否传完,传完继续赋值
                                                                        begin
                                                                        dlk<=0;                        //给锁存时钟下降沿,准备下次锁存
                                                                        case (tim)                        //根据之间段判断位选
                                                        0:           begin
                                                                        case(buf1)
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                        buf1<={8'b0000_1000,dat};                                                //给译码数据
                                                                        end
                                                       
                                                        1:    begin
                                                                        case(buf1)
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                                buf1<={8'b0000_0100,dat};
                                                                        end
                                                       
                                                        2:    begin
                                                                        case(buf1)
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                                buf1<={8'b0000_0010,dat};
                                                              end
                                                       
                                                       
                                                        3:           begin
                                                                        case(buf1)
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                                buf1<={8'b0000_0001,dat};
                                                                        end
                                                        endcase
                                                        end
                                                        else
                                                        begin
                                                        dain<=buf1;                                //将数据最高位移到dain串行输出口
                                                        buf1<=buf1<<1;                                //数据左移
                                                        ready<=1;                                //数据已经放好,准备输出移位寄存器
                                                        end
                                                        end
                                                        else
                                                        begin
                                if(cou<17) begin dclk<=1;ready<=0;cou<=cou+1;end//移位,ready信号复位,表示数据已经移位到595里面,cou+1;
                             else begin dlk<=1;cou<=0; end                                         //16位数据传完,输出锁存一次输出
                                                        end
                                                        end
                end
endmodule




http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_660197F54QF7.jpg
电路图 (原文件名:54fbb2fbc99cdb6f4f4aeabc.jpg)

Jigsaw 发表于 2011-7-22 17:35:47

LZ还没去找什么叫“动态显示”和“静态显示”吗?


说句实话,没看到源码里面有比较清晰的时序线索。

lsjshengll 发表于 2011-7-22 18:12:02

回复【1楼】Jigsaw
-----------------------------------------------------------------------

额。。记错概念了。。不过大概就是这个意思啦。。数码管显示1234.。我想问问清晰的时序线索是怎么构成的。。麻烦教教我。。谢谢。。

Jigsaw 发表于 2011-7-22 21:51:34

你去EDN China的FPGA/CPLD助学小组或者特权的博客看看吧,有这个例子
我这边现在进不去,太慢了,页面一直出错

lsjshengll 发表于 2011-7-22 22:23:04

回复【3楼】Jigsaw
-----------------------------------------------------------------------

啊。。有吗? 嗯嗯。。好的。。谢谢
页: [1]
查看完整版本: 整理后再一次求助两个并联hc595驱动四位数码管的问题,已经显示了,数不对。。求求各位