Xilinx FPGA的組成部分
本文是以Xilinx Kintex UltraScale+ 系列為參考所寫,其他系列有所不同,可以參考相應(yīng)的user guide文檔。
Xilinx家的FPGA有這么些基本組成部分:
Configurable Logic Block (CLB)可編程邏輯塊
Block Memory存儲(chǔ)器
Transceivers收發(fā)器
從Implemented Design中可以看到FPGA中資源大致分布如下。中間藍(lán)色是CLB可編程邏輯塊、DSP或BRAM,兩側(cè)的彩色矩形塊是I/O接口和收發(fā)器,劃分的方塊是不同的時(shí)鐘域
Configurable Logic Block (CLB)可編程邏輯塊
CLB是FPGA內(nèi)部實(shí)現(xiàn)可編程性的主要成分,其中可以包括:
LUT查找表
高速算術(shù)邏輯
分布式存儲(chǔ)distributed memory或移位寄存器shift register logic (SRL) ability
Look-Up Table (LUT)查找表
每個(gè)CLB中包含一個(gè)slice,每個(gè)slice提供8個(gè)6輸入查找表LUT和16個(gè)寄存器(slice就是CLB中一個(gè)小的分割,有的CLB中有兩個(gè),不知道怎么翻譯這個(gè)詞)。每個(gè)6輸入LUT可以被設(shè)置成1個(gè)6輸入查找表或者2個(gè)5輸入查找表??梢赃@么配置的原因跟LUT結(jié)構(gòu)有關(guān)。
上圖是一個(gè)4輸入查找表的結(jié)構(gòu),[ABCD]作為4位二進(jìn)制輸入,總共有24=16種輸入,每種輸入對(duì)應(yīng)的1位輸出就存在左側(cè)的寄存器中,因此查找表可以完成每一種二進(jìn)制邏輯。在右側(cè)可以看到一個(gè)4輸入LUT其實(shí)是兩個(gè)3輸入LUT再加上一個(gè)2路復(fù)用器MUX,最后的MUX由新加入的一位控制,如果要拆開就把兩個(gè)3輸入LUT的結(jié)果繞開最后的MUX輸出即可。同樣就可以理解6輸入LUT拆分成兩個(gè)5輸入LUT的原因。
之前介紹Altera的ALM時(shí)說(shuō)過,LUT太深或太淺都不好,太深需要很多寄存器,而且MUX層數(shù)太多,延遲嚴(yán)重;太淺不方便配置邏輯,浪費(fèi)過多空間。A家和X家根據(jù)客戶實(shí)際使用情況調(diào)查過之后得到的結(jié)論相同,6輸入LUT目前來(lái)說(shuō)是最平衡的,如果需要的話就拆成小的LUT,一般以6輸入為主。
LUT的輸出如下,O6是作為6輸入LUT的結(jié)果,O5是作為兩個(gè)5輸入LUT的結(jié)果,有2位。它的結(jié)果可以直接作為slice的輸出,也可以傳遞到寄存器中儲(chǔ)存。而存入寄存器的數(shù)據(jù)也可以不經(jīng)過LUT,直接從外界讀取。
Xilinx的Toolchain會(huì)自動(dòng)配置這部分內(nèi)容,但是了解細(xì)節(jié)可以更好的利用FPGA中的資源,比如下面三段代碼,第一段只用上了LUT查找表輸出,第二段繞過了LUT輸入到寄存器中,而第三段同時(shí)用上了LUT查找表和寄存器,可以說(shuō)是對(duì)slice利用率最高的。
// Code 1
wire [1:0] output;
wire [5:0] input;
assign output[0] = input[0]&input[1]|input[2];
assign output[1] = input[3]|input[4]^input[5];
// Code 2
wire clk, rst;
reg [1:0] output;
reg [1:0] input; // Coming from previous registers
always @(posedge clk or posedge rst) begin
if(rst)
output <= 2'b00;
else
output <= input;
end
// Code 3
wire clk, rst;
reg [1:0] output;
wire [5:0] input;
always @(posedge clk or posedge rst) begin
if(rst)
output <= 2'b00;
else begin
output[0] <= input[0]&input[1]|input[2];
output[1] <= input[3]|input[4]^input[5];
end
end
在project比較小的時(shí)候自然不用注意這么多,project大大時(shí)候toolchain有一定的能力幫你平衡這些資源利用,這種摳牙縫的手段在FPGA特別小,或者代碼太大,或者時(shí)鐘很高時(shí)就有用了。在時(shí)鐘高時(shí),為了盡可能縮短信號(hào)之間的布線距離,能用寄存器緩沖的就要盡量用,但只是用pipeline的形式加入相當(dāng)于浪費(fèi)了一些slice中的LUT部分,最好的辦法就是把寄存器加在邏輯中間,這樣利用率就提高了。比如在不優(yōu)化的情況下,第二段比第一段代碼更高效,時(shí)鐘環(huán)境更好(自己做總比不知道toolchain做了什么要好):
// Code 1
wire clk, rst;
wire [5:0] input;
reg [1:0] pipeline;
reg output;
always @(posedge clk or posedge rst) begin
if(rst) begin
pipeline <= 2'b00;
output <= 1'b0;
end
else begin
pipeline[0] <= &input; // And every bits from input
pipeline[1] <= pipeline[0]; // Pipeline it
output <= pipeline[1];
end
end
// Code 2
wire clk, rst;
wire [5:0] input;
reg [1:0] pipeline;
reg output;
always @(posedge clk or posedge rst) begin
if(rst) begin
pipeline <= 2'b00;
output <= 1'b0;
end
else begin
pipeline[0] <= &input[2:0]; // And first 3 bits from input
pipeline[1] <= &input[5:3]; // And last 3 bits from input
output <= pipeline[0] & pipeline[1];
end
end
高速算術(shù)邏輯
和Altera中的ALM相似,Xilinx的slice中也有小的加法器,使得小位數(shù)的加法、乘法、計(jì)數(shù)器可以在其中實(shí)現(xiàn)。但是高位數(shù)的算術(shù)運(yùn)算就不適合在其中實(shí)現(xiàn)了,容易出現(xiàn)各種時(shí)鐘問題,而且浪費(fèi)大量邏輯資源,這種運(yùn)算最好交給之后的DSP資源來(lái)實(shí)現(xiàn)。
分布式存儲(chǔ)distributedmemory或移位寄存器shift register logic (SRL) ability
Slice也分兩種,前面介紹的是普通的SLICEL (logic),也就是邏輯slice,還有一種是強(qiáng)化了存儲(chǔ)功能的SLICEM (memory),也就是存儲(chǔ)slice。SLICEM也可以當(dāng)作SLICEL用,擁有SLICEL的一切功能,但SLICEM添加了地址線write address端口和寫使能write enable端口,使得6輸入LUT中的26=64個(gè)寄存器可以被配置成64-bits RAM,8個(gè)6輸入LUT合起來(lái)就可以是一個(gè)512-bit RAM。
Xilinx還有一個(gè)特殊的設(shè)計(jì),可以讓這64 bits互相連接變成一個(gè)移位寄存器,比起使用后面的register寄存器利用率高很多。舉個(gè)栗子的話:
// Shift registers
genvar i;
wire [3:0] addr_1 = 4'd15;
wire [41:0] D_1;
wire [41:0] Q_1;
assign D_1 = input;
assign output = Q_1;
// 42bit X 16
generate
for(i=0; i<42; i=i+1) begin : Shift
SRL16E #(
.INIT(16'h0000), // Initial contents of shift register
.IS_CLK_INVERTED(1'b0) // Optional inversion for CLK
)
Shift_UP2_1 (
.Q(Q_1[i]), // 1-bit output: SRL Data
.CE(1'b1), // 1-bit input: Clock enable
.CLK(clk), // 1-bit input: Clock
.D(D_1[i]), // 1-bit input: SRL Data
// Depth Selection inputs: A0-A3 select SRL depth
.A0(addr_1[0]),
.A1(addr_1[1]),
.A2(addr_1[2]),
.A3(addr_1[3])
);
end
endgenerate
也許有人會(huì)想,為什么要考慮那么多小技巧把代碼變復(fù)雜,硬件編程跟軟件編程的不同就在這里,用實(shí)際電路的思維來(lái)考慮,它的實(shí)現(xiàn)情況和用指令集數(shù)據(jù)庫(kù)的軟件編程有很多不同點(diǎn)。寫簡(jiǎn)單的代碼有時(shí)候被編譯后就變成低效的結(jié)構(gòu)。新手寫RTL代碼會(huì)出現(xiàn)a=b*c;這種,每次看到都會(huì)頭皮發(fā)麻。
因此設(shè)計(jì)RTL時(shí),推薦這種優(yōu)化步驟:
盡量少用reset,并且不要同時(shí)用同步reset和異步reset
寄存器很多,能用盡量用,對(duì)時(shí)鐘環(huán)境好(不要用always *,同樣看到頭皮發(fā)麻)
寫寄存器的控制信號(hào)簡(jiǎn)單點(diǎn),盡量也用寄存器pipeline一下
移位寄存器比較特殊,不要用復(fù)位信號(hào),盡量用上LUT中的SRL,reset信號(hào)會(huì)讓tool避免用SRL
少于64bits的存儲(chǔ)用SLICEM來(lái)做,Xilinx tool中一般叫LUTRAM
位數(shù)較高的加法、計(jì)數(shù)器,以及盡可能所有常常調(diào)用的乘法用DSP來(lái)實(shí)現(xiàn)
Block Memory存儲(chǔ)器
在CLB中的LUTRAM之外,Xilinx芯片中的內(nèi)置存儲(chǔ)器就是BRAM存儲(chǔ)器了。每個(gè)BRAM可以被配置成兩個(gè)獨(dú)立的18kb RAM或者一個(gè)36kb RAM,每個(gè)BRAM有兩個(gè)獨(dú)立的讀寫端口
如果一個(gè)36kb的BRAM不夠用,還可以把多個(gè)BRAM連接在一起:
DSP數(shù)字信號(hào)處理器
Xilinx的FPGA中高位加法和乘法主要是由DSP數(shù)字信號(hào)處理器承擔(dān)的,其結(jié)構(gòu)如下
根據(jù)不同的配置,可以構(gòu)成一系列公式,比如下面幾種 P = ( A ± D ) ? B + C P = B 2 + P P = A ± D ± C P=(Apm D)*B+C P=B^2+P P=Apm Dpm CP=(A±D)?B+CP=B2+PP=A±D±C
和Altera FPGA中的DSP相比,兩個(gè)乘法器變成一個(gè),多了平方選項(xiàng)和XOR邏輯,以及比較邏輯。相比起來(lái)Xilinx FPGA中的DSP雖然集成度沒有那么高,但靈活性更高,更方便配置成各種需要的形式,設(shè)計(jì)FIR這類結(jié)構(gòu)時(shí),可以很明顯感受到Xilinx中的DSP設(shè)計(jì)出的結(jié)構(gòu)復(fù)雜度低很多,不需要考慮兩個(gè)乘法器帶來(lái)的協(xié)同性問題。
調(diào)用Xilinx的DSP有比較多的注意事項(xiàng),代碼也相對(duì)較長(zhǎng),之后可以單獨(dú)寫一篇。
Transceivers收發(fā)器
在Kintex UltraScale+系列中的收發(fā)器有Gigabit Transceivers H/Y (GTH/GTY)兩種,后面的H和Y代表不同的傳輸速率,具體是哪個(gè)單詞沒有找到。這些高速收發(fā)器可以承擔(dān)不同的接口任務(wù),常見的有PCIe、SFP、10G網(wǎng)、SATA等。
讓傳輸速率更高一直是通信行業(yè)的核心問題,這個(gè)毋庸置疑,無(wú)論哪種接口,要在FPGA上實(shí)現(xiàn),不可避免的要用到這些收發(fā)器。
這里的細(xì)節(jié)太多,全寫一遍可以出一本書,我也只懂些皮毛,這里放一張大概的結(jié)構(gòu)圖,挖個(gè)坑等我邊寫邊填。
I/O pins輸入輸出端口
在Xilinx UltraScale系列中有三種I/O bank,一種是High-performance (HP)高性能、High-density (HD)高密度、High-range(HR)大范圍。HP可以滿足1.8V以下信號(hào)的性能需求,HD可以在支持低速接口的情況下盡可能減小面積,HR可以支持更多的3.3V以下標(biāo)準(zhǔn)。
總結(jié)
在我看來(lái),和Altera的FPGA相比,Xilinx的FPGA與之最大區(qū)別就是DSP的不同。雖說(shuō)兩個(gè)公司對(duì)一些資源的名稱不同,分割方式不同,但其邏輯的主體LUT沒有太大區(qū)別,BRAM的區(qū)別也不大,只有DSP有結(jié)構(gòu)上的不同。至于對(duì)外的接口,個(gè)人認(rèn)為對(duì)內(nèi)部邏輯影響不大。
-
dsp
+關(guān)注
關(guān)注
553文章
7987瀏覽量
348729 -
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602972 -
Xilinx
+關(guān)注
關(guān)注
71文章
2167瀏覽量
121293 -
Altera
+關(guān)注
關(guān)注
37文章
781瀏覽量
153919 -
可編程邏輯
+關(guān)注
關(guān)注
7文章
515瀏覽量
44083
原文標(biāo)題:Xilinx FPGA中的基礎(chǔ)邏輯單元
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論