Вы можете использовать простую оболочку вокруг вашего ядра с последовательным интерфейсом. Что-то вроде:
entity wrapper is
port(clk, rst, dsi, dsi_core, shift_out: in std_ulogic;
di: in std_ulogic_vector(7 downto 0);
dso_core: out std_ulogic;
do: out std_ulogic_vector(7 downto 0)
);
end entity wrapper;
architecture rtl of wrapper is
signal di_core, do_core, do_buffer: std_ulogic_vector(127 downto 0);
begin
u0: entity work.core(rtl)
port map(clk, rst, dsi_core, di_core, dso_core, do_core);
input_process: process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
di_core <= (others => '0');
elsif dsi = '1' then
di_core <= di & di_core(127 downto 8);
end if;
end if;
end process input_process;
output_process: process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
do_buffer <= (others => '0');
elsif dso_core = '1' then
do_buffer <= do_core;
elsif shift_out = '1' then
do_buffer <= do_buffer(119 downto 0) & X"00";
end if;
end if;
end process output_process;
do <= do_buffer(127 downto 120);
end architecture rtl;
Оболочка просто получает входные данные, по одному байту за раз (когда dsi = '1'
), и смещает их в 128-битный регистр, который подключен к 128-битному входу вашего ядра. Когда введено 16 байтов, среда утверждает dsi_core
, чтобы дать ядру команду на выборку и обработку 128-битного ввода. Среда ожидает, пока ядро не подтвердит dso_core
, сигнализируя о том, что обработка завершена и 128-битный выходной сигнал доступен на выходном порту do_core
ядра. Когда dso_core
подтверждено, обертки сэмплы do_core
в 128-битном регистре (do_buffer
). Среда теперь может читать самый левый байт do_buffer
, который управляет выходным портом do
оболочки. Окружение утверждает shift_out
для смещения do_buffer
на один байт влево и чтения следующего байта ...
Этот вид обертки является очень распространенной практикой, когда вы хотите проверить на реальном оборудовании подкомпонент большей системы. Поскольку часто бывает так, что количество входов / выходов подкомпонентов превышает количество доступных входов / выходов, последовательный ввод-вывод решает эту проблему. Конечно, из-за операций ввода-вывода возникают значительные задержки, но это только для тестирования, не так ли?