Не может синтезировать сигнал

Я новичок, когда дело доходит до VHDL, но я работаю на счетчике, который может вручную подсчитывать вверх и вниз нажатием кнопки... Почему-то я только получаю эту ошибку, и я не знаю, что я делаю неправильно, все другие проверки хороши. любое предложение?

Это ошибка, которую я получаю:

ОШИБКА:Xst:827 - строка 101: сигнал s2 не может быть синтезирован, плохое синхронное описание. Стиль описания, который вы используете для описания синхронного элемента (регистр, память и т. Д.), Не поддерживается в текущей версии программного обеспечения.

entity updown is Port (
    rst : in  STD_LOGIC;
    plus , plusin: in  STD_LOGIC;
    minus, minusin : in  STD_LOGIC;
    clk : in  STD_LOGIC;
    ud_out, ud_out2 : out  STD_LOGIC_VECTOR (3 downto 0)
);
end updown;

architecture Behavioral of updown is
    signal s  : unsigned (3 downto 0):= "0000";
    signal s2 : unsigned (3 downto 0) := "0000";
begin

    process(rst, plus, minus, clk, plusin, minusin)
    begin

        if rst='1' then
            s <= "0000";
            s2 <= "0000";
        else
            if rising_edge (clk) then 
                if plus ='1' or plusin = '1' then 
                    if s = "1001" then
                        s <= "0000";
                        if s2 = "1001" then 
                            s2 <= "0000";
                        else
                            s2 <= s2 + 1;
                        end if;                 
                    else
                        s <= s + 1;
                    end if;
                end if;
            else 
                if minus ='1' or minusin = '1' then 
                    if s = "0000" then
                        s <= "1001";

                        if s2= "0000" then
                            s2 <= "1001";
                        else 
                            s2 <= s2 - 1;
                        end if;
                    else 
                        s <= s - 1;
                    end if;             
                end if;
            end if;
        end if;

    end process;

    ud_out <= std_logic_vector(s);
    ud_out2 <= std_logic_vector(s2);

end Behavioral;

1 ответ

Решение

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

Ваш список чувствительности содержит больше, чем нужно для описания синхронного процесса.

замещать

process(rst, plus, minus, clk, plusin, minusin)

с

process(rst, clk )

сигналы будут обновляться только при изменении тактовых импульсов или первого изменения.

Некоторые компиляторы еще более требовательны и могут потребовать изменения

else if rising_edge (clk)then 

в

elsif rising_edge(clk) then 

РЕДАКТИРОВАТЬ:

Это должно работать. Я четко изложил это, так что на самом деле легко следить за тем, что происходит. Я бы посоветовал вам сделать то же самое в будущем. Это делает простые ошибки закрытия легко обнаружить

entity updown is
port ( 
   signal clk     : in   std_logic;
   signal rst     : in   std_logic;
   signal plus    : in   std_logic;
   signal plusin  : in   std_logic;
   signal minus   : in   std_logic;
   signal minusin : in   std_logic;
   signal ud_out  : out  std_logic_vector(3 downto 0);
   signal ud_out2 : out  std_logic_vector(3 downto 0)
);
end entity updown;

architecture behavioral of updown is

    signal s  : unsigned (3 downto 0);
    signal s2 : unsigned (3 downto 0);

begin

   p_counter_process: process(rst, clk)
   begin

      if rst ='1' then 
         s  <= (others => '0');
         s2 <= (others => '0');

      elsif rising_edge(clk) then 

         if plus ='1' or plusin = '1' then 

            if s = "1001" then            
               s <= "0000";

               if s2 = "1001" then 
                  s2 <= "0000";
               else
                  s2 <= s2 + 1;
               end if;                 

            else
                s <= s +1;
            end if;
        end if;

        -- you had a mismatched end if statement here. Removed

        if minus ='1' or minusin = '1' then 

           if s = "0000" then 
              s <= "1001";

              if s2= "0000" then 
                 s2 <= "1001";
              else 
                 s2 <= s2 - 1;
              end if;
           else 
              s <= s - 1;
           end if;             
        end if;

      end if;
   end process;

   ud_out  <= std_logic_vector(s);
   ud_out2 <= std_logic_vector(s2);

end architecture;
Другие вопросы по тегам