Bootstrap

Verilog HDLBits 第二十期:3.2.10 Finite State Machines(3.2.5.27-3.2.5.33)

目录

前言

3.2.5.27 Q6b:FSM next-state logic(Exams/m2014 q6b)

Solution:

3.2.5.28 Q6c:FSM one-hot next-state logic(Exams/m2014 q6c)

Solution:

3.2.5.29 Q6:FSM (Exams/m2014 q6)

Solution:

3.2.5.30 Q2a:FSM (Exams/2012 q2fsm)

Solution:

3.2.5.31 Q2b:One-hot FSM equations(Exams/2012 q2b)

Solution:

 3.2.5.32 Q2a:FSM(Exams/2013 q2afsm)

Solution:

 3.2.5.33 Q2b:another FSM(Exams/2013 q2bfsm)

Solution:


前言

HDLbits网站如下

Problem sets - HDLBits (01xz.net)

从本期开始我们继续HDLbits第三章Circuits的学习,本期的内容是Finite State Machines有限状态机的第六小节(3.2.5.27-3.2.5.33)


3.2.5.27 Q6b:FSM next-state logic(Exams/m2014 q6b)

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

 假设您希望使用三个触发器和状态代码y[3:1]=000,001,…101分别实现对应A、B...F等状态实现FSM。显示此FSM的状态分配表。推导触发器的下一状态表达式y[2]。

只实现y[2]的下一个状态逻辑。(这更像是一个FSM问题,而不是一个Verilog编码问题。哦,好吧。)

Solution:

module top_module (
    input [3:1] y,
    input w,
    output Y2);
    parameter A=0,B=1,C=2,D=3,E=4,F=5;
    wire [2:0]state=y;
    reg [2:0]next;
    
    always@(*) begin
        case(state)
            A:next=w?A:B;
            B:next=w?D:C;
            C:next=w?D:E;
            D:next=w?A:F;
            E:next=w?D:E;
            F:next=w?D:C;
            default:next=A;
        endcase
    end
        
    assign Y2=next[1];
                   
endmodule

3.2.5.28 Q6c:FSM one-hot next-state logic(Exams/m2014 q6c)

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

对于这一部分,假设使用独热码来分别为状态A,B,C,D,E,F分配‘y[6:1]=000001, 000010, 000100, 001000, 010000, 100000

为下一状态信号Y2和Y4编写一个逻辑表达式。(假设采用独热编码,通过检查推导逻辑方程。测试平台将使用非独热输入进行测试,以确保您没有尝试做更复杂的事情)。

Solution:

module top_module (
    input [6:1] y,
    input w,
    output Y2,
    output Y4);
    
    assign Y2=~w&&y[1];
    assign Y4=w&&(y[2]||y[3]||y[5]||y[6]);

endmodule

3.2.5.29 Q6:FSM (Exams/m2014 q6)

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

实现状态机。(这一部分不在期中考试中,但编写FSMs是一个很好的做法)。

Solution:

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,next;
    
    always@(*) begin
        case(state)
            A:next=w?A:B;
            B:next=w?D:C;
            C:next=w?D:E;
            D:next=w?A:F;
            E:next=w?D:E;
            F:next=w?D:C;
            default:next=A;
        endcase
    end
    
    always@(posedge clk) begin
        if(reset)
            state<=A;
        else
            state<=next;
    end
    
    assign z =(state==E)||(state==F);

endmodule

3.2.5.30 Q2a:FSM (Exams/2012 q2fsm)

考虑下面的状态图。

 编写代表此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,就像在课堂上所做的那样。使用连续赋值语句或always块(由您自行决定)描述FSM输出z。指定您希望使用的任何状态进行编码。

Solution:

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,next;
    
    always@(*) begin
        case(state)
            A:next=w?B:A;
            B:next=w?C:D;
            C:next=w?E:D;
            D:next=w?F:A;
            E:next=w?E:D;
            F:next=w?C:D;
            default:next=A;
        endcase
    end
    
    always@(posedge clk) begin
        if(reset)
            state<=A;
        else
            state<=next;
    end
    
    assign z =(state==E)||(state==F);

endmodule

3.2.5.31 Q2b:One-hot FSM equations(Exams/2012 q2b)

考虑下面的状态图。

假设状态分配y[5:0]=000001(a)、000010(B)、000100(C)、001000(D)、010000(E)、100000(F)使用独热码

为信号Y1(state[1])编写一个逻辑表达式,为信号Y3(state[3])编写一个逻辑表达式.

(假设采用独热编码,通过检查推导逻辑方程。测试台将使用非独热输入进行测试,以确保您没有尝试做更复杂的事情)。

Solution:

module top_module (
    input [5:0] y,
    input w,
    output Y1,
    output Y3
);
    assign Y1=w&&y[0];
    assign Y3=~w&&(y[1]||y[2]||y[4]||y[5]);

endmodule

 3.2.5.32 Q2a:FSM(Exams/2013 q2afsm)

考虑下面所示的状态图描述的FSM:

该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将仅接收许可。一旦设备i被FSM授予许可,只要其请求r[i]=1,该设备将继续持有资源至其将请求信号置低为止。 

 编写代表此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,就像在课堂上所做的那样。使用连续赋值语句或always块(由您自行决定)描述FSM输出g[i]。指定您希望使用的任何状态进行编码。

Solution:

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,next_state;
	
	always @(*) begin
		case(state)
			A: next_state = r[1] ? B : (r[2] ? C : (r[3] ? D : A));
			B: next_state = r[1] ? B : A;
			C: next_state = r[2] ? C : A;
			D: next_state = r[3] ? D : A;
		endcase
	end
	
	always @(posedge clk) begin
		if(!resetn)
			state <= A;
		else
			state <= next_state;
	end

	assign g = {state==D,state==C,state==B};
	
endmodule

 3.2.5.33 Q2b:another FSM(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(直到复位)。

Hint:直到f=1之后的周期,FSM才开始监控x输入。

Solution:

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
); 
    parameter waitrst=0,outf=1,checkx1=2,checkx2=3,checkx3=4,checky1=5,checky2=6,holdgl=7,holdgh=8;
    reg [3:0]state,next;
    
    always@(*) begin
        case(state)
            waitrst:next=resetn?outf:waitrst;
            outf:next=checkx1;
            checkx1:next=x?checkx2:checkx1;
            checkx2:next=x?checkx2:checkx3;
            checkx3:next=x?checky1:checkx1;
            checky1:next=y?holdgh:checky2;
            checky2:next=y?holdgh:holdgl;
            holdgh:next=holdgh;
            holdgl:next=holdgl;
        endcase
    end
    
    always@(posedge clk) begin
        if(~resetn)
            state<=waitrst;
        else
            state<=next;
    end
    
    assign f = (state==outf);
    assign g = (state==checky1)||(state==checky2)||(state==holdgh);

endmodule

FSM完结撒花!

;