FPGA就好像一個平台,用簡單的器件和復雜的邏輯構建起來的。這個平台大概由六部分組成,分別為基本可編程邏輯模塊(CLB)、可編程輸入/輸出模塊(IOB)、嵌入式塊RAM、豐富的布線資源、底層嵌入功能單元和內嵌專用硬核等。對於不同型號的芯片,其內部結構也會有些變化,但原理都也差不多,所以咱不必在意說的是何種芯片,下面就以鄙陋只見說芯片之精妙。
1、可編程邏輯模塊
邏輯塊(Logic Block),Altera稱之為邏輯陣列塊(LAB),Xilinx稱之為可配置邏輯課(CLB),我更喜歡CLB這個稱呼,因為它說得夠清楚,雖然我用的是Altera公司的芯片吧(*^__^*) 。我們所說的Verilog編程,可以說就是對CLB的配置,它可以實現絕大多數的邏輯功能。
這是從書上拍下了的,這是CLB基礎的邏輯單元(LC)Logic Cell,一個CLB包含4個LC。每個LC中包括4輸入LUT、進位及控制邏輯和D觸發器各一個。而每2個LC放在一個微片上,上圖就是倆個微片。微片就是很小很小的一個模塊,或可理解為像人體細胞一樣吧。
其中LUT(Look-Up Table)即查找表,它的本質是一個16X1的SRAM,SRAM是英文Static RAM的縮寫,即靜態隨機存儲器。我們可以認為SRAM是這個東西
現在我想每個格子都放一樣東西,並方便尋找給每個格子編號,則格子的編號就可以看做格子的地址,如果每個格子只能放一個蘋果或是橘子,那么上圖就可以理解為一個20X1的RAM,當然,這只是一種比喻。
我們通過Verilog語言可以寫出邏輯電路,例如F=A&B&C&D,FPGA開發軟件會自動計算邏輯電路的所有可能,並把結果放入SRAM,這一過程就是所謂的編程。就那F=A&B&C&D來說,ABCD的組合共有十六組,如下表
當我們下載的時候,軟件會自動把上述表格的值送給SRAM,我們ABCD取不同值時,TLU就根據地址進行找到數輸出。也就是說,FPGA並不知道我們進行了F=A&B&C&D這一計算,它只是根據我們的輸入進行尋址。把TLU與數據選擇器配合使用,就可以實現組合邏輯功能,當與觸發器結合就可以實現時序邏輯電路的基本功能。
由M來控制AB哪個與D搭上線,就是M來選擇AB輸出哪一個,例如當M=0時A的值輸出,當M=1時B的值輸出,
與門:
異或:
下面就通過舉例來說一下各種功能
(1)實現4變量的任意邏輯函數。
例如要實現F=A^B&C||D。那么就如上表格方式計算出所有的可能,將ABCD依次送給F1~F4,O端得到4變量邏輯函數的結果。該結果可以經過XMUX直接從X輸出,也可以經DCMUX和D觸發器由XQ輸出。
(2)實現5變量的任意邏輯函數
5變量?!那一個LUT肯定是不夠了。F=A^B&C||D&E腫么辦???這時BX成了救世主,我們把ABCD這四個數據時同時送到送入F1~F4以及G1~G4的同時,將第五個數E送給BX。Why?Σ( ° △ °|||)︴因為五個數有32種可能,一個LUT只能存儲16種,這樣倆個就存儲32種啦。而且,如果我們在G-LUT中放的是ABCD任意值,而E為1,在F-LUT中放的也是ABCD任意值,但E=0。這時候第五個變量的輸入就起到選擇這倆個LUT哪個輸出!!!
(3)實現6變量任意邏輯函數
有了5變量的基礎,實現六變量就好理解了,六變量邏輯函數需要倆個微片。因為由2^6=64嘛。我們假設要實現W=A^B&C||D&E&F。則可以讓微片一號的G-LUT存放地址ABCD任意值E=0,F=1,F-LUT存放ABCD任意值E=1,F=1。E從BX輸入。微片二號G-LUT存放地址ABCD任意值E=0,F=0,F-LUT存放ABCD任意值E=1,F=0。E從BX輸入,F從BY輸入。微片一號從F5輸出值接到微片二號的F5IN即可完成。結果可經過YMUX從Y輸出,可再經DYBMUX由觸發器輸出。
(4)2位二進制加法器
