«Я застрял на карте портов» не является конкретной формулировкой проблемы.
С именованными ассоциациями могут быть ассоциированы члены формальных портов в картах индивидуально , а также в целом , если все члены формальности связаны - IEEE Std 1076-2008 6.5 .7 Списки ассоциаций:
Формальный интерфейсный объект должен быть либо явно объявленным интерфейсным объектом, либо членом (см. 5.1) такого интерфейсного объекта. В первом случае говорят, что такой формал ассоциируется в целом . В последних случаях именованная ассоциация используется для связи формального и фактического; говорят, что подэлементы такого формального элемента связаны индивидуально . Кроме того, каждый скалярный подэлемент явно объявленного объекта интерфейса должен быть связан ровно один раз с фактическим (или его подэлементом) в одном и том же списке ассоциаций, и все такие ассоциации должны появляться в непрерывной последовательности в этом списке ассоциаций. Каждый элемент ассоциации, который связывает срез или подэлемент (или его срез) объекта интерфейса, должен идентифицировать формальное с локально статическим именем.
Обратите внимание, что у вас слишком много элементов переноса (нужно только два), вам не нужны andgate (0), не нужны sumout (0), sumout (4) или sumout (11 downo 8), есть посторонний символ в многопользовательской архитектуре вы пропускаете контекстные предложения и имеете неиспользуемые предложения использования.
Ваш код с использованием массива промежуточных сигналов:
library ieee;
use ieee.std_logic_1164.all;
-- use ieee.std_logic_textio.all; -- NOT USED
-- use ieee.std_logic_unsigned.all; -- NOT USED
entity multy is
port (
x: in std_logic_vector (3 downto 0);
y: in std_logic_vector (3 downto 0);
p: out std_logic_vector (7 downto 0)
);
end entity multy;
architecture rtl of multy is
component Ripple_Adder
port (
A: in std_logic_vector (3 downto 0);
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;
-- AND Product terms:
signal G0, G1, G2: std_logic_vector (3 downto 0);
-- B Inputs (B0 has three bits of AND product)
signal B0, B1, B2: std_logic_vector (3 downto 0);
begin
-- y(1) thru y (3) AND products, assigned aggregates:
G0 <= (x(3) and y(1), x(2) and y(1), x(1) and y(1), x(0) and y(1));
G1 <= (x(3) and y(2), x(2) and y(2), x(1) and y(2), x(0) and y(2));
G2 <= (x(3) and y(3), x(2) and y(3), x(1) and y(3), x(0) and y(3));
-- y(0) AND products (and y0(3) '0'):
B0 <= ('0', x(3) and y(0), x(2) and y(0), x(1) and y(0));
-- named association:
cell_1:
Ripple_Adder
port map (
a => G0,
b => B0,
cin => '0',
cout => B1(3), -- named association can be in any order
S(3) => B1(2), -- individual elements of S, all are associated
S(2) => B1(1), -- all formal members must be provide contiguously
S(1) => B1(0),
S(0) => p(1)
);
cell_2:
Ripple_Adder
port map (
a => G1,
b => B1,
cin => '0',
cout => B2(3),
S(3) => B2(2),
S(2) => B2(1),
S(1) => B2(0),
S(0) => p(2)
);
cell_3:
Ripple_Adder
port map (
a => G2,
b => B2,
cin => '0',
cout => p(7),
S => p(6 downto 3) -- matching elements for formal
);
p(0) <= x(0) and y(0);
end architecture rtl;
И заимствованный стенд для демонстрации:
library ieee;
use ieee.std_logic_1164.all;
entity multy_tb is -- testbench
end entity;
architecture foo of multy_tb is
signal x, y: std_logic_vector (3 downto 0);
signal yp, rp: std_logic_vector (7 downto 0);
use ieee.numeric_std.all;
function to_string (inp: std_logic_vector) return string is
variable image_str: string (1 to inp'length);
alias input_str: std_logic_vector (1 to inp'length) is inp;
begin
for i in input_str'range loop
image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
end loop;
return image_str;
end function;
begin
DUT:
entity work.multy
port map (
x => x,
y => y,
p => yp
);
STIMULI:
process
begin
for i in 0 to 15 loop
x <= std_logic_vector(to_unsigned(i, x'length));
for j in 0 to 15 loop
y <= std_logic_vector(to_unsigned(j, y'length));
wait for 0 ns; -- assignments take effect
rp <= std_logic_vector(unsigned (x) * unsigned(y));
wait for 10 ns;
if yp /= rp then
report "multy error";
report HT & "expected " & to_string (rp);
report HT & "got " & to_string (yp);
end if;
end loop;
end loop;
wait;
end process;
end architecture;
Функция to_string включена для симуляторов до 2008 года. Контекстные предложения были добавлены в FA и Ripple_Adder.