Vivado 中的 VHDL 核心综合和实现

VHDL core synthesis and implementation in Vivado

我目前正在为 Pynq-Z1 FPGA 板开发 AES 加密核心。我想看看FPGA逻辑中逻辑的布线和设计的时序总结。

项目综合,但它导致警告说我正在使用超过包上的 IOB 块数。这是可以理解的,因为内核接收并输出一个 4 x 4 矩阵。

相反,我想要 "internal I/O" 以便查看 FPGA 架构上的路由。我该怎么做呢?目前,设备视图显示空拓扑(如下所示),但我的综合设计使用 4148 LUT 和 389 FF。我希望看到一些 CLB 突出显示。

design device view

感谢任何反馈和对任何应用笔记的参考,这可能会进一步加深我对 FPGA 的理解。

干杯

你的要求自相矛盾
如果设计不能放置所有 I/Os 它就不能显示所有路由,因为它没有所有开始 and/or 端点。你应该减少你的I/O。

最简单的方法是有一个实际或想象的接口,少得多的引脚。

虚构的界面是一种语法正确的界面,可以减少您的 I/Os 但永远不会在现实生活中使用,因此不必在功能上正确。

碰巧你是上周第三个询问减少 I/O 的人,我发布了一个(未经测试的)SPI 接口,它有一个参数来生成任意数量的内部输入和输出。您可以在这里找到它:How can I assign a 256-bit std_logic_vector input

您可以在带有串行接口的内核周围使用一个简单的包装器。类似于:

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 被断言时,包装器在 128 位寄存器 (do_buffer) 中采样 do_core。环境现在可以读取 do_buffer 的最左边字节,它驱动包装器的 do 输出端口。环境断言 shift_out 向左移动 do_buffer 一个字节并读取下一个字节...

当您想在真实硬件中测试大型系统的子组件时,这种包装器是一种非常常见的做法。由于经常发生子组件的数量 IOs 超过可用数量 IOs 的情况,串行输入输出解决了这个问题。当然,由于 IO 操作,延迟开销很大,但这只是为了测试,不是吗?