帮忙看下这个状态机代码,数码管显示00的时间有点长,不...
如题module traffic_state
(
clk_1Hz,
nrst,
one_data,
ten_data,
led_zhu,
led_zhi
);
input clk_1Hz, nrst;
output led_zhu; //led_zhu 红,led_zhu 黄,led_zhu 绿
output led_zhi; //led_zhi 红,led_zhi 黄,led_zhi 绿
output one_data; //倒计时个位
output ten_data; //倒计时十位
/***************四种工作状态***************/
parameter state_0 = 2'b00,
state_1 = 2'b01,
state_2 = 2'b10,
state_3 = 2'b11;
/******************************交通状态转换*****************************/
reg light_zhu; //light_zhu 红,light_zhu 黄,light_zhu 绿
reg light_zhi; //light_zhi 红,light_zhi 黄,light_zhi 绿
reg flag;
reg CS, NS;
reg count_H, count_L;
always @ ( posedge clk_1Hz or negedge nrst )
if( !nrst )
begin
CS <= state_0;
flag <= 3'b000;
end
else
case( CS )
state_0: if( flag == 3'b000 )//状态state_0, 主干道通行35s
begin
flag <= 3'b001;
state_0_init;
end
else if( flag == 3'b001 )
begin
if( !count_H && !count_L )
begin
flag <= 3'b010;
CS <= state_1;
end
else if( !count_L )
begin
count_L <= 4'b1001;
count_H <= count_H-1'b1;
end
else
begin
count_L <= count_L-1'b1;
end
end
state_1: if( flag== 3'b010 )//状态state_1,主干道黄灯倒计时5s
begin
flag <= 3'b011;
state_1_init;
end
else if( flag == 3'b011 )
begin
if( !count_L )
begin
flag <= 3'b100;
CS <= state_2;
end
else
begin
count_L <= count_L-1'b1;
end
end
state_2: if( flag == 3'b100 )//状态state_2,支干道通行25s
begin
flag <= 3'b101;
state_2_init;
end
else if( flag == 3'b101 )
begin
if( !count_H && !count_L )
begin
flag <= 3'b110;
CS <= state_3;
end
else if( !count_L )
begin
count_L <= 4'b1001;
count_H <= count_H-1'b1;
end
else
begin
count_L <= count_L-1'b1;
end
end
state_3: if( flag == 3'b110 )//状态state_3,支干道黄灯倒计时5s
begin
flag <= 3'b111;
state_3_init;
end
else if( flag == 3'b111 )
begin
if( !count_L )
begin
flag <= 3'b000;
CS <= state_0;
end
else
begin
count_L <= count_L-1'b1;
end
end
endcase
/*************************************/
task state_0_init;
begin
count_H <= 4'b0011; //高位为3
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b001;
light_zhi <= 3'b100;
end
endtask
/*************************************/
task state_1_init;
begin
count_H <= 4'b0000; //高位为0
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b010;
light_zhi <= 3'b100;
end
endtask
/*************************************/
task state_2_init;
begin
count_H <= 4'b0010; //高位为2
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b100;
light_zhi <= 3'b001;
end
endtask
/*************************************/
task state_3_init;
begin
count_H <= 4'b0000; //高位为0
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b100;
light_zhi <= 3'b010;
end
endtask
/**************************/
assign one_data = count_L;
assign ten_data = count_H;
assign led_zhu = light_zhu;
assign led_zhi = light_zhi;
/**************************/
endmodule
顶起! 刚才仔细看了下实验现象,就是递减至0时,要停1S才向下一个状态执行! 是每次到00的显示时间都长还是?有多长? lgg88 发表于 2012-9-13 15:58 static/image/common/back.gif
是每次到00的显示时间都长还是?有多长?
1S左右 那应该是正常的,你要1S才会进入always ,所以要等1S状态才会改变 lgg88 发表于 2012-9-13 16:05 static/image/common/back.gif
那应该是正常的,你要1S才会进入always ,所以要等1S状态才会改变
如果想把这1S去掉呢? 你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 lgg88 发表于 2012-9-13 16:15 static/image/common/back.gif
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...
先谢了!试试 lgg88 发表于 2012-9-13 16:15 static/image/common/back.gif
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...
按照你说的,搞定了!再次谢谢! lgg88 发表于 2012-9-13 16:15 static/image/common/back.gif
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...
又有新问题,那就是我每次按下复位键之后,要等个位为0之后才复位显示,复位延迟这么长时间?
代码如下! module traffic_state
(
clk_1Hz,
nrst,
one_data,
ten_data,
led_zhu,
led_zhi
);
input clk_1Hz, nrst;
output led_zhu; //led_zhu 红,led_zhu 黄,led_zhu 绿
output led_zhi; //led_zhi 红,led_zhi 黄,led_zhi 绿
output one_data; //倒计时个位
output ten_data; //倒计时十位
/***************四种工作状态***************/
parameter state_0 = 2'b00,
state_1 = 2'b01,
state_2 = 2'b10,
state_3 = 2'b11;
/******************************交通状态转换*****************************/
reg light_zhu; //light_zhu 红,light_zhu 黄,light_zhu 绿
reg light_zhi; //light_zhi 红,light_zhi 黄,light_zhi 绿
reg CS;
reg flag;
reg count_H, count_L;
always @ ( posedge clk_1Hz or negedge nrst )
if( !nrst )
begin
CS <= state_3;
flag <= 2'b11;
end
else
case( CS )
state_0: if( flag == 2'b00 ) //状态state_0, 主干道通行35s
begin
if( !count_H && !count_L )
begin
flag <= 2'b01;
CS <= state_1;
state_1_init; //初始化state_1
end
else if( !count_L )
begin
count_L <= 4'b1001;
count_H <= count_H-1'b1;
end
else
begin
count_L <= count_L-1'b1;
end
end
state_1: if( flag == 2'b01 ) //状态state_1,主干道黄灯倒计时5s
begin
if( !count_L )
begin
flag <= 2'b10;
CS <= state_2;
state_2_init; //初始化state_2
end
else
begin
count_L <= count_L-1'b1;
end
end
state_2: if( flag == 2'b10 ) //状态state_2,支干道通行25s
begin
if( !count_H && !count_L )
begin
flag <= 2'b11;
CS <= state_3;
state_3_init; //初始化state_3
end
else if( !count_L )
begin
count_L <= 4'b1001;
count_H <= count_H-1'b1;
end
else
begin
count_L <= count_L-1'b1;
end
end
state_3: if( flag == 2'b11 )//状态state_3,支干道黄灯倒计时5s
begin
if( !count_L )
begin
flag <= 2'b00;
CS <= state_0;
state_0_init; //初始化state_0
end
else
begin
count_L <= count_L-1'b1;
end
end
default: begin
CS <= state_3;
end
endcase
/*************************************/
task state_0_init;
begin
count_H <= 4'b0011; //高位为3
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b100; //light_zhu:0 , light_zhu:0 , light_zhu:1
light_zhi <= 3'b001; //light_zhi:0 , light_zhi:0 , light_zhi:1
end
endtask
/*************************************/
task state_1_init;
begin
count_H <= 4'b0000; //高位为0
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b010;
light_zhi <= 3'b001;
end
endtask
/*************************************/
task state_2_init;
begin
count_H <= 4'b0010; //高位为2
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b001;
light_zhi <= 3'b100;
end
endtask
/*************************************/
task state_3_init;
begin
count_H <= 4'b0000; //高位为0
count_L <= 4'b0101; //低位为5
light_zhu <= 3'b001;
light_zhi <= 3'b010;
end
endtask
/**************************/
assign one_data = count_L;
assign ten_data = count_H;
assign led_zhu = light_zhu;
assign led_zhi = light_zhi;
/**************************/
endmodule
也就是说每次要等到 count_L 为0时才进行复位! 你程序这样写的啊,你把!nrst后,你为什么进入状态3 呢 直接执行复位就可以了啊
页:
[1]