2017-09-12 92 views
0

我正在編寫用於在FPGA上實現的UART的Verilog代碼,並且在第一個字節之後同步到字節的START位時遇到了一些問題。Verilog下降沿檢測

我的經理建議同步我接收到的信號,並使用某種中斷作爲與我的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」。

另外,我想實際上分配國旗只是當在空閒狀態[硬編碼爲000],但做最後的任務瘋狂門控聽起來並不硬件給我。

tldr,有兩個問題

  1. 檢測異步輸入信號
  2. 在FSM的單個,特定狀態這樣做的一個通用的下降沿

感謝一堆,我m新的Verilog和有點新的HDL'ing

回答

1

如果你的信號signal_in來自你的設計之外,它不會正確同步。在您的設計中,您只使用一個d-latch,需要兩個。

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

這將只合成一個d鎖存器。要同步信號正確,您必須聲明的第二信號的兩個d鎖存器實例:

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

而且signal_d不應該在你的設計中使用。然後,使邊緣檢測必須聲明的第三信號喜歡它:

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橋或測試臺接收到的位。 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&(!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

是的。感謝那。我已經更新了答案。 –