Bootstrap

Verilog HDLBits 第十九期:3.2.9 Finite State Machines(3.2.5.21-3.2.5.26)

目录

前言

3.2.5.21 Q8:Design a Mealy FSM(Exams/ece241 2013 q8)

Solution:

3.2.5.21 Q5a:Serial two's complementer moore FSM(Exams/ece241 2014 q5a)

 Solution:

3.2.5.22 Q5b:Serial two's complementer mealy FSM(Exams/ece241 2014 q5b)

 Solution:

3.2.5.23 Q3a: FSM(Exams/2014 q3fsm)

 Solution:

3.2.5.24 Q3b: FSM(Exams/2014 q3bfsm)

 Solution:

3.2.5.25 Q3c: FSM logic(Exams/2014 q3c)

 Solution:


前言

HDLbits网站如下

Problem sets - HDLBits (01xz.net)

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


3.2.5.21 Q8:Design a Mealy FSM(Exams/ece241 2013 q8)

实现一个 Mealy 型有限状态机,该状态机可识别名为 x 的输入信号上的序列"101"。您的 FSM 应具有输出信号 z,当检测到"101"序列时,该信号被判断为逻辑1。FSM 还应具有低电平有效异步复位。状态机中只有 3 个状态。您的 FSM 应识别重叠的序列。

Solution:

module top_module (
    input clk,
    input aresetn,    // Asynchronous active-low reset
    input x,
    output z ); 
    parameter s0=0,s1=1,s2=2; //s0:0,s1:1--,s2:10--
    reg [1:0]state,next;
    
    always@(*) begin
        case(state)
            s0:next=x?s1:s0;
            s1:next=x?s1:s2;
            s2:next=x?s1:s0;
        endcase
    end
    
    always@(posedge clk or negedge aresetn) begin
        if(~aresetn)
            state<=s0;
        else
            state<=next;
    end
    
    assign z=(state==s2)&x;   

endmodule

mealy型状态机,不仅取决于当前状态,还与输入有关,输出信号与输入信号同步,而moore型状态机会慢一拍。 


3.2.5.21 Q5a:Serial two's complementer moore FSM(Exams/ece241 2014 q5a)

您将设计一个单输入单输出串行2的补码Moore状态机。输入(X)是一系列位(每个时钟周期一个),从数字的最低有效位开始,输出(Z)是输入的2的补码。机器将接受任意长度的输入数。电路需要异步复位。转换在复位无效时开始,在复位有效时停止。

例如:

 Solution:

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    parameter A=0,B=1;
    reg state,next;
    
    always@(*) begin
        case(state)
            A:next=x?B:A;
            B:next=B;
        endcase
    end
    
    always@(posedge clk or posedge areset) begin
        if(areset)
            state<=A;
        else
            state<=next;
    end
    
    always@(posedge clk or posedge areset) begin
        if(areset)
            z<=0;
        else
            case(state)
                A:z<=x;
                B:z<=~x;
            endcase
    end

endmodule

由时序图看出,moore型状态机输出比输入慢了一拍,所以

输入01101000

输出10011000

看出从低位到高位,出现第一个1之前原码与补码相同,出现第一个1之后原码与补码刚好相反。

若输出采用组合always输出,则输出与输入并没有慢一拍

故需要采用时序always输出


3.2.5.22 Q5b:Serial two's complementer mealy FSM(Exams/ece241 2014 q5b)

下图是2的补码的Mealy状态机的状态图与时序图。使用独热码实现。

 与上一题相反,mealy型状态机输出信号与输入信号同步。

输入:001101000

输出:110011000

 Solution:

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    parameter A=0,B=1;
    reg [1:0]state,next;
    
    always@(*) begin
        case(state)
            A:next=x?B:A; 
            B:next=B; 
            default: next = A;
        endcase
    end
    
    always@(posedge clk or posedge areset) begin
        if(areset)
            state<=A;
        else
            state<=next;
    end
    
    assign z=(state==A)?x:~x;
            
endmodule

3.2.5.23 Q3a: FSM(Exams/2014 q3fsm)

考虑一个具有输入 s 和 w 的有限状态机。假设 FSM 以称为 A 的复位状态开始,如下图所述。只要 s = 0,FSM 就一直保持在状态 A 中,当 s = 1 时,它将移动到状态 B。一旦进入状态 B,FSM 将在接下来的三个时钟周期中检查输入 w 的值。如果 在其中两个时钟周期中w = 1,则 FSM 必须在下一个时钟周期中将输出 z 设置为 1。否则 z 必须为 0。FSM 会继续检查 w 接下来的三个时钟周期,依此类推。下面的时序图说明了不同 w 值所需的 z 值。

使用尽可能少的状态。请注意,s 输入仅在状态 A 中使用,因此只需考虑 w 输入。

 Solution:

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input s,
    input w,
    output z
);
    parameter A=0,B=1;
    reg state,next;
    
    always@(*) begin
        case(state)
            A:next=s?B:A;
            B:next=B;
        endcase
    end
    
    always@(posedge clk) begin
        if(reset)
            state<=A;
        else
            state<=next;
    end
    reg[1:0]cnt;
    reg z1,z2;
    
    always@(posedge clk) begin
        if(reset)
            cnt<=0;
        else if(cnt==2)
            cnt<=0;           
        else if(state==B)
            cnt<=cnt+1;
    end
    
    always@(posedge clk) begin
        if(reset)
            begin
                z<=0;
                z1<=0;
                z2<=0;
            end
        else if(state==B)
            begin
                if(cnt==0)
                    begin
                    	z1<=w;
                        z<=0;
                    end
                else if(cnt==1)
                    begin
                    	z2<=w;
                        z<=0;
                    end
                else if(cnt==2)
                    z<=(z1&z2&~w)|(~z1&z2&w)|(z1&~z2&w);
            end
    end

endmodule

使用A、B两个状态,使用一个0~2的计数器cnt,cnt=0时寄存器z1存w的值,cnt=1时寄存器z2存w的值,cnt=2时判断z1、z2、w有几个1(有2个1则z为1)


3.2.5.24 Q3b: FSM(Exams/2014 q3bfsm)

给定如下所示的状态赋值表,实现有限状态机。复位应将 FSM复位为状态 000。

 Solution:

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input x,
    output z
);
    parameter s000=0,s001=1,s010=2,s011=3,s100=4;
    reg [2:0]state,next;
    
    always@(*) begin
        case(state)
            s000:next=x?s001:s000;
            s001:next=x?s100:s001; 
            s010:next=x?s001:s010; 
            s011:next=x?s010:s001; 
            s100:next=x?s100:s011; 
            default: next=s000;
        endcase
    end
    
    always@(posedge clk) begin
        if(reset)
            state<=s000;
        else
            state<=next;
    end
    /*
    always@(*) begin
        case(state)
            s000:z=0;
            s001:z=0;
            s010:z=0;
            s011:z=1;
            s100:z=1;
            default: z=0;
        endcase
    end
    */
    assign z=(state>=3);
                               
endmodule

输出时巧用状态机,state>=3即为s011、s100


3.2.5.25 Q3c: FSM logic(Exams/2014 q3c)

给定如下所示的状态赋值表,实现逻辑函数Y[0]和z。

 Solution:

module top_module (
    input clk,
    input [2:0] y,
    input x,
    output Y0,
    output z
);
    parameter s000=0,s001=1,s010=2,s011=3,s100=4;
    reg [2:0]next;
    wire [2:0]state;    
    assign state=y;

    always@(*) begin
        case(state)
            s000:next=x?s001:s000;
            s001:next=x?s100:s001; 
            s010:next=x?s001:s010; 
            s011:next=x?s010:s001; 
            s100:next=x?s100:s011; 
            default: next=s000;
        endcase
    end
    
    assign Y0=next[0];
    assign z=(state>=3);
                               
endmodule

还有两天把FSM搞定

;