2014-03-31 50 views
-1

我需要生成的16位...我的延遲是不工作來產生所需的圖案..... 也是我的for循環無法正常延遲 工作領導模式,就像我需要幫助,使用流來genrate模式任何沒有。有點使用延遲...... ????使用Vhdl ...生成碼型?

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 

entity counters_1 is 
    port(CLK : in std_logic; 
     Q : out std_logic_vector(2 downto 0); 
      led_out : out std_logic_vector(15 downto 0)); 
end counters_1; 

architecture archi of counters_1 is 
    signal tmp: std_logic_vector(2 downto 0) := "000"; 
begin 
    process (CLK) 
    begin 
-- variable i :Integer :=0; 
-- variable j :Integer :=0; 
     if (CLK'event and CLK='1') then 

      tmp <= tmp + 1; 
      if(tmp="100") then 
      tmp <="000"; 
      end if; 

     end if; 

      if(tmp="00") then 
     loop1: for i in 0 to 10 loop 
     led_out <="0000000000000001" ; 
     led_out <="0000000000000010" ; 
     end loop; 
     end if; 

      if(tmp="01") then 
     loop2: for i in 0 to 10 loop 
     led_out <="1111111100000000"; 
     led_out <="000000001111111" after 500 ms; 
     end loop; 
     end if; 

      if(tmp="10") then 
     loop3: for i in 0 to 10 loop 
     led_out <="0011000000000101"; 
     led_out <="0000000111000110" after 500 ms; 
     end loop; 
     end if; 

      if(tmp="11") then 
     loop4: for i in 0 to 10 loop 
     led_out <="0000001100000111" after 500 ms; 
     led_out <="0000000000001000" after 500 ms; 
       led_out <="0001001000001000" after 500 ms; 
       led_out <="0000000000001000" after 500 ms; 
       led_out <="0100001100000111" after 500 ms; 
     led_out <="0000000000001000" after 500 ms; 
       led_out <="0010001000001000" after 500 ms; 
       led_out <="1000000000001000" after 500 ms; 
       led_out <="0001001100000111" after 500 ms; 
     led_out <="0000000000001000" after 500 ms; 
       led_out <="0011001000001000" after 500 ms; 
       led_out <="0000000000001000" after 500 ms; 
       led_out <="0100111100000111" after 500 ms; 
     led_out <="0000011110001000" after 500 ms; 
       led_out <="0010001000001000" after 500 ms; 
       led_out <="1000001110001000" after 500 ms; 
     end loop; 
     end if; 

    end process; 

    Q <= tmp; 

end archi; 
+0

這是否需要綜合? – Thanushan

+3

像這樣的延遲是不可綜合的。你最好的選擇是創建一個基於計數器的狀態機。 – N8TRO

回答

0

如果您正在進行RTL設計,您需要考慮更多問題中的硬件。繪製圖片。編碼圖片。

爲了幫助這個過程中,你需要考慮以下幾點:

  • 有多快的時鐘運行?
  • 你打算如何從你的時鐘創建一個500毫秒的指標? (提示:計數器+解碼器)
  • 在Clk上切換tmp速度太快。
  • 要獲得循環4的順序,你會需要的statemachine或其他計數器和解碼

提出更多的問題,一旦你有想過你的問題更多。

0

您的代碼看起來像一個測試臺,所以我會假設這是你想要的。你的問題圍繞着「之後」而展開。 「之後」用於安排信號延遲。但是,它永遠不會停止這個過程。信號值是預定的,並且過程在沒有任何時間的情況下繼續。

另一方面,你想要發生的是過程停止。您需要使用wait來導致進程停止。

在循環4使用此爲您的代碼:

loop4: for i in 0 to 10 loop 
    wait for 500 ms ; 
    led_out <="0000001100000111" ; 
    wait for 500 ms ; 
    led_out <="0000000000001000" ; 
    wait for 500 ms ; 
    led_out <="0001001000001000" ; 
    ... 

如果這是一個測試平臺,你將不再需要運行基於CLK上的過程,相反,這些類型的進程中運行基於「等待」甦醒向上。

你也可能不需要tmp。如果你確定你需要tmp,那麼只需要2位(這是可以的,因爲計數器會翻轉),或者你的比較需要使用如下所示的片。另外,請閱讀信號和變量更新之間的差異。對於測試平臺,你一定要在這裏使用一個變量(另外,你的代碼是不正確的,除非你把它變成一個變量)。

if(tmp(1 downto 0) ="00") then 

我將在您執行RTL代碼的情況下創建一個單獨的帖子。

+0

我的代碼不是測試平臺.....然後如何生成500毫秒的延遲...? –