2013-04-01 51 views
0

需要實現多個延遲計數器用於跟隨等待時鐘週期,可綜合。如何在同一進程中使用多個延遲計數器在VHDL中

if(clk'event and clk='1')then   
      if (StartTX = 1)then 
        TxBusy <= '1'; 
        StartTxp <= '1'; 
        Wait for 1 clock cycles; 
        StartTxp <= '0'; 
      End IF; 

      IF (StartTX = 1)then 
        Wait x clock cycles ; 
        StartTxM <= '1'; 
        Wait 1 clock cycles; 
        StartTxM<= '0'; 
      End IF ; 

      IF (StartCal = 1) AND (StartInut =1) AND (IValid = 1)then 
        Wait 78 ns ; 
        Interrupt <= '1' ; 
        Wait 1 clock cycle 
        Interrupt = 0 
      End IF 

回答

0

您可以對控制信號的狀態改變事件作爲起點。例如:

if(clk'event and clk='1')then 
     StartTx_Last<=StartTx; -- 1 clock cycle delayed copy of control signal 
     StartTxp <= '0'; -- default value 

     if (StartTX = 1 AND StartTx_Last=0) then -- activate signals only for one clock 
       TxBusy <= '1'; 
       StartTxp <= '1'; 
       DelayCounter <= X; -- start delay counter 
     End IF; 

     -- set StartTxM after X clocks for 1 cycle 
     case DelayCounter is 
     when 1 => -- activity state 
      StartTxM <= '1'; 
      DelayCounter<=0; 
     when 0 => -- idle state 
      StartTxM <='0'; 
     when others => -- delay states 
      DelayCounter<=DelayCounter - 1; 
     end case; 
     .... 

爲78ns延遲需要用一個週期t和正計數器的時鐘,其中n * T = 78ns

+0

在第二條if語句中,如果starttx = 1,則等待X時鐘週期。然後等待1個時鐘週期,以獲得StattxM = 1 –

+0

這就是上面的例子...在StartTx = 1時,DelayCounter用X初始化。一旦DelayCounter遞減到1,StartTxM被設置爲1個時鐘。 DelayCounter保持0直到下一個StartTx = 1 – baldyHDL

0

重寫爲三個獨立的狀態機。如果必須的話,這些可以合併爲一個流程,但每個流程可能更簡單,更清晰。

使用計數器進行「等待X週期」:當您看到StartTX時,用空閒狀態下的X載入它;在等待狀態下遞減,並在達到0時轉換回空閒狀態。

將78ns轉換爲第三個狀態機的適當週期數,並以與第二個狀態機相同的方式實現。

+0

確定當你說爲每一個過程中,意味着對每個狀態機過程權利?還有如何將所有狀態機過程結合在一起? –