Не может синтезировать сигнал
Я новичок, когда дело доходит до 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;