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 操作,延迟开销很大,但这只是为了测试,不是吗?
我目前正在为 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 操作,延迟开销很大,但这只是为了测试,不是吗?