본문 바로가기

[Harman] 반도체 설계/Quartus

Quartus II Project - Falling Edge Detection.

 

d_ff 을 통해서 Falling Edge 를 파악하고, Data 송수신의 Start bit 를 확인할 수 있다. 

 

module fdet(
    input clk,
    input reset_n,
    input rx,
    output f_det
);

    reg rx_reg;
    reg rx_delay1;
    reg rx_delay2;

    always @(posedge clk, negedge reset_n) begin
        if(!reset_n) begin
            rx_delay1 <= 0;
            rx_delay2 <= 0;
        end
        else begin
            rx_reg <= rx;
            rx_delay1 <= rx_reg;
            rx_delay2 <= rx_delay2;
        end
    end

    assign f_det = rx_delay2 & ~rx_delay1;

endmodule

 

// test-bench

`timescale 1 ns / 1 ns 

module fdet_tb();

    reg clk;
    reg reset_n;
    reg rx;
    wire f_det;
    
    fdet uFdet(
        .clk(clk),
        .reset_n(reset_n),
        .rx(rx),
        .f_det(f_det)
    );
    
    initial begin
        clk = 1'b0;
        forever #10 clk = ~clk;
    end
	
    initial begin
            reset_n = 1'b1;
        #15 reset_n = 1'b0;
        #10 reset_n = 1'b1; //#25
    end
	
    initial begin
            rx = 1'b1
        #90 rx = 1'b0;    
    end

endmodule
// tcl file

vlib work
vlog fdet.v fdet_tb.v
vsim work.fdet_tb
view wave 
add wave -radix bin /clk
add wave -radix bin /reset_n
add wave -radix bin /rx
add wave -radix bin /fdet_tb/uFdet/rx_delay1
add wave -radix bin /fdet_tb/uFdet/rx_delay2
add wave -radix bin /f_det

run 200ns

    

 

15ns : clk 에 관계없이 reset_n 을 누르면 rx_delay1, rx_delay2 가 0 으로 초기화된다. 

 

 

30ns, posedge clk : rx 가 첫 번째 FF 를 지나서 rx_delay1 에 rx 값(1)이 그대로 출력된다. 

 

 

50ns, posedge clk : 두 번째 FF 를 지나서 rx_delay2 에 rx_delay1 값(1)이 그대로 출력된다. 

 

 

90ns : rx 의 falling edge 가 발생. FF 2개를 거치기 때문에 rx_delay1, rx_delay2 는 각각 1, 2 Period 씩 delay 가 생긴다.

 

 

110ns ~ 130ns : assign f_det = rx_delay2 & ~rx_delay1; // f_det 의 값이 1 이라면, rx 의 falling edge 가 발생했다는 사실을 확인할 수 있다.