我目前正在为Pynq-Z1 FPGA板开发AES加密内核。我想看一下FPGA逻辑中逻辑的路由以及设计的时序总结。
该项目进行了综合,但结果是警告,提示我正在使用的软件包上的IOB块数量超出限制。这是可以理解的,因为内核可以接收并输出一个4 x 4的矩阵。
相反,我想拥有“内部I / O”以查看FPGA架构上的路由。我将如何去做呢?当前,设备视图显示为空拓扑(如下所示),但是我的综合设计使用了4148 LUT和389 FF。我希望看到一些CLB突出显示。
我感谢任何反馈和对任何应用笔记的引用,它们可能会进一步增进我对FPGA的理解。
欢呼
答案 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_out
将do_buffer
向左移一个字节并读取下一个字节...
当您要在真实的硬件中测试较大系统的子组件时,这种包装方法是非常常见的做法。由于子组件的IO数量经常超过可用IO的数量,串行输入输出解决了这一问题。当然,由于IO操作会产生很大的延迟开销,但这只是为了测试,不是吗?