2014-02-14 73 views
0

我正在尋找我的問題的原因或答案是: 我的VHDL代碼正在工作,我試圖創建一個分頻器的10個。 The問題是模擬報告不斷給我一個未定義的輸出(沒有值)。不能爲我的VHDL代碼模擬

這是我的VHDL代碼,我會很感激任何幫助!謝謝!

Library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 

entity Frequency_divider is 
port(clk: in std_logic; 
    Q:out std_logic); 
end Frequency_divider; 

architecture desc_freq_divider_10 of Frequency_divider is 


signal S: std_logic:='0'; 
begin 

process(clk,S) 
    variable cpt: integer:=0; 
    begin 

     if (rising_edge(clk)) then 
      cpt:=cpt+1; 
     end if; 

     if (cpt=5) then 
      S<=not(S); 
      cpt:=0; 
     end if; 

    end process;  
    Q<=S; 
end desc_freq_divider_10;  

回答

1

我擺脫了多餘的使用條款:

--use ieee.std_logic_arith.all; 
--use ieee.std_logic_unsigned.all; 

增加了一個測試平臺:

library ieee; 
use ieee.std_logic_1164.all; 

entity freq_test is 
end entity; 

architecture tb of freq_test is 
    signal CLK:  std_logic :='0'; 
    signal Q:  std_logic; 
begin 

CLOCK: 
    process 
    begin 
     if Now < 300 ns then 
      wait for 10 ns; 
      clk <= not clk; 
     else 
      wait; 
     end if; 
    end process; 
DUT: 
    entity work.frequency_divider 
     port map (clk,q); 
end architecture; 

分析這一切,闡述了模擬化,得到它的工作。

freq_test output divide by 10

它說你的代碼的功能和你有一個工具鏈用法錯誤更可能。

1

模擬要細,如大衛·孔茨介紹,但對於一個綜合設計過程中應該只有clk靈敏度清單,並應有在if聲明像所有更新:

process(clk) 
    variable cpt : integer range 0 to 5 := 0; -- Must be constrained for synthesis 
begin 
    if (rising_edge(clk)) then 
    cpt := cpt+1; 
    if (cpt = 5) then 
     S <= not(S); 
     cpt := 0; 
    end if; 
    end if; 
end process; 

其他設計很可能會推斷鎖存器和類似的問題。

2014年2月17日編輯:加限制的cpt整數,因爲合成想不通最小的大小,從而會讓太多的觸發器。