use*_*133 5 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
Run Code Online (Sandbox Code Playgroud)
当树中的一个阶段不能被2整除时,我插入一个虚拟操作,只需要1个输入,产生1个输出,具有相同的延迟.
我遇到的问题是我关注N个输入的几个大小{9,25,49,81,121}.最大尺寸的N,121,在我的FPGA架构中需要110%的luts,而其他所有尺寸都很容易.这些二进制操作的树是我设计中最大的luts消费者.
我知道通过减少驻留在我板上的运算电路数量并多路复用它们的输入,我可以减少近一半的利用率.不幸的是,这意味着每隔一个时钟周期只能获得一个结果并将带宽减半.
因为完整的树只需要比电路板提供的资源多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'
Run Code Online (Sandbox Code Playgroud)
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)'
Run Code Online (Sandbox Code Playgroud)
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)'
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,操作网络应该是这样的: