改成VERILOG应该是这样
// state.v
module state(clk,rst,start,a_step,c_step,d_step,s_step,idle,acc,con,dec);
input clk,rst,start;
input [24:0] a_step,c_step,d_step; //a_step<c_step<d_step
output [24:0] s_step;
output idle,acc,con,dec;
reg [24:0]s_step;
reg s_en,idle,acc,con,dec;
always@(posedge clk) begin
if (!rst) s_step<=0;
else begin
if (start) begin
if (s_en) s_step<=s_step+1;
else s_step<=s_step;
end
else s_step<=0;
end
end
always @(start,s_step,a_step,c_step,d_step)
begin
if (start==0) begin
idle=0;
acc=0;
con=0;
dec=0;
s_en=0;
end
else if (s_step==0) begin
idle=1;
s_en=1;
end
else if (s_step<a_step) begin
acc=1;
s_en=1;
end
else if (s_step<c_step) begin
con=1;
s_en=1;
end
else if (s_step<d_step) begin
dec=1;
s_en=1;
end
else begin
idle=0;
acc=0;
con=0;
dec=0;
s_en=0;
end
end
endmodule
我的想法:复位时全置零,
点击start开始,再点击停止
在每个时钟上升沿到来时 判断s_en是否为1,为1则将s_step自加1
组合电路判断s_step处于哪个阶段
a阶段:在0时idle置1,s_en置1 继续自加
b阶段:在0到a_step之间时acc置1,s_en置1 继续自加
c阶段:在a_step到c_step之间时con置1,s_en置1 继续自加
d阶段:在c_step到d_step之间时dec置1,s_en置1 继续自加
e阶段:在大于d_step时 自加结束
但是实际硬件会出现以下情况:
1.成功完成,最后处于e阶段,s_step自加结束
2.不能完成,最后处于b,c,d某个阶段。s_step仍然在自加,虽然已经大于d_step
[
本帖最后由 stepan 于 2011-3-24 09:37 编辑 ]