大型矢量最有效的 VHDL?

Most efficient VHDL for large vector?

我希望能够有一个移位寄存器对另一个加载了一些值的寄存器进行异或运算。问题是我希望使用大规模矢量来执行此操作,大约数千位宽。

在 VHDL 中执行此操作的明显方法类似于

generic( length : integer := 15);

signal shiftreg : std_logic_vector(length downto 0);


process(clk) 
begin
    if rising_edge(clk) then
        shiftreg<= shiftreg(length-1 downto 0) & input;
    endif;
end process;

但是,如果此处的长度设置为某个非常高的数字,则尝试合成它会成为一项艰巨的任务。由于这是一个相对简单的结构,我想它会花费这么长时间,因为长度远远超出了单个块中的寄存器数量。

我的问题是是否有某种方法可以更快地合成来实现像这样的大向量。例如,使用

之类的东西是否更快
array(length downto 0) of std_logic;

或者综合工具是否识别出它们是等效的?

虽然面积利用率和时序通常与 FPGA 设计相关,但综合时间通常与 FPGA 设计无关。如果您的移位寄存器占用了目标 FPGA 所拥有的大部分资源,那么综合将花费很长时间来尝试找出使其工作的方法,并且同样地,当您填充更大的部件时,构建需要更长的时间。对于某些球场,现代中端 FPGA 中时序紧迫的 80% 完整设计通常需要大约 30 分钟的综合时间和 3 小时的布局和布线时间。如果您仍在描述相同的功能,这不会受到编码风格的显着影响。

如果您在 VHDL 中使用 std_logic_vector、您定义为 std_logic 的数组或其他任何类型来描述移位寄存器(具有相同的功能特性),它将综合到同样的事情。

至少在最近的 Xilinx 部件中,只要您没有描述复位(同步或异步),单个 LUT 就可以用于 64 位深度移位寄存器。您同样可以使用少量 LUT 生成 1000 深度移位寄存器。

现在,如果您希望使用此移位寄存器的全部 1000+ 位与其他寄存器进行异或运算,则不能使用 SRL(用作移位寄存器的 LUT),因为只有最后一位可访问为一个输出。这使得它把整​​个东西放在可能相当大的寄存器中,并且可能需要比你的部分更多的寄存器。这里的关键是你必须考虑你描述的硬件规模,以及这在你的目标部分是否可行。

如果你想要一个真正深的移位寄存器,块 rams 可以用作深度超过 100,000 的移位寄存器,但它们有同样的问题,你只能访问最终输出。