Могу ли я использовать «карту портов» в «процессе»? - PullRequest
0 голосов
/ 05 мая 2019
library ieee;
use ieee.std_logic_1164.all;
-- create a entity
entity ex1_3 is 
port(
    a,b,c,d: in std_logic_vector (3 downto 0);
    ctrl: in std_logic;

    sum: out std_logic );
end ex1_3;

architecture impl of ex1_3 is

-- declare a component of four bit ripple carry adder 
component four_bit_ripple_carry_adder is
port(
    a,b: in std_logic_vector (3 downto 0);
    cin: in std_logic;

    s:   out std_logic_vector (3 downto 0);
    cout:out std_logic
);
end component;

signal s: std_logic_vector (3 downto 0);

begin

process(a,b,c,d,ctrl)
begin
-- error:Illegal sequential statement.
if ctrl = '0' then
    u0: four_bit_ripple_carry_adder port map(a,b,ctrl,s,sum);
elsif ctrl = '1' then
    u1: four_bit_ripple_carry_adder port map(c,d,ctrl,s,sum);
end if;

end architecture;

** Ошибка: /home/atomman/drs_exercises/exercise_04/ex1_3.vhd(30): недопустимое последовательное утверждение.

** Ошибка: / home / atomman / drs_exercises /упражнения_04 / ex1_3.vhd (32): недопустимое последовательное утверждение.

** Ошибка: /home/atomman/drs_exercises/exercise_04/ex1_3.vhd(35): рядом с «архитектурой»: (vcom-1576) ожиданиеПРОЦЕСС.

1 Ответ

3 голосов
/ 05 мая 2019

Никогда не забывайте, что «H» в HDL означает «Аппаратное обеспечение».

То, что вы говорите, это "если ctrl = 0, тогда используйте часть оборудования, назовите ее u0, которая подключается как ... иначе замените эту часть оборудования, теперь назовите ее u1 и подключите ее как .. . ". Не существует простого аппаратного эквивалента, который динамически, на основе сигнала (в данном случае «ctrl»), заменяет два компонента.

Единственное отличие состоит в первых двух портах, что делает решение простым: вы делаете один компонент и используете мультиплексор 1 для первых двух входных портов:

signal a_or_c_mux: std_logic_vector (3 downto 0);
signal b_or_d_mux: std_logic_vector (3 downto 0);

  a_or_c_mux <= a when ctrl='0' else c;
  b_or_d_mux <= b when ctrl='0' else d;

Теперь вы можете создать экземпляр вашего модуля (один раз! И вне процесса) и использовать сигналы a_or_c_mux и b_or_d_mux в качестве входных данных для первых двух портов модуля.

1 Специально я использую «аппаратную» номенклатуру.

...