HDLBits Exams/2014 q3fsm

1.原题复现

题目链接:Exams/2014 q3fsmHDLBits Exams/2014 q3fsm_第1张图片

2.思路和代码

根据题意,可以分为两个部分,第一部分为状态机,包括A和B。第二部分为在状态B的时候,需要对另外一个输入进行计数,且三个时钟周期为一循环。因此,第二部分可以细分为:1.需要一个couter用来对三个周期内的输入w进行计数 2.需要一个counter用来对时钟周期次数进行计数,且每记三次后,重新归1开始计数。
刚开始的思路是用的for循环,后来发现不对,因为在一个时钟上升沿里面,for循环3次是不合题意的,题目要求的是在三个时钟周期内计数,而不是一个时钟周期。

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

            if(cout_clock == 3)begin  //这里是 0(1) 1(2) 2(3) 3(1) 1(2) 2(3) 3 1 2 3  括号外是cot_clock的变化 
               cout_w <= w; 			// 括号内的意思是这是cout_clock第几次计数
                    cout_clock <=1; 
            end
            
            else begin
               cout_w <= cout_w+w; 
                cout_clock <=cout_clock+1;
            end

    end
        
    end
    
    assign  z = (cout_w ==2 )&& (cout_clock ==3);  //这里要求cout_clock等于3,是因为输出总是在一个循环内第三次计数后的下一次才会发生变化。
endmodule

参考博客:
Exams/2014 q3fsm_HDLbits详解(merely状态机典型例题)

[HDLbits]——Exams/2014 q3fsm

你可能感兴趣的:(HDL专栏,fpga开发)