2015-12-11 28 views
0

我正在用VHDL寫一個指定的UART組件。如何在VHDL的進程中生成「tick」?

send: process(send_start) 
    variable bit_index : integer range 0 to 2 := 0; 
begin 
    if (falling_edge(send_start)) then 
     if (start = '0' and transceiver_start = '1') then 
      bit_index := 0; 
     end if; 

     transceiver_start <= '1'; 
     if (bit_index = 0) then 
      temp_data <= data.RE; 
      bit_index := 1; 
      transceiver_start <= '0'; 
      delay_counter <= 0; 
     elsif (bit_index = 1) then 
      temp_data <= data.IM; 
      bit_index := 2; 
      transceiver_start <= '0'; 
     end if; 
    end if; 
end process; 

信號的下降沿觸發子組件運行。我想觸發兩次,但我不知道如何產生第二個下降沿。

我想過使用一個併發進程,它會在delay_counter達到一定限制後基本上將transceiver_start信號重置爲hi狀態。因此我可以在send進程中再次將其關閉以產生下降沿。然而,這使得我有兩個驅動程序爲delay_counter信號,並且我讀到具有分辨率功能不是合成的良好實踐(此代碼需要可合成)。

有沒有什麼辦法讓我生成bit_index = 1

回答

3

FPGA器件和相關的合成工具被用於同步邏輯, 從而VHDL其中時鐘觸發處理執行優化。觸發過程的執行,如問題代碼中所示,因此不符合 縮進的FPGA和VHDL設計方法。

相反,使用內部時鐘來觸發處理執行,通常是時鐘的上升邊緣 。進程內的實際更新然後可以根據 檢測到對控制信號的改變,其可以是send_start

send_start_prev <= send_start; -- Previous for edge detection 
    rerun_request <= '0'; -- Default no rerun 
    if ((send_start = '0') and (send_start_prev = '1')) or -- Falling edge of send_start 
     (rerun_request = '1') then -- Rerun request 
     if bit_index = 1 then 
     rerun_request <= '1'; 
     end if; 
     ... -- More code 
    end if; 

process (clock) is 
begin 
    if rising_edge(clock) then 
    send_start_prev <= send_start; -- Previous for edge detection 
    if ((send_start = '0') and (send_start_prev = '1')) then -- Falling edge of send_start 
     ... -- More code 
    end if; 
    end if; 
end process; 

對於基於bit_index = 1重新運行的條件的過程的代碼,例如,該處理的內容可以像被更新