用于大型向量的最有效的VHDL?

时间:2016-11-16 20:09:30

标签: vhdl

我希望能够有一个移位寄存器,它对另一个加载了某个值的寄存器进行异或。问题是我希望用大规模的矢量来做这件事,大约有数千位宽。

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

或者综合工具是否认识到这些是等价的?

1 个答案:

答案 0 :(得分:1)

合成时间通常与FPGA设计无关,尽管通常是面积利用率和时序。如果您的移位寄存器占用了目标FPGA所具有的大部分资源,那么综合将需要很长时间才能找到一种方法使其工作,同样构建需要更长的时间来填充更大的部分。对于某些球场而言,80%的完整设计在现代中端FPGA中具有严格的时序,通常需要大约30分钟来合成,3小时才能放置和路由。如果您仍在描述相同的功能,则不会受到编码样式的显着影响。

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

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

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

如果你想要一个非常深的移位寄存器,可以使用块rams作为移动寄存器,其深度超过100,000,但是这些问题只能访问最终输出。