Ошибка VHDL Ошибка (10822): не удалось реализовать регистры для назначения

Я пытаюсь реализовать триггер JK с асинхронной предустановкой и очисткой, с логикой положительного фронта на часах.

Я получаю следующую ошибку от Altera Quartus II:

Ошибка (10822): ошибка HDL в JK_FF_PE_D1.vhd(52): не удалось реализовать регистры для назначений на этом фронте тактового сигнала.

Ошибка: невозможно разработать иерархию пользователей верхнего уровня.

Ошибки не вижу... Буду очень признателен за подсказку или совет.

Заранее спасибо!

library ieee;
use ieee.std_logic_1164.all;

entity JK_FF_PE_D1 is
  port(
    J, K        : in    std_logic;  -- J, K inputs of flip flop
    PS          : in    std_logic;  -- Preset of flip flop
    CLR         : in    std_logic;  -- CLR of flip flop
    CLK         : in    std_logic;  -- Clock 
    Q, Qcompl   : out   std_logic  -- Q and its complementary output
    );
end entity JK_FF_PE_D1;

architecture simple of JK_FF_PE_D1 is
  signal temp_Q, temp_Qcompl : std_logic;

begin

  p0:process(PS, CLR, CLK) is
  begin
     case std_logic_vector'(PS, CLR) is
          when "00" =>
            temp_Q <= '1';
            temp_Qcompl <= '1';
          when "01" =>
            temp_Q <= '1';
            temp_Qcompl <= '0';
          when "10" =>
             temp_Q <= '0';
             temp_Qcompl <= '1';
          when others =>   -- Preset = 1 , Clear = 1
             if rising_edge (CLK) then  -- Clock turns from 0 -> 1
               case std_logic_vector'(J, K) is
                    when "11" =>
                      temp_Q <= not temp_Q;
                      temp_Qcompl <= not temp_Qcompl;
                    when "10" =>
                      temp_Q <= '1';
                      temp_Qcompl <= '0';
                    when "01" =>
                      temp_Q <= '0';
                      temp_Qcompl <= '1';
                    when others =>
                      null;
               end case;
             end if;
     end case;
  end process p0;
  Q <= temp_Q;
  Qcompl <= not temp_Qcompl;

end architecture simple;

person G.V.    schedule 16.12.2013    source источник


Ответы (1)


Это похоже на ограничение в Altera Quartus II, поскольку внешний case может быть изменен на if, как показано ниже, и тогда он может пройти через синтез:

p0 : process(ps, CLR, CLK) is
begin
  if std_logic_vector'(ps, CLR) = "00" then
    temp_Q      <= '1';
    temp_Qcompl <= '1';
  elsif std_logic_vector'(ps, CLR) = "01" then
    temp_Q      <= '1';
    temp_Qcompl <= '0';
  elsif std_logic_vector'(ps, CLR) = "10" then
    temp_Q      <= '0';
    temp_Qcompl <= '1';
  else                              -- Preset = 1 , Clear = 1
    if rising_edge (CLK) then       -- Clock turns from 0 -> 1
      case std_logic_vector'(J, K) is
        when "11" =>
          temp_Q      <= not temp_Q;
          temp_Qcompl <= not temp_Qcompl;
        when "10" =>
          temp_Q      <= '1';
          temp_Qcompl <= '0';
        when "01" =>
          temp_Q      <= '0';
          temp_Qcompl <= '1';
        when others =>
          null;
      end case;
    end if;
  end if;
end process p0;

Если конкретное целевое устройство не поддерживает триггеры как с асинхронной установкой, так и со сбросом, выдается предупреждение.

person Morten Zilmer    schedule 16.12.2013
comment
Большое спасибо за вашу помощь... Я думал изменить случай на if, но понял, что это было бы действительно глупым ограничением компилятора... Спасибо - person G.V.; 16.12.2013
comment
Сопоставление с шаблоном — компилятор видит цепочку if..elsif как набор асинхронных предустановленных/очищающих инструкций, за которыми следует синхронизированная часть. Это соответствует его шаблону для триггера. Оператор case, описывая одно и то же поведение, не признается таковым. Было бы интересно посмотреть, смогут ли XST и Synplify справиться с этим или нет... (прогноз: XST не может, Synplify может) - person Martin Thompson; 17.12.2013