打印

急!!!请教各位,有关计数器和LED扫面的问题?

[复制链接]
1318|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小鱼尼莫|  楼主 | 2011-8-2 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个9999的计数器,然后用4个数码管显示当前数值,数码管共用ag口,通过com1com4选通的
module top(clk,rst,ag,an);
input clk;
input rst;
output [6:0] ag; //数码管ag
output [3:0] an; //com1com4
reg clk_div_s; //给计数器提供时钟
reg clk_div_l; //LED扫描提供的时钟
reg [14:0] clk_s; //clk_div_s分频时用的
reg [26:0] clk_l; //clk_div_l分频是用的
reg [3:0] ge; //计数器的个位
reg [3:0] shi; //十位
reg [3:0] bai; //百位
reg [3:0] qian; //千位
parameter top_l=15'd12000;
parameter top_s=27'd24000000;
parameter top=4'b1001; //检测是否计数到九
always@(posedge clk or negedge rst) //分频的,产生clk_div_sclk_div_l
begin
if(!rst)
begin
clk_s<=0;
clk_l<=0;
clk_div_s<=0;
clk_div_l<=0;
end
else
begin
if(clk_s==top_s)
begin
clk_s<=0;
clk_div_s<=~clk_div_s;
end
if(clk_l==top_l)
begin
clk_l<=0;
clk_div_l<=~clk_div_l;
end
clk_s<=clk_s+1;
clk_l<=clk_l+1;
end
end
always@(posedge clk_div_s) //计数的
begin
if(ge==top)
begin
shi=shi+1;
ge=0;
end
if(shi==top)
begin
bai=bai+1;
shi=0;
end
if(bai==top)
begin
qian=qian+1;
bai=0;
end
if(qian==top) qian=0;
ge=ge+1;
end
led myled(
.clk(clk_div_l),
.A0(ge),
.A1(shi),
.A2(bai),
.A3(qian),
.an(an),
.ag(ag)
);
endmodule
module led(clk,A0,A1,A2,A3,an,ag); //数码管扫描的
input clk;
input [3:0] A0;
input [3:0] A1;
input [3:0] A2;
input [3:0] A3;
output [3:0] an;
output [6:0] ag;
reg [3:0] digit;
reg [3:0] an_reg;
assign an=4'b0000;
reg [6:0] ag_reg;
assign ag=an_reg;
reg [2:1] sts;
parameter sts1=2'b00;
parameter sts2=2'b01;
parameter sts3=2'b10;
parameter sts4=2'b11;
always@(posedge clk) //用状态机写的,让四个数码管按顺序显示个十百千位的数
begin
case(sts)
2'b00:
begin
digit<=A0;
an_reg<=4'b1110;
sts<=sts2;
end
2'b01:
begin
digit<=A1;
an_reg<=4'b1101;
sts<=sts3;
end
2'b10:
begin
digit<=A2;
an_reg<=4'b1011;
sts<=sts4;
end
2'b11:
begin
digit<=A3;
an_reg<=4'b0111;
sts<=sts1;
end
endcase
end
always@(digit) //让数码管显示digit的数,这部分应该没问题
begin
case(digit)
4'b0000: ag_reg<=7'b0111_111;
4'b0001: ag_reg<=7'b0000_110;
4'b0010: ag_reg<=7'b1011_011;
4'b0011: ag_reg<=7'b1001_111;
4'b0100: ag_reg<=7'b1100_110;
4'b0101: ag_reg<=7'b1101_101;
4'b0110: ag_reg<=7'b1111_101;
4'b0111: ag_reg<=7'b0000_111;
4'b1000: ag_reg<=7'b1111_111;
4'b1001: ag_reg<=7'b1101_111;
default: ag_reg<=7'b0000_000;
endcase
end
endmodule
我的程序是这么写的,不知道哪里有错误啊,哪位高手帮忙看看,指点一下啊,小弟先谢过了

相关帖子

沙发
qoqoqo| | 2011-8-3 09:11 | 只看该作者
我也不太明白

使用特权

评论回复
板凳
qoqoqo| | 2011-8-3 09:11 | 只看该作者
帮你顶起下

使用特权

评论回复
地板
dan_xb| | 2011-8-3 09:40 | 只看该作者
你做过仿真没有?贴个图上来看看?

使用特权

评论回复
5
dan_xb| | 2011-8-3 09:50 | 只看该作者
你的clk_div_s频率那么高,怎么可能看得清楚。。。

使用特权

评论回复
6
AutoESL| | 2011-8-3 14:31 | 只看该作者
贴的代码为什么没有缩进?这看起来太费劲了

使用特权

评论回复
7
AutoESL| | 2011-8-3 14:32 | 只看该作者
always@(posedge clk or negedge rst) //分频的,产生clk_div_s和clk_div_l
begin
if(!rst)
begin
clk_s<=0;
clk_l<=0;
clk_div_s<=0;
clk_div_l<=0;
end
else
begin
if(clk_s==top_s)
begin
clk_s<=0;
clk_div_s<=~clk_div_s;
end
if(clk_l==top_l)
begin
clk_l<=0;
clk_div_l<=~clk_div_l;
end
clk_s<=clk_s+1;
clk_l<=clk_l+1;
end
end
这一段看着不晕吗?

使用特权

评论回复
8
yioy| | 2011-8-5 11:31 | 只看该作者
我怎么没看明白呢

使用特权

评论回复
9
yioy| | 2011-8-5 11:31 | 只看该作者
估计还是我火候不够呀 o(︶︿︶)o 唉

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

20

帖子

0

粉丝