Синтез и внедрение VHDL-ядра в Vivado - PullRequest
0 голосов
/ 28 июня 2018

В настоящее время я разрабатываю ядро ​​шифрования AES для платы FPGA Pynq-Z1. Я хотел бы видеть маршрутизацию логики в логике ПЛИС и временную сводку проекта.

Проект синтезирует, но в результате выдается предупреждение о том, что я использую превышение количества блоков IOB в пакете. Это понятно, потому что ядро ​​принимает и выводит матрицу 4 x 4.

Вместо этого я хотел бы иметь "внутренний ввод / вывод", чтобы увидеть маршрутизацию на матрице ПЛИС. Как бы я поступил так? В настоящее время вид устройства показывает пустую топологию (показано ниже), но мой синтезированный дизайн использует 4148 LUT и 389 FF. Я ожидаю увидеть некоторые подсвеченные CLB.

дизайн устройства вид

Я ценю любые отзывы и ссылки на любые замечания по применению, которые могут улучшить мое понимание ПЛИС.

Приветствия

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете использовать простую оболочку вокруг вашего ядра с последовательным интерфейсом. Что-то вроде:

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 на один байт влево и чтения следующего байта ...

Этот вид обертки является очень распространенной практикой, когда вы хотите проверить на реальном оборудовании подкомпонент большей системы. Поскольку часто бывает так, что количество входов / выходов подкомпонентов превышает количество доступных входов / выходов, последовательный ввод-вывод решает эту проблему. Конечно, из-за операций ввода-вывода возникают значительные задержки, но это только для тестирования, не так ли?

0 голосов
/ 28 июня 2018

Ваши требования противоречивы.
Если проект не может разместить все входы / выходы, он не может показать всю маршрутизацию, поскольку он имеет не все начальную и / или конечную точки. Вы должны уменьшить ваш ввод / вывод.

Самый простой способ - иметь реальный или воображаемый интерфейс, который намного меньше булавок.

Мнимый интерфейс - это тот, который синтаксически правильный, сокращает ваши операции ввода-вывода, но никогда не будет использоваться в реальной жизни, поэтому не должен быть функционально правильным.

Как оказалось, вы третий человек, который спрашивает об уменьшении ввода / вывода за последние недели, и я разместил (непроверенный) интерфейс SPI, в котором есть параметр для генерации произвольного количества внутренних входов и выходов. Вы можете найти его здесь: Как я могу назначить 256-битный вход std_logic_vector

...