整理后再一次求助两个并联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) LZ还没去找什么叫“动态显示”和“静态显示”吗?
说句实话,没看到源码里面有比较清晰的时序线索。 回复【1楼】Jigsaw
-----------------------------------------------------------------------
额。。记错概念了。。不过大概就是这个意思啦。。数码管显示1234.。我想问问清晰的时序线索是怎么构成的。。麻烦教教我。。谢谢。。 你去EDN China的FPGA/CPLD助学小组或者特权的博客看看吧,有这个例子
我这边现在进不去,太慢了,页面一直出错 回复【3楼】Jigsaw
-----------------------------------------------------------------------
啊。。有吗? 嗯嗯。。好的。。谢谢
页:
[1]