|
前天发了一个差不多的贴,没有解决,经过自己在实验,最后终于算是把数码管点亮了。不过显示的数值不对。很乱,这次我整理了程序,有说明,而且程序没了警告,请求大家再次帮看看怎么回事。。我已经弄两三天啦,昨天还搞到病了。。。程序电路在下面。。。程序目的是数码管动态显示 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 [7:0] tim; //时间计数器 根据tim[7:6] 为的00,01,10,11 来却分位选和个各段选
reg [15:0] buf1; //数据寄存器
reg [7:0] dat; //段选寄存器
reg [6:0] 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[7:6]) //根据之间段判断位选
0: begin
case(buf1[15:12])
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[11:8])
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[7:4])
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[3:0])
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[15]; //将数据最高位移到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
电路图 (原文件名:54fbb2fbc99cdb6f4f4aeabc.jpg) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|