HDLBits刷题合集—19 Finite State Machines-5

HDLBits刷题合集—19 Finite State Machines-5

HDLBits-146 Exams/m2014 q6b

Problem Statement
考虑下面显示的状态机,它有一个输入w和一个输出z。
HDLBits刷题合集—19 Finite State Machines-5_第1张图片
假设你希望使用三个触发器和状态码y [3:1] = 000、001,…,101分别用于状态A,B,…,F来实现FSM。 显示此FSM的状态分配表。 推导触发器y[2]的次态表达式。

仅实现y[2]的下一状态逻辑。

状态转换表如下所示:

HDLBits刷题合集—19 Finite State Machines-5_第2张图片
代码如下:

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;
    reg [3:1] state_next;
    
    always @(*) begin
        case (y)
            A : begin
                if (w) state_next <= A;
                else   state_next <= B;
            end
            B : begin
                if (w) state_next <= D;
                else   state_next <= C;
            end
             C : begin
                if (w) state_next <= D;
                else   state_next <= E;
            end
             D : begin
                if (w) state_next <= A;
                else   state_next <= F;
            end
             E : begin
                if (w) state_next <= D;
                else   state_next <= E;
            end
             F : begin
                if (w) state_next <= D;
                else   state_next <= C;
            end
            default :  state_next <= A;
        endcase
    end
    
    assign Y2 = state_next[2];
    
endmodule

HDLBits-147 Exams/m2014 q6c

Problem Statement
考虑下面显示的状态机,它有一个输入w和一个输出z。
HDLBits刷题合集—19 Finite State Machines-5_第3张图片
对于此部分,假设使用独热码分别为状态A,B,…,F编码,状态分配为y [6:1] = 000001、000010、000100、001000、010000、100000。

编写次态信号y2和y4的逻辑表达式。

代码如下:

module top_module (
    input [6:1] y,
    input w,
    output Y2,
    output Y4);
	
    parameter A=6'b000001, B=6'b000010, C=6'b000100; 
	parameter D=6'b001000, E=6'b010000, F=6'b100000;
    reg [6:1] state_next;
    
    always @(*) begin
        case (y)
            A : begin
                if (w) state_next <= A;
                else   state_next <= B;
            end
            B : begin
                if (w) state_next <= D;
                else   state_next <= C;
            end
             C : begin
                 if (w) state_next <= D;
                else   state_next <= E;
            end
             D : begin
                 if (w) state_next <= A;
                else   state_next <= F;
            end
             E : begin
                 if (w) state_next <= D;
                else   state_next <= E;
            end
             F : begin
                 if (w) state_next <= D;
                else   state_next <= C;
            end
            default :  state_next <= A;
        endcase
    end
    
    assign Y2 = y[1] & ~w;
    assign Y4 = (y[2] & w) | (y[3] & w) | (y[5] & w) | (y[6] & w);
    
endmodule

HDLBits-148 Exams/m2014 q6

Problem Statement
考虑下面显示的状态机,它有一个输入w和一个输出z。

HDLBits刷题合集—19 Finite State Machines-5_第4张图片
实现这个状态机。
代码如下:

module top_module (
    input clk,
    input reset,     // synchronous reset
    input w,
    output z);
    
	parameter A=0, B=1, C=2, D=3, E=4, F=5;
    reg [2:0] state, state_next;
    
    always @(*) begin
        case (state)
            A : begin
                if (w) state_next = A;
                else   state_next = B;
            end
            B : begin
                if (w) state_next = D;
                else   state_next = C;
            end
            C : begin
                if (w) state_next = D;
                else   state_next = E;
            end
            D : begin
                if (w) state_next = A;
                else   state_next = F;
            end
            E : begin
                if (w) state_next = D;
                else   state_next = E;
            end
            F : begin
                if (w) state_next = D;
                else   state_next = C;
            end
            default :  state_next = A;
        endcase
    end
    
    always @(posedge clk)
        begin
            if (reset) state <= A;
            else 	   state <= state_next;
        end
    
    assign z = (state == E) | (state == F);
    
endmodule

HDLBits-149 Exams/2012 q2fsm

Problem Statement
考虑下面显示的状态机。
HDLBits刷题合集—19 Finite State Machines-5_第5张图片

编写代表此FSM的完整Verilog代码。 对状态表和状态触发器使用单独的Always块。 使用连续赋值语句或Always块描述FSM的输出z。 状态编码随你心意。

代码如下:

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    input w,
    output z
);
	parameter A=0, B=1, C=2, D=3, E=4, F=5;
    reg [2:0] state, state_next;
    
    always @(*) begin
        case (state)
            A : begin
                if (w) state_next <= B;
                else   state_next <= A; 
            end
            B : begin
                if (w) state_next <= C;
                else   state_next <= D; 
            end
            C : begin
                if (w) state_next <= E;
                else   state_next <= D; 
            end
            D : begin
                if (w) state_next <= F;
                else   state_next <= A; 
            end
            E : begin
                if (w) state_next <= E;
                else   state_next <= D; 
            end
            F : begin
                if (w) state_next <= C;
                else   state_next <= D; 
            end
            default : state_next <= A; 
        endcase
    end 
    
    always @(posedge clk)
        begin
            if (reset) state <= A;
            else       state <= state_next;
        end
    
     assign z = (state == E) | (state == F);
    
endmodule

HDLBits-150 Exams/2012 q2b

Problem Statement
考虑下面显示的状态机。

HDLBits刷题合集—19 Finite State Machines-5_第6张图片

假设使用独热码进行状态分配,y [5:0] = 000001(A),000010(B),000100(C),001000(D),010000(E),100000(F)
写出状态触发器y [1]输入Y1的逻辑表达式。
写出状态触发器y [3]输入Y3的逻辑表达式。

代码如下:

module top_module (
    input [5:0] y,
    input w,
    input clk,
    input reset,
    output Y1,
    output Y3
);

	parameter A=6'b000001, B=6'b000010, C=6'b000100;
    parameter D=6'b001000, E=6'b010000, F=6'b100000;
    reg [5:0] state, state_next;
    
    always @(*) begin
        case (state)
            A : begin
                if (w) state_next <= B;
                else   state_next <= A; 
            end
            B : begin
                if (w) state_next <= C;
                else   state_next <= D; 
            end
            C : begin
                if (w) state_next <= E;
                else   state_next <= D; 
            end
            D : begin
                if (w) state_next <= F;
                else   state_next <= A; 
            end
            E : begin
                if (w) state_next <= E;
                else   state_next <= D; 
            end
            F : begin
                if (w) state_next <= C;
                else   state_next <= D; 
            end
            default : state_next <= A; 
        endcase
    end 
    
    always @(posedge clk)
        begin
            if (reset) state <= A;
            else       state <= state_next;
        end
    
    assign Y1 = w & y[0];
    assign Y3 = ~w & (y[1] | y[2] | y[4] | y[5]);
    
endmodule

HDLBits-151 Exams/2013 q2afsm

Problem Statement
考虑以下状态图描述的FSM:

HDLBits刷题合集—19 Finite State Machines-5_第7张图片
该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的优先级最低。因此,例如,当FSM处于状态A时,如果设备3是唯一发出请求的设备,则设备3将仅接收授权。一旦设备(即,FSM给了设备i)授权,该设备将继续接收授权,只要它的请求r [i] = 1。

编写代表此FSM的完整Verilog代码,对状态表和状态触发器使用单独的Always块。使用连续赋值语句或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=0, B=1, C=2, D=3;
    reg [1:0] state, state_next;
    
    always @(*) begin
        case (state)
            A : begin
                if (r[1])   
                    state_next <= B;
                else if (~r[1] & r[2])
                    state_next <= C;
                else if (~r[1] & ~r[2] &r[3])
                    state_next <= D;
                	else 
                    state_next <= A;
            end
            B : begin
                if (r[1]) state_next <= B;
                else      state_next <= A;
            end
            C : begin
                if (r[2]) state_next <= C;
                else      state_next <= A;
            end
            D : begin
                if (r[3]) state_next <= D;
                else      state_next <= A;
            end
            default :     state_next <= A;
        endcase
    end
    
    always @(posedge clk)
        begin
            if (!resetn) state <= A;
            else         state <= state_next;
        end
   
    assign g = {state == D,state == C,state == B};
    
endmodule

HDLBits-152 Exams/2013 q2bfsm

Problem Statement
考虑用于控制某种类型电动机的有限状态机。 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(直到复位)。

代码如下:

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
); 
	parameter A=0, B=1, C=2, D=3, E=4, F=5, G=6,H=7, I=8;
    reg [3:0] state, state_next;
    
    always @(*) begin
        case (state)
            A : begin
                state_next <= B;
            end
            B : begin
                state_next <= C;
            end
             C : begin
                 if (x) state_next <= D;
                else    state_next <= C;
            end
             D : begin
                 if (x) state_next <= D;
                 else   state_next <= E;
            end
             E : begin
                 if (x) state_next <= F;
                 else   state_next <= C;
            end
             F : begin
                 if (y) state_next <= H;
                 else 	state_next <= G;
            end
            G : begin
                if (y)  state_next <= H;
                else    state_next <= I;
            end
            H : begin
                state_next <= H;
            end
            I : begin
                state_next <= I;
            end
        endcase
    end
    
    always @(posedge clk) 
        begin
            if (!resetn) state <= A;
            else 		 state <= state_next;
        end
    
    assign f = (state == B);
    assign g = (state == F) | (state == H) | (state == G);
                          
endmodule

Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!

你可能感兴趣的:(HDLBits)