在 1 个时钟周期内添加 2 个 VHDL 数字的宽度是否有任何限制?

问题描述

我正在考虑在 VHDL 中添加两个 1024 位数字。

理想情况下,我希望达到 100 MHz 的时钟频率。

目标是 Xilinx 7 系列。

当你将两个数字相加时,不可避免地会有进位。由于在计算右侧的位之前无法计算左侧的进位位,因此在我看来,应该限制寄存器的宽度并且仍然可以在 1 个时钟周期内添加

这是我的问题:

1.) FPGA 是否以这种方式添加数字?或者他们有什么方法可以执行加法而不受进位问题的影响?

2.) 宽度有限制吗?如果是这样,1024 是否在 100 MHz 时钟的合理范围内,还是自找麻烦?

解决方法

也许这行得通,还没试过:

library ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Calculator is
  generic(
            num_length : integer := 1024
         ); 
    port(
            EN: in std_logic;
            clk: in std_logic;
            number1 : in std_logic_vector((num_length) - 1 downto 0);
            number2 : in std_logic_vector((num_length) - 1 downto 0);
            CTRL    : in std_logic_vector(2 downto 0);
            result  : out std_logic_vector(((num_length * 2) - 1) downto 0));
end Calculator;
    
architecture Beh of Calculator is
    signal temp : unsigned(((num_length * 2) - 1) downto 0) := (others => '0');
 begin
 
    result <= std_logic_vector(temp);
 
    process(EN,clk)
        begin
            if EN ='0' then
                temp <= (others => '0');
            elsif (rising_edge(clk))then
            
                case ctrl is
                    when "00" => temp <= unsigned(number1) + unsigned(number2);
                    when "01" => temp <= unsigned(number1) - unsigned(number2);
                    when "10" => temp <= unsigned(number1) * unsigned(number2);
                    when "11" => temp <= unsigned(number1) / unsigned(number2);
                end case;
            end if;                 
    end process;
end Beh;
,

没有。您只需要选择一个适当长的时钟周期即可。

实际上,虽然没有基本限制,但对于任何给定的周期时间,都会有一些限制,这取决于 FPGA 技术。

在 1024 位时,我会考虑打破加法并将其流水线化。

作为单个周期实现,我希望 1024 位添加的速度大约为 5,也许是 10 MHz。 (这很容易检查:综合一个并查看时序报告!)

流水线并不是克服这个限制的唯一方法。

还有“快速加法器”架构,例如进位前瞻、进位保存(通过常用来源获得详细信息)……当 FPGA 将快速进位链构建到 LUT 结构中时,这些架构几乎已经过时,但它们可能有像你这样的利基用途。然而,合成可能无法最佳地支持它们,因为(对于大多数目的)快速进位链就足够了。