Vivado中的VHDL核心综合和实现

时间:2018-06-28 12:25:10

标签: aes vhdl fpga

我目前正在为Pynq-Z1 FPGA板开发AES加密内核。我想看一下FPGA逻辑中逻辑的路由以及设计的时序总结。

该项目进行了综合,但结果是警告,提示我正在使用的软件包上的IOB块数量超出限制。这是可以理解的,因为内核可以接收并输出一个4 x 4的矩阵。

相反,我想拥有“内部I / O”以查看FPGA架构上的路由。我将如何去做呢?当前,设备视图显示为空拓扑(如下所示),但是我的综合设计使用了4148 LUT和389 FF。我希望看到一些CLB突出显示。

design device view

我感谢任何反馈和对任何应用笔记的引用,它们可能会进一步增进我对FPGA的理解。

欢呼

2 个答案:

答案 0 :(得分:0)

您的要求是矛盾的。
如果设计不能放置所有I / O,则由于它没有全部开始和/或端点,因此无法显示所有路由。您应该减少I / O。

最简单的方法是拥有一个实际或虚构的接口,其引脚要少得多。

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

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

答案 1 :(得分:0)

您可以通过串行接口在核心上使用简单的包装器。像这样:

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,表明处理结束并且内核的do_core输出端口上有128位输出可用为止。断言dso_core时,包装器在128位寄存器(do_core)中对do_buffer进行采样。环境现在可以读取do_buffer的最左边的字节,该字节驱动包装器的do输出端口。环境断言shift_outdo_buffer向左移一个字节并读取下一个字节...

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