2017-09-12 19 views
0

UART가 FPGA에 구현되도록 Verilog 코드를 작성하고 있으며 첫 번째 바이트 이후에 START 비트의 비트로 동기화하는 데 문제가 있습니다.Verilog Falling Edge Detection

관리자가 내 수신 신호를 동기화하고 어떤 종류의 인터럽트를 내 FSM에 통신 수단으로 사용하여 시작을 인식하도록 제안했습니다.

내가 상승 에지 검출 기술에 대해 읽고, 나는 이런 식으로 뭔가 할 수있는 같은 느낌 :

나의 이해에서
module StartDetectionUnit (
    input clk, state, signal_in, 
    output trigger 
    ); 

    reg signal_d; 

    always @(posedge clk) 
     begin 
      signal_d <= signal_in; 
     end 
    assign trigger = signal_in & (!signal_d); 

endmodule  

는이 같은 설명은 상승 에지를 검출을하지 하강 에지, RS-232 통신에서는 "START"가 로직 '0'입니다.

게다가 IDLE 상태 [000으로 하드 코드 됨]에서 플래그를 할당하고 싶지만 마지막 할당에서 미친 게이팅을 수행하는 것이 하드웨어가 아닌 것처럼 들립니다.

tldr 두 문제

감사 무리 FSM의 하나의 특정 상태에서 이렇게 비동기 입력 신호

  • 의 일반적인 하강 에지를 검출

    1. 내가 ' Verilog를 처음 사용하고 HDL을 처음 사용하는 경우

  • 답변

    1

    signal_in 신호가 설계 외부에서 나온 것이라면 올바르게 동기화되지 않습니다. 설계시 하나의 d- 래치 만 사용하고 두 개는 필요합니다.

    reg signal_d; 
    always @(posedge clk) 
        begin 
         signal_d <= signal_in; 
        end 
    

    이렇게하면 하나의 d 래치가 합성됩니다. 신호를 동기화하려면 제대로 두 개의 D-래치 인스턴스에 대한 제 2 신호를 선언해야 :

    reg signal_d; 
    reg signal_sync; 
    always @(posedge clk) 
        begin 
         signal_d <= signal_in; 
         signal_sync <= signal_d; 
        end 
    

    그리고 signal_d가 설계에 사용할 수 없습니다. 그런 다음 에지 검출을 만들기 위해 당신은 같은 제 3 신호를 선언해야 :

    reg signal_d; 
    reg signal_sync; 
    reg signal_sync_old; 
    always @(posedge clk) 
        begin 
         signal_d <= signal_in; 
         signal_sync <= signal_d; 
         signal_sync_old <= signal_sync; 
        end 
    

    그리고 하강 에지 검출을위한

    는 수행

    assign trigger = signal_sync_old & (!signal_sync); 
    

    동기화에 대한 자세한 내용은 좋은 웹 사이트 : https://www.doulos.com/knowhow/fpga/synchronisation/

    이해할 수있는 것처럼, '상태'신호는 3 비트로 코딩되어 있습니다.

    assign trigger = (state == 3'b000) ? (signal_sync_old & (!signal_sync)):0; 
    
    +0

    는 명확하게 : 는 "Signal_in"나는 시뮬레이션을하는 동안 내 USB - 투 - UART 브리지 또는 테스트 벤치에서 수신하고있는 비트입니다. 모듈 StartDetectionUnit ( 입력 clk, 상태, signal_in, 출력 트리거 ); reg signal_d; 항상 @ (posedge clk) 시작 signal_d <= signal_in; end assign trigger = (! signal_in) & signal_d & (! state); endmodule 필자는 이렇게 작성했으며, 처음 몇 번의 시뮬레이션을 반복하면 제대로 작동하는 것 같습니다. 작동해야하는 상태는 "000"으로 코딩되어 있습니다. –

    +0

    비동기 외부 입력 신호를 시뮬레이션 할 수 없습니다. 그것은 항상 시뮬레이션에서 작동합니다. – FabienM

    +0

    심지어 테스트 벤치를 통해? –

    -3

    동기식 디자인의 경우, 이와 같이 하강 에지를 감지 할 수 있습니다.

    module StartDetectionUnit (
        input clk, state, signal_in, 
        output trigger 
        ); 
    
        reg signal_d; 
    
        always @(posedge clk) 
         begin 
          signal_d <= !signal_in; 
         end 
        assign trigger = !(signal_in | signal_d); 
    endmodule  
    

    다음은 위의 논리에 대한 상태 다이어그램과 계산법입니다.

    Falling Edge Detection - Synchronous

    하강 에지 검출

    는 다음과 같은 방법으로 수행 할 수 있습니다.

    assign sout = !(sin | (!sin)); 
    
    +0

    동기식 디자인에서는 작동하지 않습니다. – FabienM

    +0

    예. 고마워. 답변을 업데이트했습니다. –