2014-11-05 54 views
0

我在VHDL中有此代碼。當我嘗試編譯它時 - 它說「門控時鐘net clock_en是由一個組合引腳產生的。」有沒有人有一個想法如何擺脫這個警告? 我在互聯網上搜索過,找不到解決方案。看起來門控時鐘有時甚至是有用的,但是在設計硬件時它是一個警告。門控時鐘的原因

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all; 
use IEEE.std_logic_arith.all; 

entity ledc8x8 is 
port(
    SMCLK: in std_logic; 
    RESET: in std_logic; 
    ROW: out std_logic_vector(0 to 7); 
    LED: out std_logic_vector(0 to 7) 
); 
end ledc8x8; 

architecture behavioral of ledc8x8 is 
signal count: std_logic_vector(7 downto 0) := (others => '0');   -- hlavni citac 
signal row_count: std_logic_vector(7 downto 0) := "10000000";  -- prepinac radku 
signal clock_en: std_logic;       -- CE 
signal output_logic: std_logic_vector(7 downto 0);  -- "vystup" 
begin 

process(count, SMCLK, RESET, clock_en) 
begin 
    if RESET = '1' then 
     count <= (others => '0'); 
    elsif SMCLK = '1' and SMCLK'event then 
     count <= count + 1; 
    end if; 
    if count="11111110" then 
     clock_en <= '1'; else 
      clock_en <= '0'; 
    end if ; 
end process; 

process(clock_en, RESET) 
begin 
    if RESET = '1' then 
     row_count <= "10000000"; 
    elsif clock_en = '1' and clock_en'event then 
     row_count <= row_count(0) & row_count(7 downto 1); 
    end if; 
end process; 


process(row_count) 
begin 
    case row_count is      
     when "00000001" => output_logic <= "11110110"; 
     -- more switch options 
    end case;        
end process; 


    ROW <= row_count; 
    LED <= output_logic; 


end behavioral; 

回答

2

您的代碼有幾個問題。

正如您在答案中發現的那樣,您使用的是時鐘,並且啓用作爲時鐘。我建議你把它寫這樣一來,雖然:

process(RESET, SMCLK) 
begin 
    if RESET = '1' then 
    row_count <= "10000000"; 
    elsif SMCLK = '1' and SMCLK'event then 
    if clock_en = '1' then 
     row_count <= row_count(0) & row_count(7 downto 1); 
    end if; 
    end if; 
end process; 

它可以工作的其他方式(可能),但它不是傳統的把使支票在同一行的上升沿檢查。還請注意,這意味着您不需要在敏感列表中使用clock_en

您的其他鐘控程序也應該重寫。假設你要分配給clock_en是組合,你應該把它放在一個單獨的進程:

process(RESET, SMCLK) 
begin 
    if RESET = '1' then 
    count <= (others => '0'); 
    elsif SMCLK = '1' and SMCLK'event then 
    count <= count + 1; 
    end if; 
end process; 

process (count) 
begin 
    if count="11111110" then 
    clock_en <= '1'; 
    else 
    clock_en <= '0'; 
    end if ; 
end process; 

你也可以在這裏寫的第二過程作爲一個在線的併發聲明:

clock_en <= '1' when count = "11111110" else '0'; 

由於各種原因,在同一進程中將獨立的時鐘和非時鐘代碼組合在一起不是一種推薦的編碼風格。

+0

感謝您的幫助。感謝。 – Croolman 2014-11-05 18:29:56

1

帶有clock_en'event的行 - 要求上升沿出現問題。替換爲要求SMCLK信號的上升沿。

process(RESET, SMCLK) 
begin 
    if RESET = '1' then 
     row_count <= "10000000"; 
    elsif clock_en = '1' and SMCLK = '1' and SMCLK'event then   
     row_count <= row_count(0) & row_count(7 downto 1); 
     end if; 
    end if; 
end process; 
+0

這不是編寫此代碼的最佳方式,而且您的代碼還有其他幾個重要問題。 – fru1tbat 2014-11-05 14:52:12

+0

同步進程應該只有它們的時鐘和一個異步復位(如果使用)在靈敏度列表中。同步重置和其他控制信號(如'clock_en')不應該觸發一個進程。在這種情況下,你甚至不需要'clock_en'信號。只需將更新'row_count'的進程合併到第一個進程中即可。 – 2014-11-05 16:47:32

+0

修改了代碼。現在它很好 – Croolman 2015-03-10 14:41:31