HDLBits练习(九)有限状态机1

1.实现以下状态机(高电平异步复位,单输入单输出)

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)
                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 transition logic
    end
    // Output logic
                assign out = (state == A) ? 1'b0 : 1'b1;

endmodule

2.实现以下状态机(同步复位,单输入单输出)

module top_module(
    input clk,
    input reset,    // 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)
                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 transition logic
    end
    // Output logic
    assign out = (state == A) ? 1'b0 : 1'b1;

endmodule

3.实现以下状态机(异步复位,双输入单输出)

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)
            OFF:begin
                if(j == 0)begin
                    next_state <= OFF;
                end
                else begin
                    next_state <= ON;
                end
            end
            ON:begin
                if(k == 0)begin
                    next_state <= ON;
                end
                else begin
                    next_state <= OFF;
                end
            end
        endcase
    end

    always @(posedge clk, posedge areset) begin
        if(areset)begin
            state <= OFF;
        end
        else begin
        	state <= next_state;
        end
    end

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

endmodule

4.实现以下状态机(同步复位,双输入单输出)

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

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

    always @(*) begin
        case(state)
            OFF:begin
                if(j == 0)begin
                    next_state <= OFF;
                end
                else begin
                    next_state <= ON;
                end
            end
            ON:begin
                if(k == 0)begin
                    next_state <= ON;
                end
                else begin
                    next_state <= OFF;
                end
            end
        endcase
    end

    always @(posedge clk) begin
        if(reset)begin
            state <= OFF;
        end
        else begin
        	state <= next_state;
        end
    end

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

endmodule

5.实现以下状态机

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// State transition logic: next_state = f(state, in)
        case(state)
            A: 
                if(in == 1'b0)begin
                	next_state = A;
            	end
                else begin
                  	next_state = B; 
                end
            B: 
                if(in == 1'b0)begin
                	next_state = C;
            	end
                else begin
                  	next_state = B; 
                end
            C: 
                if(in == 1'b0)begin
                	next_state = A;
            	end
                else begin
                  	next_state = D; 
                end
            D: 
                if(in == 1'b0)begin
               	 	next_state = C;
            	end
                else begin
                  	next_state = B; 
                end
        endcase
    end

    assign  out = (state == D);

endmodule

6.实现以下状态机(独热码形式)

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.实现以下状态机

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

    // State transition logic
    reg [1:0] state,next_state;
    parameter A = 2'd0,B = 2'd1,C = 2'd2,D = 2'd3;
    
    always@(posedge clk or posedge areset)begin// State flip-flops with asynchronous reset
        if(areset)begin
           state <= A; 
        end
        else begin
           state = next_state;
        end
    end
    
    always@(*)begin
            case(state)
            A: 
                if(in == 1'b0)begin
                	next_state <= A;
            	end
                else begin
                  	next_state <= B; 
                end
            B: 
                if(in == 1'b0)begin
                	next_state <= C;
            	end
                else begin
                  	next_state <= B; 
                end
            C: 
                if(in == 1'b0)begin
                	next_state <= A;
            	end
                else begin
                  	next_state <= D; 
                end
            D: 
                if(in == 1'b0)begin
               	 	next_state <= C;
            	end
                else begin
                  	next_state <= B; 
                end
        endcase  
    end

   

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

endmodule

8.同上,改为同步复位

 

 

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

    // State transition logic
    reg [1:0] state,next_state;
    parameter A = 2'd0,B = 2'd1,C = 2'd2,D = 2'd3;
    
    always@(posedge clk)begin// State flip-flops with asynchronous reset
        if(reset)begin
           state <= A; 
        end
        else begin
           state <= next_state;
        end
    end
    
    always@(*)begin
            case(state)
            A: 
                if(in == 1'b0)begin
                	next_state <= A;
            	end
                else begin
                  	next_state <= B; 
                end
            B: 
                if(in == 1'b0)begin
                	next_state <= C;
            	end
                else begin
                  	next_state <= B; 
                end
            C: 
                if(in == 1'b0)begin
                	next_state <= A;
            	end
                else begin
                  	next_state <= D; 
                end
            D: 
                if(in == 1'b0)begin
               	 	next_state <= C;
            	end
                else begin
                  	next_state <= B; 
                end
        endcase  
    end

   

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

endmodule

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值