|
module led(rst,clk,dout);
input rst,clk;//输入:复位,50M时钟
output [3:0] dout;//四位数据输出,连led灯
reg [3:0] dout;
reg [2:0] c_state,n_state;
parameter idle=3'b000;
parameter st1=3'b001;
parameter st2=3'b011;
parameter st3=3'b010;
parameter st4=3'b110;
reg [25:0] divide_count;//分频计数值
reg divide_clk;//分频信号线
reg [3:0] cnt;//计数寄存器
/*
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
divide_count <=26'b0;
divide_clk <=1'b0;
end
else if(divide_count == 50000000)
begin
divide_count <=26'b0;
divide_clk <=~divide_clk;
end
else
divide_count <=divide_count+1'b1;
end
*/
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
c_state<=idle;
end
else
begin
c_state<=n_state;
end
end
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
cnt<=0;
dout<=4'b1111;
n_state<=idle;
end
else
begin
case(c_state)
idle:
begin
dout<=4'b1110;
n_state<=st1;
end
st1:
begin
dout<=dout ^ 4'b0001;
cnt<=cnt+1'b1;
if(cnt<3)
begin
n_state<=st1;
end
else
begin
cnt<=1'b0;
dout<=4'b1101;
n_state<=st2;
end
end
st2:
begin
dout<=dout ^ 4'b0010;
cnt<=cnt+1'b1;
if(cnt<3)
begin
n_state<=st2;
end
else
begin
cnt<=1'b0;
dout<=4'b1011;
n_state<=st3;
end
end
st3:
begin
dout<=dout ^ 4'b0100;
cnt<=cnt+1'b1;
if(cnt<3)
begin
n_state<=st3;
end
else
begin
cnt<=1'b0;
dout<=4'b0111;
n_state<=st4;
end
end
st4:
begin
dout<=dout ^ 4'b1000;
cnt<=cnt+1'b1;
if(cnt<3)
begin
n_state<=st4;
end
else
begin
cnt<=1'b0;
dout<=4'b1110;
n_state<=st1;
end
end
default:
begin
end
endcase
end
end
endmodule
这个程序是要实现每一个led灯轮流闪两下,但是出来的结果却是有时候好几个灯同时闪,总之时序是乱的。想了好久了,都没搞出来,望大虾们指点迷津!先谢了 |
|