Saturday, May 7, 2022

vivado state machine pair detector


when din is same for 2 clock period, detect goes high

//pairDetect.v

`timescale 1ns / 1ps

module pairDetect(
    input clk,
    input din,
    input reset,
    output reg detect
    );
    
reg [1:0] state;

initial begin state=2'b00; end

always@(posedge clk, posedge reset)
begin
    if(reset)
        state<=2'b00;
    else
    begin
        case (state)
        2'b00:
        begin
            if(din) state<=2'b01;
            else state<=2'b10;
        end
        2'b01:
        begin
            if(din) state<=2'b11;
            else state<=2'b10;
        end
        2'b10:
        begin
            if(din) state<=2'b01;
            else state<=2'b11;
        end           
        2'b11:
        begin
            if(din) state<=2'b01;
            else state<=2'b10;
        end   
        endcase
    end
end

always@(posedge clk, posedge reset)
begin
    if (reset) detect<=2'b00;
    else if (state==2'b11) detect<=1;
    else detect<=0;
end

endmodule

-----------------------
//testbench.v

`timescale 1ns / 1ps

module testbench;

reg clk=1, din=0, reset=0;
wire detect;

pairDetect UUT(
    .clk(clk),
    .din(din),
    .reset(reset),
    .detect(detect)
    );

initial begin 
    #15 reset=1;
    #15 reset=0;
end

always #10 clk=~clk;

always begin
#20 din = 1;
#20 din = 0;
#20 din = 1;
#20 din = 1;
#20 din = 0;
#20 din = 0;
#20 din = 1;
#20 din = 1;
#20 din = 1;
#20 din = 1;
#20 din = 0;
#20 din = 0;
#20 din = 0;
#20 din = 1;
#20 din = 0;
#20 din = 1;
#20 din = 0;
#20 din = 0;
end

endmodule

reference:

No comments:

Post a Comment