У меня есть следующий VHDL код для реализации сумматора, используя структурную архитектуру, поэтому сначала я должен сделать основной сумматор с использованием пакетом numeric_std в два VHD-файлов:структурный сумматор (2 вида) с numeric_std
это adder.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity adder is
generic(
g_width : natural := 32);
port(
cin : in std_logic;
op1 : in std_logic_vector (g_width-1 downto 0);
op2 : in std_logic_vector (g_width-1 downto 0);
add : out std_logic_vector (g_width downto 0));
end adder;
, а затем rtl.vhd:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
architecture rtl of adder is
begin
add <= std_logic_vector(resize(unsigned(op1), g_width+1) + resize(unsigned(op2), g_width+1) + unsigned'(0=>cin));
end rtl;
все это нормально здесь, но тогда я должен сделать еще один сумматор (cpa.vhd, которые имеют архитектуру сумматора с использованием экземпляров нового enitty fa.vhd (который новый файл) так вот код:
fa.vhd:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity fa is
port( ope1 : in std_logic;
ope2 : in std_logic;
cin : in std_logic;
cout : out std_logic;
sum : out std_logic);
end entity fa;
cpa.vhd:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
architecture cpa of adder is
component fa is
port( ope1 : in std_logic;
ope2 : in std_logic;
cin : in std_logic;
cout : out std_logic;
sum : out std_logic);
end component;
signal carry : std_logic_vector(g_width downto 0);
begin
p_cpa : for i in 0 to g_width-1 generate
i_fa : fa port map(
ope1=>op1(i),
ope2=>op2(i),
cin=>carry(i),
sum=>add(i),
cout=>carry(i+1));
end generate p_cpa;
end cpa;
так что проблема в том, что она не работает, когда я запускаю Тб, кажется беззнаковое:
Я не знаю, где проблема.
я забыл TB:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
entity tb_adder is
end tb_adder;
architecture beh of tb_adder is
constant c_width : natural := 32;
constant c_upper_bound : natural := (2**16)-1;
component adder
generic(
g_width : natural := 16
);
port(
cin : in std_logic;
op1 : in std_logic_vector(g_width-1 downto 0);
op2 : in std_logic_vector(g_width-1 downto 0);
add : out std_logic_vector(g_width downto 0)
);
end component;
-- Inputs
signal cin : std_logic;
signal op1 : std_logic_vector(c_width-1 downto 0) := (others => '0');
signal op2 : std_logic_vector(c_width-1 downto 0) := (others => '0');
-- Outputs
signal res : std_logic_vector(c_width downto 0);
signal res_xpct : std_logic_vector(c_width downto 0);
begin
--Instance
dut : adder generic map (
g_width => c_width
)
port map (
cin => cin,
op1 => op1,
op2 => op2,
add => res
);
cin <= '0';
p_stim : process
variable v_i : natural := 0;
variable v_j : natural := 0;
begin
i_loop : for v_i in 0 to c_upper_bound loop
j_loop : for v_j in 0 to c_upper_bound loop
op1 <= std_logic_vector(to_unsigned(v_i, c_width));
op2 <= std_logic_vector(to_unsigned(v_j, c_width));
res_xpct <= std_logic_vector(to_unsigned(v_i + v_j, c_width+1));
wait for 10 ns;
assert res = res_xpct
report "Error: wrong operation"
severity error;
wait for 10 ns;
end loop j_loop;
end loop i_loop;
wait;
end process p_stim;
end beh;
Спасибо за ваш ответ.
Это не [минимальный, полный и проверенный пример] (http: // stackoverflow.com/help/mcve) без архитектуры для fa, в вашей форме сигналов отображаются все «U» ((«U» - Uninitialized)), что приводит к выводам всех «U», и вы не описали, что вы сделали для решения проблема до сих пор. Как 'adder' порт' cin' вводится в первый 'fa'' cin в 'p_cpa'? Требуется параллельное назначение 'carry (0) <= cin;'. Вам не нужны контекстные предложения, реплицируемые в архитектурах. Покажите свой тестовый стенд. – user1155120
@kriptor, конечно, все сигналы не инициализированы, вы их не инициализировали. Вам нужно создать процесс на тестовом стенде, чтобы генерировать входные данные для логики, которую вы хотите протестировать. – Ian