一、FPGA:Field Programmable Gate Array 現場可編程門陣列
可編程輸入/輸出單元、基本可編程邏輯單元、嵌入式塊RAM、豐富的布線資源、底層嵌入功能單元和內嵌專用硬核。
可編程輸入/輸出單元(I/O)單元
輸入/輸出(Input/Ouput)單元簡稱 I/O 單元,它們是芯片與外界電路的接口部分,完成不同電氣特性下對輸入/輸出信號的驅動與匹配需求,為了使 FPGA 具有更靈活的應用,目前大多數 FPGA 的 I/O 單元被設計為可編程模式,即通過軟件的靈活配置,可以適配不同的電氣標準與 I/O 物理特性;可以調整匹配阻抗特性、上下拉電阻、以及調整驅動電流的大小等。
基本可編程邏輯單元
組成 FPGA 的兩個最基本的部分是組合邏輯以及時序邏輯,分別實現這兩個基本部分的結構就是 FPGA 的基本單元。組合邏輯部分一般采用查找表(Look-Up-Table,LUT)的形式,時序邏輯部分一般采用觸發器(Flip-Flop,FF)的形式。
Xilinx 7 系列 FPGA 中的可編程邏輯單元叫 CLB(Configurable Logic Block,可配置邏輯塊)每個CLB 里包含兩個邏輯片(Slice)。
時序邏輯的基本單元采用 D 觸發器,這種觸發器是一種在時鐘的上升沿(或下降沿)將輸入信號的變化轉送至輸出的邊沿觸發器。
- 建立時間(setup-time):如果在 CLK=0 時,由于門的傳輸延時,輸入信號沒有穩定的保存到主鎖存器中,那么當 CLK 從 0 變到 1,輸入關閉,輸出打開時,主鎖存器就只能給輸出端口提供一個不穩定的信號。為了避免這種情況的發生,需要輸入信號在上升沿到來前已經穩定。
- 保持時間(hold-time):當 CLK 從 0 變到 1,由于門的傳輸延時,門不可能立刻關閉,如果此時發生輸入信號的變化,那當門關閉后實際保存的信號就可能是變化后的信號(相當于下一時刻的信號將我們需要的當前信號覆蓋了)。為了避免這種情況的發生,需要輸入信號在上升沿到來后保持一段時間的穩定。
根據數電中的知識,任何一個組合邏輯都可以表示成真值表的形式(邏輯輸入對應邏輯輸出),也就是任意的真值表所反映的內容都能由組合邏輯實現,查找表(LUT)就能完成這個任務。
存儲器
- 硬宏存儲器:硬宏型存儲器被稱為塊存儲器(Block RAM,BRAM),實現方法就是以硬宏的形式在架構中嵌入存儲器塊。
- 查找表存儲器:查找表存儲器被稱為分布式存儲器(Distributed RAM,分布式 RAM),使用 SLICEM 邏輯塊查找表中的真值表作為小型的存儲器,能實現 BRAM 不能實現的異步訪問,但是一般需要小規模存儲器時才采用這種方法(不能占用太多的用來實現邏輯的查找表資源)。
存儲的一些知識
?DMA? ? ? ?Direct Memory Access 直接存儲器存取
時鐘部分
PLL?Phase Lock?Loop
由鑒相器、環路濾波器和壓控振蕩器組成,鑒相器用來鑒別輸入信號Ui與輸出信號Uo之間的相位差,并輸出誤差電壓Ud。Ud中的噪聲和干擾成分被低通性質的環路濾波器濾除。形成壓控振蕩器(Vco)的控制電壓Uc,Uc作用于壓控振蕩器的結果是把它的輸出震蕩頻率fo拉向環路輸入信號頻率fi,當二者相等時,環路被鎖定,稱為入鎖。PLL并不是直接對晶振進行倍頻,而是將頻率穩定的晶振作為基準信號,與PLL內部振蕩電路生成的信號分頻后進行比較,使PLL輸出的信號頻率穩定,工作原理如下圖所示。
DLL Delay Lock Loop
DLL是基于數字抽樣方式,在輸入時鐘和反饋時鐘之間插入延遲,使輸入時鐘和反饋時鐘的上升沿一致來實現的。又稱數字鎖相環。一個最簡單的DLL與PLL的主要不同在于DLL用延時線代替了PLL的壓控振蕩器,延時線產生輸入時鐘的延時輸出。
二、體系結構
Von Neumann Architecture
系統總線 BUS
最高效的計算方式應該是怎樣的?
現在大家應該都知道了,計算的瓶頸往往不在于運算單元數量的不夠或是速度不夠高,而是在內存帶寬上,也就是數據讀寫來不及,運算單元喂不飽。那最高效的計算方式自然就是能充分利用片上高速內存,讓運算單元等待數據的情況從不發生,同時盡可能的減少了對外部DDR的讀寫,這也同時降低了功耗,所以既要速度快又要功耗低這兩者其實并不矛盾。
為什么FPGA比GPU的能耗更低呢?上面講的是原因之一,還有一個原因是FPGA是硬件可編程,所以它的數據通路是最直接的。比如說用FPGA算兩個數相加,那直接把兩個數從內存讀進來送到加法器那去加就行了。但在GPU中還要進行指令譯碼,知道是做加法之后還要把這兩個數往加法器那里送,這中間數據要經過一些選通器才會被正確的送到加法器那而不是別的運算單元那里。譯碼,數據經過選通,這些都會產生額外的功耗。而FPGA每次要做的運算都是固定的,所以不需要指令譯碼,也基本不需要數據的選通。