CLB 功能说明文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CLB 功能说明文档Spartan 2E的slice的结构如下图所示
组合电路功能
1)两个四输入任意逻辑(一个slice)
为了方便讲解,就以三输入为例,F(G)的原理图如下所示
图1
上图中M0—M7是存储单元,通过编程下载将数据写入这八个存储单元;输出端OUT根据A,B,C的值选择M0—M7的值,CBA为000时选M0,001时选M1,以此类推,111时选M7,这样就构成了一个look up table,也就可以实现ABC的任意逻辑通过写入M0—M7适当的值。

例如,若想实现OUT=A&B&C,只需使M0—M7的值为00000001;若想实现OUT=A&B+C,只需使M0—M7的值为00011111。

四输入道理相同。

2)五输入任意逻辑(一个slice)
上图中绿色圈中的mux(5)加上F,G就可以实现五输入的任意逻辑,简要图如下
//为什么只能实现5输入的任意逻辑?不可以更多吗?怎么判断能不能实现任意逻辑?
A
B
C
D
F5 A
B
C
D
3)六输入任意逻辑(一个clb)
上图绿色圈中的mux(6)和输入信号F5IN,加上2)中所述的产生F5的逻辑就可以实现六输入任意逻辑,简要逻辑如下
A
B
C
D
A
B
C
D F6
F5IN是另外一个slice的F5输出端。

每个slice都有一个输入(F5IN)和一个输出(F5),一个clb中两个slice的这两个信号是按下图连接的
所以说,F5IN 不是从IMUX 进来的,F5也不是输入到OMUX 的,也就是说,他们两个不连到互连上去的,差不多专用互连的意思。

他们互相连的好处可能是更灵活,这样连的话,任意一边都可以做为F6的输出,任意一边的BY 都可以做为第六个输入
4) 加法,进位链,乘法
先说加法和进位链,例如,要实现a+b+cin (cin 是进位),在不加别的电路的情况下,我们需要两个lut 分别实现sum,cout ,这样的话,有两个缺点,首先浪费资源,其次不好实现快速进位链。

所以,我们添加少量的电路,用一个lut 实现sum,cout ,并且让cin,cout 成为可级连的path 。

首先,我们变换sum,cout 的表达式,如下
()()S a b cin
cout a b cin a b a
=⊕⊕=⊕∙+⊕∙
可用下面电路图实现
a
b
实现快速进位链如下图,例如a[1:0]+b[1:0]+cin
下面说说乘法,一个n X n 的乘法可以用与和加算出,很多情况下需要计算如下的式子 AB+CD+cin ,若要实现上面的逻辑式,只需在上面讲到实现加法m 的电路上再引入一个与门即可,见下图
A
B C D
由上面分析可知,要同时考虑到加法和乘法的话,传输进位的mux的0端可能接A或A&B,那么就要引入一个mux,对应下图也就是B,至于这个mux要引入0,1端,后面再阐述。

上图A,E,F,都说到了,下面讲讲C D,D的作用是bypass进位,若这个mux的编程点的值选择1端通路的话,那么cout=cin。

这个功能是必要的,例如,在进行多位加法时,若是在链中插入别的功能的lut,这时进位就需要bypass这个lut
C的作用是选择进位,若不是在进位链的开始,肯定选cin,若是在进位链的开始,则,需要选BX。

注意,slice靠上的lut并无此mux,所以,行波进位加法的开始必须放在slice靠下的lut。

下面讨论一下B另外两端0,1的作用,简化电路如下
CIN(BX)
0(1)
若mux的0端是0的话,COUT=CIN&F[i],由于可级连,所以最终可以实现BX&F[1]&F[2]&…&F[n]的逻辑;若mux的0端是1的话,COUT=[]
F i+CIN,要想实现F[i]+CIN,只需将lut反配输出[]
F i即可,同样的,由于可级连,最终可实现BX+F[1]+F[2]+…+F[n](每个lut都反配)。

5)四输入MUX(一个slice),八输入MUX(一个clb)
如下图所示,利用mux(5),一个slice可实现mux4_1,同理,再利用mux(6)即可实现mux8_1。

A0
A1
A2
A3
OUT
A0
A1
A3
6) 一部分九输入逻辑(一个slice ),一部分十八输入逻辑(一个clb ) 一个slice 实现部分九输入逻辑,有三种情况:
利用mux(5)可实现 &(1,2,3,4)&(1,2,3,4)BX G G G G G BX F F F F F + 根据4)所说的B 选0可实现 &(1,2,3,4)&(1,2,3,4)BX F F F F F G G G G G 根据4)所说的B 选1可实现 (1,2,3,4)(1,2,3,4)BX F F F F F G G G G G ++
其中,F(F1,F2,F3,F4),G(G1,G2,G3,G4)分别代表F1,F2,F3,F4的任意逻辑和G1,G2,G3,G4的任意逻辑。

一个clb 实现部分十九输入逻辑,只有一种情况,即利用mux(6)可实现
21111
22222
&[&(11,12,13,14)&(11,12,13,14)]
&[&(21,22,
23,24)&(21,22,23,
24)]
B Y B X G G G G G B X F F F F F B Y B X G G G G G B X F F F F F +++
如果符合上面所述的表达式,即可将其映射到一个slice (clb )中。

以上我认为组合逻辑功能已经说完了,可能有遗漏和错误,欢迎补充及修订 。

下面对电路中一个小地方说明一下,见下图绿圈中所画的元件
其实它就是其中一输入为一编程点的二输入与门
p
因为图中SR 信号有两个作用,一是做分布式RAM 的写信号(WE )和SHIFTER 的使能信号(SR ),另外一个是做触发器的reset(set)信号。

当slice 配置成分布式RAM (SHIFTER )时,SR 信号即是WE ,与门一端P 要置成0,使SR 作为reset,set (高电平有效)失效。

若slice 不是配置成分布式RAM 或SHIFTER ,则P 置成1。

同样的在BY 支路上也存在这样的元件,若让BY 成为触发器的set(reset)端,P 需置1,若BY 作为别的用途(例如RAM 的数据输入,六输入逻辑的第六个输入,触发器的输入 等),P 需要置成0。

所以,SR(BY)作为触发器的reset(set)的功能和他们作为其他功能不能同时作用,按需求而定。

组和逻辑输出也有此单元,它的作用可能是在上电复位时给出固定电平,所以这里的编程点单元可能用七管单元,在六管的基础上再加一个下拉管。

时序电路功能
1)分布式RAM
图1中M0—M7都是存储单元,存储编程点的值,具体电路如下图左所示。

考虑到它本身是一个存储单元,我们也可以将它作为ram来用,这样在原来电路的基础上再引入一条ram的写路径就可以了,如下图右所示。

若作为正常的lut用的话,ws为0,若作为分布式ram用的话,并且在写状态下,ws为1。

这需要一个control电路来控制,后面会讲到。

G2
G3
G4
ck
图2
上图就是要把一个lut配置成16x1的ram所要添加的一些电路,首先这个ram16x1的读
decoder 已经有了,就是图1中那一堆N 传输管,我们需要添加的是写decoder 和control 电路,由于要求同步,所以加了四个地址(G1,G2,G3,G4)latch ,一个数据(BY )latch 。

所以说,这个ram16x1是写同步,读异步。

每个slice 有两个lut ,大体上连接关系如下图所示,这样一个slice 就配置成ram 而言,可以有以下几种情况
F[4:1]
BX
OUTA
OUTB
OUTC
图3
A)
单个16x1的ram ,输入端为BY ,读写地址为G[4:1],输出端为OUTB ,WSG 有效。

因为在spartanII 里,slice 里的两个lut 是共用一个write decoder ,所以不能配置成两个独立的16x1
B) 16x2的ram ,输入端为BY 和BX ,读写地址为G[4:1],这样,软件需要将F[4:1]等同于G[4:1],输出端为OUTB 和OUTC ,WSF,WSG 同时有效
C) 16x1 dual port ram ,输入端为BY ,写地址为G[4:1],读地址为G[4:1]和F[4:1],输出端为OUTB 和OUTC ,WSF,WSG 同时有效 D)
利用mux(5)可以实现ram32x1,输入端为BY ,读写地址为{BX,G[4:1]},输出端为OUTA ,WSF,WSG 根据BX 而定,BX 为0时,WSF 有效,反之,WSG 有效
根据上面四种情况,control 电路可由下图实现
因为目前存储单元有两套端口,一套是编程下载用的,一套是作为分布式ram 用的,为了不影响正常的编程下载,则需要引入一个信号doneb ,当编程下载结束后,doneb 为0,当编程下载正在进行中,doneb 为1,所以wsG ,wsF 都为0,这样就把作为ram 的端口封住了,也就影响不到编程下载了。

控制电路存在三个编程点(ramG ,ramF ,ram_both ),ramG (ramF )的意思是是否将G (F )配置成ram ,1有效。

ram_both 的意思是是否将FG 联合起来配置成16x2或dual_port ,1有效。

BX 是在配置成32x1时起作用,此时ramG ,ramF ,ram_both 分别为1,1,0,当BX 为0时,wsF 有效,反之,wsG 有效。

下面说说红框里电路的作用,由图2可知,为了同步,我们会在地址数据端加触发器,考虑到面积的问题,我们采用latch ,latch 的缺点是数据只能保持半个周期,所以ws 只能在此期间有效,红框电路的作用就是产生一个ws 脉冲,它的宽度必须能保证数据能完全写入存储单元,由delay 单元控制。

由于delay 单元产生的ws 脉冲宽度会随
PVT 而变化,所以引入另外一种产生ws 脉冲的电路,如下图所示
1
上图的思想是用一个dummy的存储单元(红框所示)来模拟实际的写入情况,刚开始让存储单元存0,当we有效时,1写入存储单元,一旦存储单元的值由0变为1(表明已经写入),则reset端有效,将Q端拉低,这样就形成了一个脉冲,宽度基本上等于写入所需要的时间,为了安全考虑,我们会留一点margin,这就是图中delay单元的作用。

这样形成的脉冲就不怕PVT的影响了。

总结一下,可得下表
(注:D_F是图3中的编程点,1选BY,0选BX;配置成16x2时,软件必须使F[4:1]等同于G[4:1];红色为编程点)
function ramG ramF ram_both D_F BX wsG wsF address data 16x11001110G[4:1]BY 16x2111011G[4:1]BY,BX dual_port1111x11写G[4:1],读G[4:1]和F[4:1]BY 32x11101根据BX而定{BX,G[4:1]}BY
2)移位寄存器
如果我们把存储器在原来基础上再加上一些逻辑就可以实现移位寄存器了,如下图所示。

工作原理如下,开始PHI_2为1,PHI_1为0,数据从SIN端口写进到存储单元,然后PHI_2为0,PHI_1为1,刚才写入存储单元的数据写到SOUT,由于16个存储单元是串起来的,即上面一个存储单元的SOUT接到下一个的SIN,这样就构成的移位寄存器。

D_ram
D_conf
SOUT
以第三个存储单元为例,PHI_1为1,PHI_2为0时,存储单元的值送到SOUT端,当PHI_2为1,PHI_1为0时,第二个存储单元的值通过SIN端写入,同时第三个单元的值写入第四个存储单元,这样,一个周期内,就完成了移位一次。

这里需要注意的是,在PHI_2为1,PHI_1为0的时候,写入到下一个单元的值是通过动态latch所保持的(蓝色虚线框所示),也就是通过n传输管与反相器之间的寄生电容所保持的,这样数据不会保持很长时间,因为电容会漏电,所以PHI_2的有效宽度必须很好的控制,既要保证数据能安全的写入存储单元,又要控制有效时间不能太长。

还有一点需要注意的是,PHI_1,PHI_2需要是非交叠两相信号,因为如果PHI_1,PHI_2同时为1的话,会造成穿通现象,也就是可能数据从第一个一直写到最后一个。

根据上面的分析,PHI_1,PHI_2产生电路如下图所示
PHI_1
PHI_2
其中,done 信号就是上面提到的doneb 的反信号,1表示编程下载结束。

Shift 是编程点,为1时,PHI_1,PHI_2就会是非交叠两相信号,这样lut 就会配置成shift register ,若为0,
PHI_1为1,PHI_2为0,这样lut 就不会配置成shift register 了。

D1,D2,D3是延迟单元,even 代表非反相,odd 代表反相。

在shift,done 都为1的情况下,PHI_1,PHI_2的波形如下图所示。

PHI_1
PHI_2
其中,t1的宽度是由D3决定的,t2的宽度是由D1-D3决定的,t3的宽度是由D2决定的。

有一点要注意的是移位寄存器的位数是可调的,因为存储单元后面会有一个decoder16_1,这样的话,我们可以通过改变G[4:1]或者F[4:1]来选择移位寄存器的位数(1-16)。

通过上面介绍可知,配置成ram 需要一个control 电路来产生ws 信号,配置成shift register 也需要一个control 电路来产生PHI_1、PHI_2,他们两个是可以分别产生,不过考虑到ws 、PHI_2的宽度可以一样,WE 信号又是他们共用的,所以两个电路可以共用一些逻辑,这样可以节省一点面积。

我目前正在考虑这个问题,下图是初步设想的电路。

红框中电路采用delay 单元的做法,当然也可以用上面提到的dummy 存储单元的做法。

相关文档
最新文档