2014-11-05 1 views
0

У меня этот код в VHDL. Когда я пытаюсь скомпилировать его, он говорит: «Встроенные часы net clock_en получают комбинаторный вывод». Кто-нибудь знает, как избавиться от этого предупреждения? Я искал по всему Интернету и не мог найти решение. Кажется, что закрытые часы иногда даже полезны, но при проектировании HW это предупреждение.Причина встроенных часов

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

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

+0

Синхронные процессы должны иметь только часы и асинхронный сброс (если используется) в списке чувствительности. Синхронные сбросы и другие управляющие сигналы (например, 'clock_en' здесь) не должны запускать процесс. В этом случае вам даже не нужен сигнал 'clock_en'. Просто объедините процесс, обновляющий 'row_count' в первый процесс. –

+0

Исправленный код. Теперь это хорошо – Croolman