Lemmings1
写完忘记记录,直接点到下一题,再点回来代码就没有了,懒得再写一遍了
Lemmings2
代码如下:(这里需要注意的是,根据给出的参考运行波形,!ground即ground==0时,才会进入跌倒状态,同时发出aaah的声音)
module top_module(
input clk,
input areset, // Freshly brainwashed Lemmings walk left.
input bump_left,
input bump_right,
input ground,
output walk_left,
output walk_right,
output aaah );
parameter LEFT=2'b00 , RIGHT=2'b01 , FALL_L=2'b10 , FALL_R=2'b11 ;
reg [1:0] state ,next_state ;
always @(posedge clk or posedge areset) begin
if(areset) begin
state <= LEFT ;
end else begin
state <= next_state ;
end
end
always @(*) begin
case(state)
LEFT :
if(!ground) begin
next_state = FALL_L ;
end else begin
next_state = bump_left ? RIGHT : LEFT ;
end
RIGHT :
if(!ground) begin
next_state = FALL_R ;
end else begin
next_state = bump_right ? LEFT : RIGHT ;
end
FALL_L : next_state = !ground ? FALL_L : LEFT ;
FALL_R : next_state = !ground ? FALL_R : RIGHT ;
default : next_state = state ;
endcase
end
always @(*) begin
case(state)
LEFT : {walk_left,walk_right,aaah} = 3'b100 ;
RIGHT : {walk_left,walk_right,aaah} = 3'b010 ;
FALL_L : {walk_left,walk_right,aaah} = 3'b001 ;
FALL_R : {walk_left,walk_right,aaah} = 3'b001 ;
endcase
end
endmodule
Lemmings3
代码如下:(套路一样,区分几个输入的优先级即可)
module top_module(
input clk,
input areset, // Freshly brainwashed Lemmings walk left.
input bump_left,
input bump_right,
input ground,
input dig,
output walk_left,
output walk_right,
output aaah,
output digging );
parameter LEFT = 0 ,RIGHT = 1 , DIG_L = 2 , DIG_R = 3 , FALL_L = 4 ,FALL_R = 5 ;
reg [2:0] state ,next_state ;
always @(posedge clk or posedge areset) begin
if(areset) begin
state <= LEFT ;
end else begin
state <= next_state ;
end
end
always @(*) begin
case(state)
LEFT:
if(ground==0) begin
next_state = FALL_L ;
end else if(dig) begin
next_state = DIG_L ;
end else if(bump_left)begin
next_state = RIGHT ;
end else begin
next_state = LEFT ;
end
RIGHT:
if(ground==0) begin
next_state = FALL_R ;
end else if(dig) begin
next_state = DIG_R ;
end else if(bump_right)begin
next_state = LEFT ;
end else begin
next_state = RIGHT ;
end
DIG_L: next_state = ground ? DIG_L : FALL_L ;
DIG_R: next_state = ground ? DIG_R : FALL_R ;
FALL_L : next_state = ground ? LEFT : FALL_L ;
FALL_R : next_state = ground ? RIGHT : FALL_R ;
default : next_state = state ;
endcase
end
always @(*) begin
case(state)
LEFT : {walk_left,walk_right,aaah,digging} = 4'b1000 ;
RIGHT : {walk_left,walk_right,aaah,digging} = 4'b0100 ;
DIG_L : {walk_left,walk_right,aaah,digging} = 4'b0001 ;
DIG_R : {walk_left,walk_right,aaah,digging} = 4'b0001 ;
FALL_L : {walk_left,walk_right,aaah,digging} = 4'b0010 ;
FALL_R : {walk_left,walk_right,aaah,digging} = 4'b0010 ;
endcase
end
endmodule
Lemmings4
代码如下:(暂时有问题 还没改对 时序计数 一直搞不对嘞 头疼 ,明天再来看看)
module top_module(
input clk,
input areset, // Freshly brainwashed Lemmings walk left.
input bump_left,
input bump_right,
input ground,
input dig,
output walk_left,
output walk_right,
output aaah,
output digging );
parameter LEFT = 0 ,RIGHT = 1 , DIG_L = 2 , DIG_R = 3 , FALL_L = 4 ,FALL_R = 5 , OVER = 6;
reg [2:0] state ,next_state ;
reg [4:0] cnt_clk_L , cnt_clk_R ;
always @(posedge clk or posedge areset) begin
if(areset) begin
state <= LEFT ;
end else begin
state <= next_state ;
end
end
//计数二十个时钟周期
always @(posedge clk) begin
case(state)
FALL_L : cnt_clk_L <= cnt_clk_L + 1'b1 ;
FALL_R : cnt_clk_R <= cnt_clk_R + 1'b1 ;
default :
{cnt_clk_L,cnt_clk_R} <= 10'b0 ;
endcase
end
wire en_L = (cnt_clk_L > 5'd20) ;
wire en_R = (cnt_clk_R > 5'd20) ;
always @(*) begin
case(state)
LEFT:
if(ground==0) begin
next_state = FALL_L ;
end else if(dig) begin
next_state = DIG_L ;
end else if(bump_left)begin
next_state = RIGHT ;
end else begin
next_state = LEFT ;
end
RIGHT:
if(ground==0) begin
next_state = FALL_R ;
end else if(dig) begin
next_state = DIG_R ;
end else if(bump_right)begin
next_state = LEFT ;
end else begin
next_state = RIGHT ;
end
DIG_L: next_state = ground ? DIG_L : FALL_L ;
DIG_R: next_state = ground ? DIG_R : FALL_R ;
FALL_L :
if(en_L) begin
next_state = ground ? OVER : FALL_L ;
end else begin
next_state = ground ? LEFT : FALL_L ;
end
FALL_R :
if(en_R) begin
next_state = ground ? OVER : FALL_R ;
end else begin
next_state = ground ? RIGHT : FALL_R ;
end
OVER : next_state = OVER ;
default : next_state = state ;
endcase
end
always @(*) begin
case(state)
LEFT : {walk_left,walk_right,aaah,digging} = 4'b1000 ;
RIGHT : {walk_left,walk_right,aaah,digging} = 4'b0100 ;
DIG_L : {walk_left,walk_right,aaah,digging} = 4'b0001 ;
DIG_R : {walk_left,walk_right,aaah,digging} = 4'b0001 ;
FALL_L : {walk_left,walk_right,aaah,digging} = 4'b0010 ;
FALL_R : {walk_left,walk_right,aaah,digging} = 4'b0010 ;
OVER : {walk_left,walk_right,aaah,digging} = 4'b0000 ;
endcase
end
endmodule
Fsm onehot
代码如下:
module top_module(
input in,
input [9:0] state,
output [9:0] next_state,
output out1,
output out2
);
assign next_state[0] = (state[0] & ~in) | (state[1] & ~in) | (state[2] & ~in) | (state[3] & ~in) | (state[4] & ~in) | (state[7] & ~in) | (state[8] & ~in) | (state[9] & ~in);
assign next_state[1] = (state[0] & in) | (state[8] & in) | (state[9] & in);
assign next_state[2] = (state[1] & in);
assign next_state[3] = (state[2] & in);
assign next_state[4] = (state[3] & in);
assign next_state[5] = (state[4] & in);
assign next_state[6] = (state[5] & in);
assign next_state[7] = (state[6] & in) | (state[7] & in);
assign next_state[8] = (state[5] & ~in);
assign next_state[9] = (state[6] & ~in);
assign out1 = (state[8] | state[9]);
assign out2 = (state[7] | state[9]);
endmodule
Fsm ps2
开始写错了,画一下
代码如下:
module top_module(
input clk,
input [7:0] in,
input reset, // Synchronous reset
output done
);
parameter WAIT = 0,BYTE1 = 1,BYTE2 = 2,BYTE3 = 3;
reg [1:0] state;
reg [1:0] next_state;
always @(posedge clk ) begin
if (reset) begin
state <= WAIT;
end
else begin
state <= next_state;
end
end
always @(*) begin
next_state = state;
case(state)
WAIT: next_state = in[3] ? BYTE1 : WAIT ;
BYTE1 : next_state = BYTE2 ;
BYTE2 : next_state = BYTE3 ;
BYTE3 : next_state = in[3] ? BYTE1 : WAIT ;
default : next_state <= state ;
endcase
end
always @(*) begin
case(state)
BYTE3 : done = 1'b1 ;
default : done = 1'b0 ;
endcase
end
endmodule
Fsm ps2data
正确代码如下:
module top_module(
input clk,
input [7:0] in,
input reset, // Synchronous reset
output reg [23:0] out_bytes,
output reg done); //
parameter WAIT = 0,BYTE1 = 1,BYTE2 = 2,BYTE3 = 3;
reg [1:0] state;
reg [1:0] next_state;
always @(posedge clk ) begin
if (reset) begin
state <= WAIT;
end
else begin
state <= next_state;
end
end
always @(*) begin
case(state)
WAIT: next_state = in[3] ? BYTE1 : WAIT ;
BYTE1 : next_state = BYTE2 ;
BYTE2 : next_state = BYTE3 ;
BYTE3 : next_state = in[3] ? BYTE1 : WAIT ;
default : next_state = state ;
endcase
end
always @(posedge clk) begin
if (reset) begin
out_bytes <= 24'd0;
done <= 1'd0;
end else begin
case (next_state)
WAIT : {done,out_bytes} <= 25'd0;
BYTE1: {done,out_bytes} <= {1'd0,out_bytes[15:0],in};
BYTE2: {done,out_bytes} <= {1'd0,out_bytes[15:0],in};
BYTE3: {done,out_bytes} <= {1'd1,out_bytes[15:0],in};
endcase
end
end
endmodule
PS:上面代码是npy帮我改的,下面是我自己写的哈哈(状态机的第三段输出 不一样),npy说有锁存器,但还不是很懂,为什么这样不可以,有无好心人解答一下。
module top_module(
input clk,
input [7:0] in,
input reset, // Synchronous reset
output reg [23:0] out_bytes,
output reg done); //
parameter WAIT = 0,BYTE1 = 1,BYTE2 = 2,BYTE3 = 3;
reg [1:0] state;
reg [1:0] next_state;
always @(posedge clk ) begin
if (reset) begin
state <= WAIT;
end
else begin
state <= next_state;
end
end
always @(*) begin
case(state)
WAIT: next_state = in[3] ? BYTE1 : WAIT ;
BYTE1 : next_state = BYTE2 ;
BYTE2 : next_state = BYTE3 ;
BYTE3 : next_state = in[3] ? BYTE1 : WAIT ;
default : next_state = state ;
endcase
end
reg [7:0] out_bytes_1 , out_bytes_2 , out_bytes_3 ;
always@(*) begin
case(next_state)
BYTE1 : out_bytes_1 = in[7:0] ;
BYTE2 : out_bytes_2 = in[7:0] ;
BYTE3 : out_bytes_3 = in[7:0] ;
endcase
end
always @(*) begin
case(state)
BYTE3 : begin
out_bytes [23:0] = {out_bytes_1,out_bytes_2,out_bytes_3} ;
done = 1'b1 ;
end
default : {out_bytes,done} = 25'b0 ;
endcase
end
endmodule