Architecture 是否有可能以牺牲带宽为代价将FPGA上二进制操作树的空间需求减少不到2倍?

Architecture 是否有可能以牺牲带宽为代价将FPGA上二进制操作树的空间需求减少不到2倍?,architecture,tree,fpga,Architecture,Tree,Fpga,我有一个电路,在每一个时钟周期,N个32位的输入被计算出来。我有一个二进制操作,它接受两个32位输入,并产生一个32位输出。此操作是关联的,我想将其应用于整个N个32位输入,以产生一个32位输出。目前,我通过实现一个流水线二叉树来实现这一点 对于一个具体的例子,假设N=4,并且我有输入{a,b,c,d},那么我将执行以下操作: a op b => reg1 c op d => reg2 reg1 op reg2 => result 当树中的一个阶段不能被2整除时,我插入一个只

我有一个电路,在每一个时钟周期,N个32位的输入被计算出来。我有一个二进制操作,它接受两个32位输入,并产生一个32位输出。此操作是关联的,我想将其应用于整个N个32位输入,以产生一个32位输出。目前,我通过实现一个流水线二叉树来实现这一点

对于一个具体的例子,假设N=4,并且我有输入{a,b,c,d},那么我将执行以下操作:

a op b => reg1
c op d => reg2
reg1 op reg2 => result
当树中的一个阶段不能被2整除时,我插入一个只接受1个输入的伪操作,并产生1个具有相同延迟的输出

我所遇到的问题是,我关心的是几个大小的N输入{9,25,49,81,121}。最大尺寸的N,121,在我的FPGA结构中需要110%的LUT,而所有其他尺寸都很容易适应。在我的设计中,这些二进制操作的树是迄今为止LUT的最大消费者

我知道,通过将主板上的op电路数量减半并多路复用它们的输入,可以将LUT的利用率降低近一半。不幸的是,这意味着每隔一个时钟周期只能得到一个结果,并将带宽减半


因为一棵完整的树只需要比电路板提供的资源多约10%,所以带宽减少50%似乎太大了。有没有一种体系结构可以让我在更细粒度的大小缩减和更细粒度的带宽缩减之间进行权衡?

好的,我以你的9个输入为例,尝试用75%的二进制运算符解决你的二叉树问题

我给输入命名
a、b、c、d、e、f、g、h、I
。为了及时区分输入值,我将在a后面加一个勾号

a'    = a at time 1
a'''  = a at time 3
(ab)' = result of a' and b'
9个输入需要8个二进制操作。我将我的处理方案限制为6个操作员,因此它使用75%的所需操作员。以下模式中的每一行表示一个运算符

time 1      time 2          time 3            time 4              | time 1+4
a'b'        (abcd)'(efgh)'  (ab)''(cd)''      e'''f'''            | a'b'
c'd'        (abcdefgh)'i'   (ef)''(gh)''      g'''h'''            | c'd'
e'f'        a''b''          (abcd)''(efgh)''  (ab)'''(cd)'''      | e'f' 
g'h'        c''d''          (abcdefgh)''i''   (ef)'''(gh)'''      | g'h'
(ab)'(cd)'  e''f''          a'''b'''          (abcd)'''(efgh)'''  | (ab)'(cd)'
(ef)'(gh)'  g''h''          c'''d'''          (abcdefgh)'''i'''   | (ef)'(gh)'
4个周期后,模式重复。因此,处理3个输入集需要4个周期:
=>33%的开销

可以对该模式进行排序,以便每行只处理2个不同的输入:
=>输入可通过2:1多路复用器进行多路复用

time 1      time 2          time 3            time 4              | time 1+4
a'b'        a''b''          a'''b'''          (ab)'''(cd)'''      | a'b'
c'd'        c''d''          c'''d'''          (ef)'''(gh)'''      | c'd'
e'f'        e''f''          (ab)''(cd)''      e'''f'''            | e'f' 
g'h'        g''h''          (ef)''(gh)''      g'''h'''            | g'h'
(ab)'(cd)'  (abcd)'(efgh)'  (abcd)''(efgh)''  (abcd)'''(efgh)'''  | (ab)'(cd)'
(ef)'(gh)'  (abcdefgh)'i'   (abcdefgh)''i''   (abcdefgh)'''i'''   | (ef)'(gh)'
如果我没有犯错误,这应该是操作网络:



(可单击)

您是否考虑过使用3、4、5或6个输入运算符?当前Altera和Xilinx FPGA中的LUT为6个输入。如果您的运算符非常简单(即AND、OR或XOR),那么在当前实现中,仅使用2输入函数而不是6输入函数(假设您注册管道的每个阶段),可能会浪费大量LUT。 这将把你的二叉树变成一个k元操作树。根据N的选择,使用数字将浪费许多LUT

以下是K的选择,这些选择是有意义的:

 N   | K | LUTs/bit | LUTs | LUTs/bit @k=2 | LUTs @k=2
-----|---|----------|------|---------------|-----------
 9   | 3 |     4    |  128 |      11       |    352
 25  | 5 |     6    |  192 |      25       |    800
 49  | 5 |    13    |  416 |      50       |   1600
 81  | 6 |    18    |  576 |      75       |   2400
121  | 6 |    26    |  832 |     123       |   3936

你的二进制操作有多复杂?例如,你的树能以双倍的速度运行吗?如果是这样,你可以使用一个2倍F_输入的相关时钟来补偿你的带宽损失。其中一个答案解决了你的问题吗?如果是,请标记一个作为答案。一般来说,这是一个处理资源的调度问题,可用资源少于所需资源。(资源=二进制运算符)我认为OP不使用简单的二进制操作,如和:a)120 32位和门不填充任何FPGA b)合成不进行LUT组合,除非有管道寄存器c)二进制操作意味着有2个输入的操作,而不是输入是二进制编码的。@Paebbels我假设OP使用管道寄存器,并且有一个小的FPGA。我将更新我的答案,使我的假设更加清楚。