HDL_bits Finite State Machines 部分(Lemmings1到Fsm ps2data)

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

 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值