最有效的大矢量VHDL?

最有效的大矢量VHDL?,vhdl,Vhdl,我希望能够有一个移位寄存器,对另一个加载了一些值的寄存器进行异或运算。问题是,我希望用一个大尺度向量来做这件事,这个向量大约有几千位宽 在VHDL中实现这一点的明显方法如下 generic( length : integer := 15); signal shiftreg : std_logic_vector(length downto 0); process(clk) begin if rising_edge(clk) then shiftreg<= sh

我希望能够有一个移位寄存器,对另一个加载了一些值的寄存器进行异或运算。问题是,我希望用一个大尺度向量来做这件事,这个向量大约有几千位宽

在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;

或者合成工具是否识别出这些是等效的?

合成时间通常与FPGA设计无关,尽管面积利用率和时间通常是相关的。如果移位寄存器占用了目标FPGA所拥有的大部分资源,那么综合将花费很长时间来寻找使其工作的方法,同样,构建也需要更长的时间来填充更大的部分。对于某些人来说,在现代中端FPGA中,80%的完整设计和紧凑的时序通常需要大约30分钟的合成时间和3小时的放置和布线时间。如果您仍在描述相同的功能,那么编码样式不会对这一点产生显著影响

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

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

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


如果你想要一个真正的深度移位寄存器,块RAM可以用来在深度超过100000的情况下像移位寄存器一样登记,但是这些问题只有在你只登记最终输出的情况下登记。基本映射只完成一次的cookie cutter方法。您尚未演示如何使用可能会影响地点和路线的

shiftreg
。对于与
移位寄存器
的部分相关联的操作,是否有任何表示局部性的方法?正如我所提到的,移位寄存器在另一个大小相等的寄存器的异或中使用,然后对XOR的位进行求和,得到不匹配的位数。你能把两个寄存器都作为移位寄存器来操作,并在你移入时计算不匹配的位数吗?你现在是怎么做的?其思想不是降低功能的复杂性。一个XOR门和一个计数器,而不是一些较大的求和机制。你还没有描述正在合成的整个“东西”有多复杂。目前还没有复杂性。我计划最终实现加法器对XORD位求和,但现在只有3个std_逻辑_向量,2个用来保存数据,1个用来最终保存XOR结果。仅仅拥有这3个向量并使用我问题中描述的更新过程就是导致我看到的合成时间过长的原因。您对典型计时的评论与我使用VHDL的一般经验相符,但与我在本例中看到的情况不同。根据合成后利用率报告,对于2^16位的向量,我应该使用FPGA上可用的1/4的FF,但仅仅合成就需要4个多小时,甚至没有尝试实现。@Zephyr听起来你可能会遇到这样的情况,合成器没有完全做到它应该做的。除了移位寄存器之外,设计中还有其他东西吗?我假设它没有被优化,所以必须有一些东西,你对整个向量所做的任何事情都会消耗大量的LUT,所以你仍然可能会耗尽资源。尽管如此,如果您需要一个64k深度移位寄存器,可以访问每一位进行进一步的逻辑,我敦促您重新考虑您的方法。目前,我有两个移位寄存器,如我的问题中所述,以及一个其他相同大小的std_逻辑_向量,将保存结果。最终我会将2个移位寄存器异或到向量中,并对结果向量的位求和,但我还没有实现,我用3个大向量完成了这么长的合成时间。你可以试着用一个移位寄存器,它的输入是两个输入位的异或。它最终将与您的结果寄存器相同,但要便宜得多。您还可以尝试将现在的单移位寄存器的输入加到累加器中,然后减去移位寄存器末尾的输出。现在你只需要两个加法器就可以得到“1”位的总和(而不是数千位,这将是难以置信的昂贵),因为你不需要访问移位寄存器的中间位,它可以在一个BRAM中实现。现在它便宜了。两个移位寄存器使用不同的时钟。所以寄存器1将在新数据中移动几个周期,然后它将保持,寄存器2将在新数据中移动几个周期。因此,这两个值没有一致的对齐方式,所以我不能在输入位时对其进行异或运算。
array(length downto 0) of std_logic;