Счетчики мультиплексора VHDL 7 сегмент

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

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;

person Mahmoud ElMarakshy    schedule 29.11.2013    source источник


Ответы (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 реализует последовательный элемент (flip-flop), и проблем с этим процессом быть не должно.

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

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

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

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

person Morten Zilmer    schedule 29.11.2013