2013-11-29 2 views
0

Я новичок в VHDL, и мой код может показаться глупым, но я все еще боюсь. Я пытаюсь сделать счетчик BCD, используя комплект Spartan 3. У меня проблема с мультиплексированием 7 сегментов, и я знаю, что должен использовать компоненты , но я пошел с более простым способом. Я получаю эту ошибку в синтезе: «строка 103: в списке чувствительности процесса отсутствует один или несколько сигналов». Чтобы включить синтез аппаратного обеспечения FPGA/CPLD, XST предположит, что все необходимые сигналы присутствуют в списке чувствительности. Обратите внимание, что результат синтеза может отличаться от первоначальной спецификации. Отсутствующие сигналы: любая помощь оценена. Спасибо.Счетчики VHDL мультиплексор 7 сегмент

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.STD_LOGIC_ARITH.all; 
use IEEE.STD_LOGIC_UNSIGNED.all; 

---- Uncomment the following library declaration if instantiating 
---- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity lab5 is 
    port (clk  : in std_logic; 
     x  : in std_logic; 
     --count : inout STD_LOGIC_VECTOR (3 downto 0); 
     data_out : out std_logic_vector (6 downto 0); 
     an  : out std_logic_vector (3 downto 0) 
     ); 

end lab5; 

architecture Behavioral of lab5 is 
    signal counter : std_logic_vector (3 downto 0) := (others => '0'); 
    signal prescaler : std_logic_vector (25 downto 0); 
    signal prescaler2 : std_logic_vector (11 downto 0); 
    signal counter2 : std_logic_vector (1 downto 0) := (others => '0'); 
begin 

    CounterProcess : process(CLK, x) 
    begin 
    --prescaler is used as a clock slower to increment the counter every 50M cycles(1 sec) 
    if rising_edge(CLK) then 
     if prescaler < "10111110101111000010000000" then 
     prescaler <= prescaler+1; 

     else 
     prescaler <= (others => '0'); 
     if x = '0' then 
      if counter = "1001" then 
      counter <= "0000"; 
      else 
      counter <= counter+1; 
      end if; 
     else 
      if counter = "0000" then 
      counter <= "1001"; 
      else 
      counter <= counter-1; 
      end if; 
     end if; 
     end if; 
    end if; 

    end process; 

--count<=counter; 

    Sevensegclock : process(CLK) 
    begin 
    if rising_edge(CLK) then 
     --scale clock to count(which will be the segment selector) every 1024 cycle 
     if prescaler2 < "010000000000" then 
     prescaler2 <= prescaler2+1; 

     else 
     prescaler2 <= (others => '0'); 
     if counter2 = "11" then 
      counter2 <= "00"; 
     else 
      counter2 <= counter2+1; 
     end if; 
     end if; 
    end if; 

    end process; 

    sevenseg : process(counter2, clk) 
    begin 
    --counter the segment selector used to activate selector and decode data 
    if counter2 = "00" then 
     an <= "1110"; 
     if counter(0) = '0' then 
     data_out <= "0000001"; 
     else 
     data_out <= "1001111"; 
     end if; 

    end if; 

    if counter2 = "01" then 
     an <= "1101"; 
     if counter(1) = '0' then 
     data_out <= "0000001"; 
     else 
     data_out <= "1001111"; 
     end if; 
    end if; 

    if counter2 = "10" then 
     an <= "1011"; 

     if counter(2) = '0' then 
     data_out <= "0000001"; 
     else 
     data_out <= "1001111"; 
     end if; 
    end if; 

    if counter2 = "11" then 
     an <= "0111"; 
     if counter(3) = '0' then 
     data_out <= "0000001"; 
     else 
     data_out <= "1001111"; 
     end if; 
    end if; 

    end process; 

end Behavioral; 

ответ

1

Одно место, чтобы начать, для каждого из процессов, чтобы определить, является ли он реализует последовательный элемент (флип-флоп) или комбинаторный элемент (ворота).

Шаблон для процесса, который реализует последовательный элемент (флип-флоп), без асинхронного сброса, может быть:

process (clk) is 
begin 
    if rising_edge(clk) then 
    -- Code for assign to flip-flop outputs at rising edge 
    end if; 
end process; 

Шаблон для процесса, который реализует комбинаторный элемент (ворота), может быть:

process (all) is -- "all" make sensitivity on all used signals 
begin 
    -- Code for assign to gate outputs 
end process; 

Обратите внимание, что (all) может использоваться в VHDL-2008 синтаксисе только еще для предыдущего VHDL списка синтаксиса версии всех сигналов явно в списке чувствительности

В соответствии с одним из шаблонов инструмент синтеза определяет, как реализовать проект, описанный в коде VHDL. Однако, если код соответствует ни одного из шаблонов, то инструмент синтеза может иметь трудности определяет, как реализовать код VHDL в FPGA, и результатом может быть сообщение об ошибке , как и тот, который вы получите.

На основе шаблонов процесс Sevensegclock реализует последовательный элемент (триггер), и в этом процессе не должно возникать проблем.

Однако процессы CounterProcess и sevenseg не соответствуют ни одному из шаблонами для последовательного или комбинаторного элемента.

Для процесса CounterProcess, похоже, что вы хотите реализовать последовательный элемент (флип-флоп), но список чувствительности x включен. Решение , вероятно, должно удалить x из списка чувствительности.

Для процесса sevenseg, похоже, что вы хотите реализовать комбинаторной элемент (ворота), но список чувствительности не распространяется на все сигналы используются в процессе, и даже включает в себя clk, который не используется в процесс. Решение, если вы используете VHDL-2008, заключается в замене списка чувствительности на (all), а если использовать предыдущие версии VHDL, сделайте список чувствительности , чтобы покрыть все сигналы, используемые в процессе (counter2, counter).

Отказ от ответственности: Я не проверял логическую правильность кода в процессе ; поэтому выше всего лишь дать некоторые общие рекомендации о том, как писать процессы , чтобы сделать различные типы элементов дизайна в FPGA.

Смежные вопросы