В настоящее время я работаю над компонентом, который будет выполнять сложение или вычитание в зависимости от ввода пользователя. Прямо сейчас, я работаю над процессом, который обрабатывает присвоение значений внутренним сигналам, которые будут использоваться внутренними компонентами, которые я использую. Одна проблема возникает в строке, когда я назначаю b_in либо входом b, либо с дополнением 2 к входу b. Появились две ошибки:Ошибка VHDL при использовании условного назначения сигнала (когда ... еще)
Error: COMP96_0015: addsub_16.vhd : (85, 17): ';' expected.
Error: COMP96_0046: addsub_16.vhd : (85, 41): Sequential statement expected.
The errors all reference to the line
b_in <= (b) when add_sub = '0' else (b_2scomp);
However when I placed this outside the process, no error occurred; only when it's inside the process. Can someone please help me why this is and what I can do to solve it?
Кроме того, я знаю, что обычно сопоставление портов выполняется между объявлением архитектуры и началом инструкции архитектуры. Причина, по которой я разместил их после процесса, состоит в том, что мне нужно убедиться, что b_in имеет правильный сигнал, прежде чем другие компоненты смогут его использовать. Я не знаю, правильно ли это сделать, но я надеюсь, что это так. Это на всякий случай, если вы, ребята, задаетесь вопросом, почему я так люблю это. Благодаря
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use IEEE.STD_LOGIC_ARITH.all;
entity addsub_16 is
port(
c_in : in STD_LOGIC;
enable : in std_logic;
reset : in std_logic;
clk : in std_logic;
add_sub : in STD_LOGIC;
a : in STD_LOGIC_VECTOR(15 downto 0);
b : in STD_LOGIC_VECTOR(15 downto 0);
c_out : out STD_LOGIC;
result : out STD_LOGIC_VECTOR(15 downto 0)
);
end addsub_16;
architecture addsub_16 of addsub_16 is
--Signal declarations to hold internal vectors a, b g, p, and carry
signal a_in : std_logic_vector(15 downto 0); --Holds input a
signal b_in : std_logic_vector(15 downto 0); --Holds input b if add_sub = 0. Otherwise, holds b_2scomp
signal b_2scomp : std_logic_vector(15 downto 0); --Holds the 2s complement of b
signal prop_in : std_logic_vector(15 downto 0); --Holds the propagate signals from CLAs
signal gen_in : std_logic_vector(15 downto 0); --Holds the generate signals from CLAs
signal carry_in : std_logic_vector(15 downto 0); --Holds the carry signal from carry_logic
signal temp_result : std_logic_vector(15 downto 0); --Holds the temporary result to be driven out
--Component declarations
component cla_4bit
port (
a, b : in std_logic_vector(3 downto 0);
gen, prop : out std_logic_vector(3 downto 0)
);
end component;
component carry_logic
port (
g, p : in std_logic_vector(15 downto 0);
c_in : in std_logic;
carry : out std_logic_vector(15 downto 0);
c_out : out std_logic
);
end component;
--Actual behavior of module
begin
--b_in <= (b) when add_sub = '0' else (b_2scomp);
process (clk, reset)
begin
if reset = '0' then --At reset, everything is 0
a_in <= (others => '0');
b_in <= (others => '0');
b_2scomp <= (others => '0');
temp_result <= (others => '0');
elsif (rising_edge(clk)) then --Read in data to components on rising edge
if enable = '1' then --Only if enable is on
a_in <= a;
b_2scomp <= ((not b) + '1');
b_in <= (b) when add_sub = '0' else (b_2scomp);
end if;
elsif (falling_edge(clk)) then --Drive out values on falling edge
for i in 0 to 15 loop
temp_result(i) <= a_in(i) xor b_in(i) xor carry_in(i);
end loop;
result <= temp_result;
end if;
end process;
--portmapping of the components here. I don't think it'd be necessary to include them, but let me know if they are needed.
Включите синтаксис VHDL-2008 в свой компилятор. Или перепишите VHDL-2008 «когда» присваивание с помощью оператора If/Then/Else. –
Спасибо. Я закончил просто переписывать его, используя if/then/else –
«Причина, по которой я разместил их после процесса, потому что мне нужно было убедиться, что b_in имеет правильный сигнал, прежде чем другие компоненты смогут его использовать». Обратите внимание, что это вздор. VHDL не является исполняемым кодом. Он описывает оборудование. Порядок параллельных операторов (включая экземпляры компонентов) совершенно не имеет значения, вы просто описываете, как все связано. – QuantumRipple