HDLBits第十四章练习及答案1

1、简单 FSM1(异步复位)

实现下图所示的摩尔状态机,复位为异步复位。
在这里插入图片描述
代码实现:

module top_module(
    input clk,
    input areset,    // Asynchronous reset to state B
    input in,
    output out);//  

    parameter A=0, B=1; 
    reg state, next_state;

    always @(*) begin    // This is a combinational always block
        case(state)     // State transition logic
            A:begin
            if( in == 1'b1 )
                next_state <= A;
            else
                next_state <= B;   
            end    
            B:begin
            if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= A;   
            end
        endcase
    end

    always @(posedge clk, posedge areset) begin    // This is a sequential always block
        if(areset)
            state <= B;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
     assign out = (state == B);

endmodule

验证结果:
在这里插入图片描述

2、简单 FSM1(同步复位)

实现下图所示的摩尔状态机,复位为同步复位。
在这里插入图片描述
代码实现:

module top_module(clk, reset, in, out);
    input clk;
    input reset;    // Synchronous reset to state B
    input in;
    output out;//  
    reg out;

    // Fill in state name declarations
    parameter A=0, B=1; 
    reg state, next_state;

 	always @(*) begin    // This is a combinational always block
        case(state)     // State transition logic
            A:begin
            if( in == 1'b1 )
                next_state <= A;
            else
                next_state <= B;   
            end    
            B:begin
            if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= A;   
            end
        endcase
    end

    always @(posedge clk) begin    // This is a sequential always block
        if(reset)
            state <= B;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
     assign out = (state == B);

endmodule

验证结果:
在这里插入图片描述

3、简单 FSM2(异步复位)

2个输入1个输出,异步复位状态机,如下图所示。
在这里插入图片描述
代码实现:

module top_module(
    input clk,
    input areset,    // Asynchronous reset to OFF
    input j,
    input k,
    output out); //  

    parameter OFF=0, ON=1; 
    reg state, next_state;

    always @(*) begin
       case(state)     // State transition logic
            OFF:begin
                if( j == 1'b1 )
                next_state <= ON;
            else
                next_state <= OFF;   
            end    
            ON:begin
                if( k == 1'b1 )
                next_state <= OFF;
            else
                next_state <= ON;   
            end
        endcase
    end

    always @(posedge clk, posedge areset) begin
        if(areset)
            state <= OFF;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
    assign out = (state == ON);

endmodule

验证结果:
在这里插入图片描述

4、简单 FSM2(同步复位)

2个输入1个输出,同步复位状态机,如下图所示。
在这里插入图片描述
代码实现:

module top_module(
    input clk,
    input reset,    // Synchronous reset to OFF
    input j,
    input k,
    output out); //  

    parameter OFF=0, ON=1; 
    reg state, next_state;

    always @(*) begin
       case(state)     // State transition logic
            OFF:begin
                if( j == 1'b1 )
                next_state <= ON;
            else
                next_state <= OFF;   
            end    
            ON:begin
                if( k == 1'b1 )
                next_state <= OFF;
            else
                next_state <= ON;   
            end
        endcase
    end

    always @(posedge clk) begin
        if(reset)
            state <= OFF;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
    assign out = (state == ON);

endmodule

验证结果:
在这里插入图片描述

5、简单的状态转换3

实现下面的摩尔状态机,下表是状态转移图,1输入1输出4状态。
使用以下状态编码:A=2’b00、B=2’b01、C=2’b10、D=2’b11。
在这里插入图片描述
代码实现:

module top_module(
    input in,
    input [1:0] state,
    output [1:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;
   always @(*) begin
       case(state)     // State transition logic
            2'b00:begin
                if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= A;   
            end    
            2'b01:begin
                if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= C;   
            end
            2'b10:begin
                if( in == 1'b1 )
                next_state <= D;
            else
                next_state <= A;   
            end  
            2'b11:begin
                if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= C;   
            end           
        endcase
    end
    // State transition logic: next_state = f(state, in)

    // Output logic:  out = f(state) for a Moore state machine
    assign out = (state == D);

endmodule

验证结果:
在这里插入图片描述

6、简单的one-hot状态转换3

实现下面的摩尔状态机,下表是状态转移图,一输入一输出四状态。使用以下 one-hot 状态编码:A=4’b0001, B=4’b0010, C=4’b0100, D=4’b1000。
在这里插入图片描述
代码实现:

module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = (state[A]&~in) | (state[C]&~in);
    assign next_state[B] = (state[A]&in) | (state[B]&in) | (state[D]&in);
    assign next_state[C] = (state[B]&~in) | (state[D]&~in);
    assign next_state[D] = state[C]&in;

    // Output logic: 
    assign out = state[D];

endmodule

验证结果:
在这里插入图片描述

7、简单 FSM3(异步复位)

实现下面的摩尔状态机,下表是状态转移图,一输入一输出四状态。
在这里插入图片描述
代码实现:

module top_module(
    input clk,
    input in,
    input areset,
    output out); //

    parameter A=2'd0, B=2'd1, C=2'd2, D=2'd3;
    reg [1:0] state,next_state;
 
    always @(*) begin
       case(state)     // State transition logic
            A:begin
                if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= A;   
            end    
           B:begin
               if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= C;   
            end
           C:begin
               if( in == 1'b1 )
                next_state <= D;
            else
                next_state <= A;   
            end
           D:begin
               if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= C;   
            end           
        endcase
    end    

    always @(posedge clk, posedge areset) begin
        if(areset)
            state <= A;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
    assign out = (state == D);

endmodule

验证结果:
在这里插入图片描述

8、简单 FSM3(同步复位)

实现下面的摩尔状态机,下表是状态转移图,一输入一输出四状态。
在这里插入图片描述
代码实现:

module top_module(
    input clk,
    input in,
    input reset,
    output out); //

    parameter A=2'd0, B=2'd1, C=2'd2, D=2'd3;
    reg [1:0] state,next_state;
 
    always @(*) begin
       case(state)     // State transition logic
            A:begin
                if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= A;   
            end    
           B:begin
               if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= C;   
            end
           C:begin
               if( in == 1'b1 )
                next_state <= D;
            else
                next_state <= A;   
            end
           D:begin
               if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= C;   
            end           
        endcase
    end    

    always @(posedge clk) begin
        if(reset)
            state <= A;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
    assign out = (state == D);

endmodule

验证结果:
在这里插入图片描述

9、设计摩尔状态机

在这里插入图片描述
还包括一个高电平有效同步复位,该复位将状态机复位到相当于水位长时间处于低位状态。

代码实现:

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
   parameter A2=3'd0,B1=3'd1,B2=3'd2,C1=3'd3,C2=3'd4,D1=3'd5;
    reg [2:0] state,next_state;
    
    always @(*)begin
        case(state)
            A2:next_state <= s[1]?B1:A2;
            B1:next_state <= s[2]?C1:(s[1]?B1:A2);
            B2:next_state <= s[2]?C1:(s[1]?B2:A2);
            C1:next_state <= s[3]?D1:(s[2]?C1:B2);
            C2:next_state <= s[3]?D1:(s[2]?C2:B2);
            D1:next_state <= s[3]?D1:C2;
            default:next_state <= 'x;
        endcase
    end
    
    always @(posedge clk)begin
        if(reset)begin
        	state <= A2;
        end
        else begin
        	state <= next_state;
        end
    end
    
    always @(*)begin
        case(state)
            A2:{fr3,fr2,fr1,dfr} = 4'b1111;
            B1:{fr3,fr2,fr1,dfr} = 4'b0110;
            B2:{fr3,fr2,fr1,dfr} = 4'b0111;
            C1:{fr3,fr2,fr1,dfr} = 4'b0010;
            C2:{fr3,fr2,fr1,dfr} = 4'b0011;
            D1:{fr3,fr2,fr1,dfr} = 4'b0000;
            default:{fr3,fr2,fr1,dfr} = 'x;
        endcase
    end
    
endmodule

验证结果:
在这里插入图片描述
参考资料: Verilog有限状态机(2).

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值