module state(clk,rst,cnt,SH,F1);
input clk; //12M
input rst;
input[7:0] cnt;
output SH,F1;
reg SH,F1;
reg [3:0] CS,NS;
reg [3:0] cnt1; //对12M计数,循环100
parameter IDLE =4'b0001,
SHIFT=4'b0010,
HIGH =4'b0100,
LOOP =4'b1000;
always@(posedge clk or negedge rst)
if(!rst)
CS<=IDLE;
else
CS<=NS;
always@(cnt,CS)
begin
NS<=IDLE;
case(CS)
IDLE:
begin
if(cnt>0 && cnt<18)
NS=SHIFT;
else
NS=IDLE;
end
SHIFT:
begin
if(cnt>17 && cnt<24) //发现HIGH状态第一次持续6个cnt,后面6--12个cnt不等 不知道怎么回事
NS=HIGH;
else
NS=SHIFT;
end
HIGH: //这里有问题 发现cnt>23后几个时钟周期内,状态还在HIGH,没能转到LOOP
begin
if(cnt>23 && cnt<=150)
NS=LOOP;
else
NS=HIGH;
end
LOOP:
begin
if(cnt==0)
NS=IDLE;
else
NS=LOOP;
end
endcase
end
always @ (posedge clk or negedge rst)
if(!rst)
begin
SH<=1;
F1<=1;
cnt1<=0;
end
else
begin
//SH<=1;
//F1<=1;
case(NS)
IDLE :
begin
SH<=1;
F1<=1;
end
SHIFT:
begin
SH<=1;
F1<=1;
end
HIGH :
begin
SH<=0;
F1<=1;
end
LOOP : //LOOP态下运行正确,可以得到1M的F1
begin
SH<=0;
if(cnt1==11)
cnt1<=0;
else
begin
if(cnt1<6)
begin
F1<=0;
cnt1<=cnt1+1;
end
else
begin
F1<=1;
cnt1<=cnt1+1;
end
end
end
endcase
end
endmodule
知道程序这玩意不应该拿来让别人找bug,但是实在不知道怎么回事。
希望大家帮忙看看。
谢谢。
|