HDLBits—FSM【Q3,Q6,Q2】

1.Exams/2014 q3fsm

  考虑具有输入s和w的有限状态机。假设FSM开始于称为a的重置状态,如下所示。只要s=0,FSM保持在状态A,当s=1时,FSM移动到状态B。
一旦处于状态B,FSM在接下来的三个时钟周期内检查输入w的值。如果在其中两个时钟周期中w=1,则FSM必须在下一个时钟周期中将输出z设置为1。否则,z必须为0。FSM在接下来的三个时钟周期内继续检查w,依此类推。下面的时序图说明了不同w值的z所需值。使用尽可能少的状态。请注意,s输入仅在状态A中使用,因此您只需要考虑w输入。
在这里插入图片描述

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input s,
    input w,
    output z
);
    parameter A=1'b0,B=1'b1;
    reg state,next_state;
    reg [1:0]counter;
    always@(posedge clk)begin
        if(reset)
            state<=A;
        else
            state<=next_state;
    end
    always@(*)begin
        case(state)
            A:next_state=s?B:A;
            B:next_state=B;
            default:next_state=A;
        endcase
    end

    //计数器模块
    always@(posedge clk)begin
        if(reset)begin
            counter<=2'd0;
        end else if(state==B)begin
            if(counter==2'd2)begin
                counter<=2'd0; 
            end else begin
                counter<=counter+1'b1; 
            end
        end## 标题
    end
    reg [1:0]w2;
    //序列检测
    always@(posedge clk)begin
        if(reset)begin
            w2<=2'b0;   
        end else if(state==B)begin
            w2<={w2[0],w};
        end else begin
            w2<=2'b0;  
        end
    end

    always@(posedge clk)begin
        if(reset)begin
            z<=1'b0; 
        end else if(state==B&&counter==2'd2&&(({w2,w}==3'b110)|({w2,w}==3'b101)|({w2,w}==3'b011)))begin
            z<=1'b1; 
        end else begin
            z<=1'b0; 
        end
    end
endmodule


2.Exams/2014 q3bfsm

  给定如下所示的状态分配表,实现有限状态机。重置应将FSM重置为状态000。
在这里插入图片描述

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input x,
    output z
);
    parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100;
    reg [2:0]state,next_state;
    always@(posedge clk)begin
        if(reset)
            state<=A;
        else
            state<=next_state;
    end
    always@(*)begin
        case(state)
            A:next_state=x?B:A;
            B:next_state=x?E:B;
            C:next_state=x?B:C;
            D:next_state=x?C:B;
            E:next_state=x?E:D;
            default:next_state=A;
        endcase
    end
    
    assign z=(state==D)|(state==E);
endmodule

2.Exams/2014 q3c

  给定如下所示的状态分配表,实现逻辑函数Y[0]和z。
在这里插入图片描述

module top_module (
    input clk,
    input [2:0] y,
    input x,
    output Y0,
    output z
);
    parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100;
    reg [2:0]next_state;

    always@(*)begin
        case(y)
            A:next_state=x?B:A;
            B:next_state=x?E:B;
            C:next_state=x?B:C;
            D:next_state=x?C:B;
            E:next_state=x?E:D;
            default:next_state=A;
        endcase
    end
    assign z=(y==D)|(y==E);
    assign Y0=(next_state==B|next_state==D);
endmodule

4.Exams/m2014 q6b

考虑如下所示的状态机,它有一个输入w和一个输出z。
假设您希望使用三个触发器和状态代码y[3:1]=000、001、…、101分别实现状态A、B、…、F的FSM。显示此FSM的状态分配表。推导触发器的下一状态表达式y[2]。
仅实现y[2]的下一状态逻辑。(这更像是一个FSM问题,而不是Verilog编码问题。哦,好吧。)
在这里插入图片描述

module top_module (
    input [3:1] y,
    input w,
    output Y2);
	parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100,F=3'b101;
    assign Y2=(~w&y[3:1]==B)|(y[3:1]==F&~w)|(y[3:1]==C&w)|(y[3:1]==B&w)|(y[3:1]==E&w)|(y[3:1]==F&w);
endmodule

5.Exams/m2014 q6c

运行正确:

module top_module (
    input [6:1] y,
    input w,
    output Y2,
    output Y4);
	parameter A=6'b000001,B=6'b000010,C=6'b000100,
    D=6'b001000,E=6'b010000,F=6'b100000;
    
    assign Y2=~w&y[1];
    assign Y4=w&(y[2]|y[3]|y[5]|y[6]);
endmodule

这个运行出来是错的,但是不知道原因。希望有大佬能指点下

module top_module (
    input [6:1] y,
    input w,
    output Y2,
    output Y4);
	parameter A=6'b000001,B=6'b000010,C=6'b000100,
    D=6'b001000,E=6'b010000,F=6'b100000;
    assign Y2=(~w&y[6:1]==A);
    assign Y4=(w&y[6:1]==B)|(w&y[6:1]==C)|(w&y[6:1]==E)|(w&y[6:1]==F);
endmodule

在这里插入图片描述

6.Exams/m2014 q6

在这里插入图片描述

module top_module (
    input clk,
    input reset,     // synchronous reset
    input w,
    output z);
    parameter A=6'b000001,B=6'b000010,C=6'b000100,
    D=6'b001000,E=6'b010000,F=6'b100000;
    reg[5:0] state,next_state;
    always@(posedge clk)begin
        if(reset)
            state<=A;
        else
            state<=next_state;
    end
    
    always@(*)begin
        case(state) 
            A:next_state=w?A:B;
            B:next_state=w?D:C;
            C:next_state=w?D:E;
            D:next_state=w?A:F;
            E:next_state=w?D:E;
            F:next_state=w?D:C;
            default:next_state=A;
        endcase
    end
    
    always@(*)begin
        if(state==E||state==F)
            z=1'b1;
        else
            z=1'b0;
    end
endmodule

7.Exams/2012 q2fsm

  编写表示此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,如在课堂上所做的。使用连续赋值语句或always块(由您自行决定)描述FSM输出,称为z。指定要使用的任何状态代码。
在这里插入图片描述

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    input w,
    output z
);
    parameter A=3'd0,B=3'd1,C=3'd2,D=3'd3,E=3'd4,F=3'd5;
    reg[2:0]state,next_state;
    always@(posedge clk)begin
        if(reset)
            state<=A;
        else
            state<=next_state;
    end
    always@(*)begin
        case(state)
            A:next_state=w?B:A;
            B:next_state=w?C:D;
            C:next_state=w?E:D;
            D:next_state=w?F:A;
            E:next_state=w?E:D;
            F:next_state=w?C:D;
            default:next_state=A;
        endcase
    end
    always@(posedge clk)begin
        if(reset)
            z<=1'b0;
        else if(next_state==E||next_state==F)
            z<=1'b1;
        else
            z<=1'b0;
    end
endmodule

8.Exams/2012 q2b

在这里插入图片描述

module top_module (
    input [5:0] y,
    input w,
    output Y1,
    output Y3
);
    parameter A=6'b000001,B=6'b000010,C=6'b000100,
    D=6'b001000,E=6'b010000,F=6'b100000;
    assign Y1=(y[0]&w);
    assign Y3=~w&(y[1]|y[2]|y[4]|y[5]);
endmodule

9.Exams/2013 q2afsm

  该FSM充当仲裁电路,控制三个请求设备对某种类型资源的访问。每个设备通过设置信号r[i]=1来请求资源,其中r[i]是r[1]、r[2]或r[3]。每个r[i]是FSM的输入信号,代表三个设备之一。只要没有请求,FSM就保持状态A。当一个或多个请求发生时,FSM决定哪个设备接收到使用资源的许可,并将该设备的g[i]信号设置为1。每个g[i],都是FSM的输出。有一个优先级系统,设备1的优先级高于设备2,设备3的优先级最低。因此,例如,如果设备3是FSM处于状态a时发出请求的唯一设备,则设备3将仅接收授权。一旦设备i被FSM授予授权,只要其请求r[i]=1,该设备将继续接收授权。
编写表示此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,如在课堂上所做的。使用连续赋值语句或始终块(由您自行决定)描述FSM输出g[i]。指定要使用的任何状态代码。
在这里插入图片描述

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input [3:1] r,   // request
    output [3:1] g   // grant
); 
    parameter A=4'b0001,B=4'b0010,C=4'b0100,D=4'b1000;
    reg [3:0]state,next_state;
    always@(posedge clk)begin
        if(resetn==1'b0)
            state<=A;
        else
            state<=next_state;
    end
    
    always@(*)begin
        case(state)
            A:if(r[1])
                next_state=B; 
            else if((!r[1])&r[2])
                next_state=C;
            else if((!r[1])&(!r[2])&r[3])
                next_state=D;
            else 
                next_state=A;
            
            B:if(r[1])
                next_state=B;
            else
                next_state=A;
            
            C:if(r[2])
                next_state=C;
            else
                next_state=A;
            
            D:if(r[3])
                next_state=D;
            else
                next_state=A;
            
            default:next_state=A;
            
        endcase
    end
    
    assign g[3]=(state==D);
    assign g[2]=(state==C);
    assign g[1]=(state==B);
endmodule

10.Exams/2013 q2bfsm

  考虑一个用于控制某种类型电机的有限状态机。FSM具有来自电机的输入x和y,并产生控制电机的输出f和g。还有一个时钟输入称为clk,一个复位输入称为resetn。
FSM必须按以下方式开展工作。只要复位信号有效,FSM就保持在初始状态,称为状态a。当复位信号无效,在下一个时钟边沿之后,FSM必须在一个时钟周期内将输出f设置为1。然后,FSM必须监视x输入。当x在三个连续时钟周期内产生值1、0、1时,则应在下一个时钟周期将g设置为1。在保持g=1的同时,FSM必须监控y输入。如果y值在最多两个时钟周期内为1,则FSM应永久保持g=1(即,直到复位)。但如果y在两个时钟周期内未变为1,则FSM应永久设置g=0(直到重置)。
(原始试题只要求提供状态图。但在这里,实现FSM。)
在这里插入图片描述

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
); 
    parameter IDLE=9'd1,SET_F=9'd2,S1=9'd3,S2=9'd4,S3=9'd5,S4=9'd6,S5=9'd7,KEEP1=9'd8,KEEP0=9'd9;
    reg [8:0]state,next_state;
    always@(posedge clk)begin
        if(resetn==1'b0)
            state<=IDLE;
        else
            state<=next_state;
    end
    
    always@(*)begin
        case(state)
            IDLE:next_state=SET_F;
            SET_F:next_state=S1;
            S1:next_state=x?S2:S1;
            S2:next_state=x?S2:S3;
            S3:next_state=x?S4:S1;
            S4:next_state=y?KEEP1:S5;
            S5:next_state=y?KEEP1:KEEP0;
            KEEP1:next_state=KEEP1;
            KEEP0:next_state=KEEP0;
            default:next_state=IDLE;
        endcase
    end
    
    assign f=(state==SET_F);
    assign g=(state==S4)|(state==S5)|(state==KEEP1);
    
endmodule

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值