2014-12-01 2 views
0

В настоящее время я работаю над компонентом, который будет выполнять сложение или вычитание в зависимости от ввода пользователя. Прямо сейчас, я работаю над процессом, который обрабатывает присвоение значений внутренним сигналам, которые будут использоваться внутренними компонентами, которые я использую. Одна проблема возникает в строке, когда я назначаю 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. 
+1

Включите синтаксис VHDL-2008 в свой компилятор. Или перепишите VHDL-2008 «когда» присваивание с помощью оператора If/Then/Else. –

+0

Спасибо. Я закончил просто переписывать его, используя if/then/else –

+1

«Причина, по которой я разместил их после процесса, потому что мне нужно было убедиться, что b_in имеет правильный сигнал, прежде чем другие компоненты смогут его использовать». Обратите внимание, что это вздор. VHDL не является исполняемым кодом. Он описывает оборудование. Порядок параллельных операторов (включая экземпляры компонентов) совершенно не имеет значения, вы просто описываете, как все связано. – QuantumRipple

ответ

2

Тройная оператор .. when .. else .. не допускается внутри технологического блока предварительного на VHDL-2008.

Решение 1: Написать обычный if .. then .. else .. end if заявление
Решение 2: Включить поддержку VHDL-2008 в цепочке инструментов
Solution 3: Написать функцию, позволяет сказать, что ITE (если-то-иначе), который выполняет троичной операция.

Смежные вопросы