天天看點

《Linux裝置驅動開發詳解 A》一一2.4 CPLD和FPGA

本節書摘來華章計算機出版社《linux裝置驅動開發詳解 a》一書中的第2章,第2.4節,作者:宋寶華 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。1

cpld(複雜可程式設計邏輯器件)由完全可程式設計的與或門陣列以及宏單元構成。

cpld中的基本邏輯單元是宏單元,宏單元由一些“與或”陣列加上觸發器構成,其中“與或”陣列完成組合邏輯功能,觸發器完成時序邏輯功能。宏單元中與陣列的輸出稱為乘積項,其數量标示着cpld的容量。乘積項陣列實際上就是一個“與或”陣列,每一個交叉點都是一個可程式設計熔絲,如果導通就是實作“與”邏輯。在“與”陣列後一般還有一個“或”陣列,用以完成最小邏輯表達式中的“或”關系。圖2.19所示為非常典型的cpld的單個宏單元結構。

圖2.20給出了一個典型cpld的整體結構。這個cpld由lab(邏輯陣列子產品,由多個宏單元組成)通過pia(可程式設計互連陣列)互連組成,而cpld與外部的接口則由i/o控制子產品提供。

《Linux裝置驅動開發詳解 A》一一2.4 CPLD和FPGA

圖2.19 典型的cpld的單個宏單元結構

《Linux裝置驅動開發詳解 A》一一2.4 CPLD和FPGA

圖2.20 典型的cpld整體架構

圖2.20中宏單元的輸出會經i/o控制塊送至i/o引腳,i/o控制塊控制每一個i/o引腳的工作模式,決定其為輸入、輸出還是雙向引腳,并決定其三态輸出的使能端控制。

與cpld不同,fpga(現場可程式設計門陣列)基于lut(查找表)工藝。查找表本質上是一片ram,當使用者通過原理圖或hdl(硬體描述語言)描述了一個邏輯電路以後,fpga開發軟體會自動計算邏輯電路所有可能的結果,并把結果事先寫入ram。這樣,輸入一組信号進行邏輯運算就等于輸入一個位址進行查表以輸出對應位址的内容。

圖2.21所示為一個典型fpga的内部結構。這個fpga由ioc(輸入/輸出控制子產品)、eab(嵌入式陣列塊)、lab和快速通道互連構成。

《Linux裝置驅動開發詳解 A》一一2.4 CPLD和FPGA

圖2.21 典型的fpga内部結構

ioc是内部信号到i/o引腳的接口,它位于快速通道的行和列的末端,每個ioc包含一個雙向i/o緩沖器和一個既可作為輸入寄存器也可作為輸出寄存器的觸發器。

eab(嵌入式存儲塊)是一種輸入輸出端帶有寄存器的非常靈活的ram。eab不僅可以用作存儲器,還可以事先寫入查表值以用來構成如乘法器、糾錯邏輯等電路。當用于ram時,eab可配制成8位、4位、2位和1位長度的資料格式。

lab主要用于邏輯電路設計,一個lab包括多個le(邏輯單元),每個le包括組合邏輯及一個可程式設計觸發器。一系列lab構成的邏輯陣列可實作普通邏輯功能,如計數器、加法器、狀态機等。

器件内部信号的互連和器件引出端之間的信号互連由快速通道連線提供,快速通道遍布于整個fpga器件中,是一系列水準和垂直走向的連續式布線通道。

表2.2所示為一個4輸入lut的實際邏輯電路與lut實作方式的對應關系。

《Linux裝置驅動開發詳解 A》一一2.4 CPLD和FPGA

cpld和fpga的主要廠商有altera、xilinx和lattice等,它們采用專門的開發流程,在設計階段使用hdl(如vhdl、verilog hdl)程式設計。它們可以實作許多複雜的功能,如實作uart、i2c等i/o控制晶片、通信算法、音視訊編解碼算法等,甚至還可以直接內建arm等cpu核心和外圍電路。

對于驅動工程師而言,我們隻需要這樣看待cpld和fpga:如果它完成的是特定的接口和控制功能,我們就直接把它當成由很多邏輯門(與、非、或、d觸發器)組成的可完成一系列時序邏輯群組合邏輯的asic;如果它完成的是cpu的功能,我們就直接把它當成cpu。驅動工程師眼裡的硬體比ic設計師要宏觀。

值得一提的是,xilinx公司還推出了zynq晶片,内部同時內建了兩個cortex?-a9 arm多處理器子系統和可程式設計邏輯fpga,同時可程式設計邏輯可由使用者配置。

繼續閱讀