我写了一个9999的计数器,然后用4个数码管显示当前数值,数码管共用a到g口,通过com1到com4选通的
module top(clk,rst,ag,an);
input clk;
input rst;
output [6:0] ag; //数码管a到g
output [3:0] an; //com1到com4
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_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
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
我的程序是这么写的,不知道哪里有错误啊,哪位高手帮忙看看,指点一下啊,小弟先谢过了 |