1.為什么FPGA的整體邏輯的速度有限制?
與ASIC相比較,AS指的是(application specific)專用集成應用,而FPGA是可編程邏輯,在實現的過程中,AS是直接用最基礎的邏輯門實現數字電路的搭建,而FPGA是用LUT+FF搭建,它是可編程,也就是說可重構的,所以被設計成了一種島狀的邏輯塊矩陣電路,每個邏輯塊又有很多的子邏輯塊組成,每個子邏輯塊就包含有實現任意電路的元素,包括LUT(查找表)用於組合邏輯的實現,FF(觸發器)用於時序邏輯的實現,邏輯塊之間是布線的管道,,其中有各種固定長度的線以及連接這些線的開關。而對於ASIC而言,全部是按照數電邏輯實現的,導線也只是單純的導線,沒有開關的中斷。
可以觀察到這個FPGA的布線在十字路口那塊有多么的復雜,研究表明,對於一個只有組合邏輯和時序邏輯,沒有存儲等的電路,在FPGA上實現需要40倍的ASIC面積以及3-4倍的關鍵路徑延時,12倍的功耗。這些都是布線惹的禍,布線結構面積占了大約總面積的60%-70%。
FPGA的可編程單元可以由反熔絲、閃存單元以及SRAM內存單元實現。其中的反熔絲技術創建的是一個一次性編程的單元。
2.FPGA內部邏輯組成架構詳解
先放一個基本的FPGA組成模塊圖:
全局的來看的話,
在FPGA中所有的邏輯功能都是由CLB來實現的,他的工作原理如下:
軟件自動完成的內容包括:首先輸入經過FPGA芯片IO管腳后進入可編程連線,作為地址線輸入到LUT,LUT查找相應數據輸出就實現了組合邏輯。clk通過GPIO輸入后進入芯片內部的專用時鍾通道,直接連接到觸發器的時鍾端,D觸發器的輸出接到I/O,實現結果輸出到芯片管腳。
altera器件的結構組成:嵌入式陣列塊(EAB)(用於存儲)、邏輯陣列塊(LAB)(用於邏輯實現)、快速通道互聯(Fast Track),IO單元(IOE)。對於其基本的組成單位LE有:
LE作為FPGA的最小組成單元,其組成部分包括LUT,用於同步的D觸發器,進位鏈,級聯鏈。
cyclone的LE具體內部組成:
簡化后如下圖:
多個LE通過級聯鏈以及進位鏈以及行列快速通道相連接,得到一個個LAB,對於Cyclone而言,是10個LE組成一個LAB,如下圖
更加直觀的話:
結論:LUT可以直接生成移位寄存器,怎么生成的呢?
IOB的具體組成:
EAB的組成:
EAB的字長可以控制 ,此外,EAB可以組合成更大的模塊。它可以用來實現乘法器,實際上是一個輸入輸出上都帶有寄存器的靈活的RAM電路,即可以用來做存儲器,也可以實現邏輯功能。
EAB與LAB之間的關系:
但是在具體編程中如何實現指定所使用的資源是什么呢?
此外
扇入扇出太大或者太小的處理方法http://blog.sina.com.cn/s/blog_b381ebd10102vw6g.html
關於如何減少FPGA設計中邏輯資源的占用:(網上找的主要的幾種解決的方法)
更改綜合策略,采用資源共享;(如何更改?)如果某個某塊大量使用寄存器時可以考慮是否可以采用RAM代替;從架構上分析冗余並進行優化,之后再結合個別FPGA的實現特征,如果實在對資源比較在意而對性能要求不高,就可以考慮用時間換空間,用並行替串行;良好的代碼習慣和風格 暫時就那么多,以下都是我在編程時發現的問題,總結一下,怕以后忘了,以我目前的水平不明白類似關鍵路徑,組合數目什么高深理論,這都是我從實際中學到的,比看書學的印象深刻得多.慢慢來吧,我想我以后也會明白那些高級的東西了!
一....盡量不要使用"大於""小於"這樣的判斷語句, 這樣會明顯增加使用的邏輯單元數量 .看一下報告,資源使用差別很大.
例程:always@(posedge clk)
begin
count1=count1+1;
if(count1==10000000)
feng=1; //no_ring
else if(count1==90000000)
begin
feng=0; //ring
count1=0;
end
end //這么寫會用107個邏輯單元
// 如果把這句話if(count1==10000000)改成大於小於,報告中用了135個邏輯單元
二.....一定要想盡辦法減少reg寄存器的長度
上次把[30:0]改到[50:0],報告里邏輯單元從100多直升到2000多!!!太嚇人了,至於為什么我就不知道了哈!
三....case語句里一定要加default if一定要加else
如果是組合邏輯的設計,不加default或else的話,不能保證所有的情況都有賦值,就會在內部形成一個鎖存器,不再是一個純粹的組合邏輯了,電路性能就會下降.
例如:case({a,b})
2'b11 e=b;
2'b10 e=a;
endcase
//不加default,雖然只關心a=1時的結果,但是a=0的時候,e就會保存原來的值,直到a變為1
//那么e要保存原來的值,就要在內部生成鎖存器了.
四....盡量使用Case語句 而不是if--else語句
復雜的if--else語句通常會生成優先級譯碼邏輯,這將會增加這些路徑上的組合時延
用來產生復雜邏輯的Case語句通常會生成不會有太多時延的並行邏輯
五...組合邏輯的always塊中,要注意所有的輸入全部放入敏感變量表里
比如:always@(a or b)
begin
out=(a&b&c);
end