我目前正在为Pynq-Z1 FPGA板开发AES加密内核。我想看看FPGA逻辑中的逻辑路由和设计的时序汇总。
该项目合成,但它……
你的要求是矛盾的。 如果设计不能放置所有I / O,则它不能显示所有路由,因为它没有所有的开始和/或端点。你应该减少你的I / O.
最简单的方法是使用真实或虚构的接口,而不是引脚。
一个虚构的界面是一个语法正确的界面,减少你的I / O但永远不会在现实生活中使用,所以不必在功能上正确。
碰巧你是第三个在过去几周内要求减少I / O的人,我发布了一个(未经测试的)SPI接口,它有一个参数来生成任意数量的内部输入和输出。你可以在这里找到它: 如何分配256位std_logic_vector输入
您可以使用串行接口在核心周围使用简单的包装器。就像是:
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 左边一个字节,读取下一个字节......
dsi = '1'
dsi_core
dso_core
do_core
do_buffer
do
shift_out
当您想要在真实硬件中测试较大系统的子组件时,这种包装器是一种非常常见的做法。由于经常发生子组件的IO数量超过可用IO的数量,串行输入输出解决了这个问题。当然,由于IO操作存在显着的延迟开销,但它仅用于测试,不是吗?