學習 FPGA之基本原理(可能理解不對)

2021-05-08 03:06:03 字數 4567 閱讀 6084

>> 什麼是fpga

fpga是英文field programmable gate array的縮寫,即現場可程式設計門陣列,它是在pal、gal、epld等可程式設計器件的基礎上進一步發展的產物。它是作為專用積體電路(asic)領域中 的一種半定製電路而出現的,既解決了定製電路的不足,又克服了原有可程式設計器件閘電路數有限的缺點。

fpga採用了邏輯單元陣列 lca(logic cell array)這樣乙個新概念,內部包括可配置邏輯模組clb(configurable logic block)、輸出輸入模組iob(input output block)和內部連線(interconnect)三個部分。fpga的基本特點主要有:

a) 採用fpga設計asic電路,使用者不需要投片生產,就能得到合用的晶元。

b) fpga可做其它全定製或半定製asic電路的中試樣片。

c) fpga內部有豐富的觸發器和i/o引腳。

d) fpga是asic電路中設計週期最短、開發費用最低、風險最小的器件之一。

e) fpga採用高速chmos工藝,功耗低,可以與cmos、ttl電平相容。

可以說,fpga晶元是小批量系統提高系統整合度、可靠性的最佳選擇之一。

fpga是由存放在片內ram中的程式來設定其工作狀態的,因此,工作時需要對片內的ram進行程式設計。使用者可以根據不同的配置模式,採用不同的程式設計方式。

加電時,fpga晶元將eprom中資料讀入片內程式設計ram中,配置完成後,fpga進入工作狀態。這個過程,在資料中稱為「載入」或者「裝載」,是不是有點怪怪的?類似於arm系列的晶元中bootrom載入bootloader到internal sram中。掉電後,fpga恢復成白片,內部邏輯關係消失,因 此,fpga能夠反覆使用。fpga的程式設計無須專用的fpga程式設計器,只須用通用的eprom、prom程式設計器即可。當需要修改fpga功能時,只需換一 片eprom即可。這樣,同一片fpga,不同的程式設計資料,可以產生不同的電路功能。因此,fpga的使用非常靈活。

>> lut

查詢表(look-up-table)簡稱為lut,lut本質上就是乙個ram。 目前fpga中多使用4輸入的lut,所以每乙個lut可以看成乙個有4位位址線的16x1的ram。 當使用者通過原理圖或hdl語言描述了乙個邏輯電路以後,pld/fpga開發軟體會自動計算邏輯電路的所有可能的結果,並把結果事先寫入ram,這樣,每輸入乙個訊號進行邏輯運算就等於輸入乙個位址進行查表,找出位址對應的內容,然後輸出即可。

下面是乙個4輸入與門的例子,

實際邏輯電路

lut的實現方式

a,b,c,d 輸入

邏輯輸出 位址

ram中儲存的內容

0000 0

0000 0

0001 0

0001 0

.... 0

... 0

1111 1

1111 1

>> 基於查詢表(lut)的fpga的結構

通過上面對lut的描述,如果你聯想到可以使用這個來實現fpga,那麼就恭喜你,你簡直是太聰明了。

下面由小郭同志幫你以幾個fpga為例來說明基於lut的fpga結構。

我們看一看xilinx spartan-ii的內部結構,如下圖:

xilinx spartan-ii 晶元內部結構

slices結構

spartan-ii主要包括clbs,i/o塊,ram塊和可程式設計連線(未表示出)。在spartan-ii中,乙個clb包括2個slices,每個slices包括兩個lut,兩個觸發器和相關邏輯。 slices可以看成是spartanii實現邏輯的最基本結構 (xilinx其他系列,如spartanxl,virtex的結構與此稍有不同,具體請參閱資料手冊)

altera的flex/acex等晶元的結構如下圖:

altera flex/acex 晶元的內部結構

邏輯單元(le)內部結構

flex/acex的結構主要包括lab,i/o塊,ram塊(未表示出)和可程式設計行/列連線。在flex/acex中,乙個lab包括8個邏輯單元(le),每個le包括乙個lut,乙個觸發器和相關的相關邏輯。le是flex/acex晶元實現邏輯的最基本結構(altera其他系列,如apex的結構與此基本相同,具體請參閱資料手冊)

>> lut結構的fpga的基本工作原理

上電後,程式載入到fpga中的internal ram中,接下來lut就可以工作了,據spec中講述,這個過程很快,基本可以忽略。在軍工和航天類的fpga中,可以把程式直接搞到flash或者eeprom中,不需要這個load的過程,實現上電執行的特性,類似於pld。

下面接著描述基於lut結構的fpga的基本原理。

我們還是以這個電路的為例:

a,b,c,d由fpga晶元的管腳輸入後進入可程式設計連線,然後作為位址線連到到lut,lut中已經事先寫入了所有可能的邏輯結果,通過位址查詢到相應的資料然後輸出,這樣組合邏輯就實現了。 該電路中d觸發器是直接利用lut後面d觸發器來實現。時鐘訊號clk由i/o腳輸入後進入晶元內部的時鐘專用通道,直接連線到觸發器的時鐘端。觸發器的輸出與i/o腳相連,把結果輸出到晶元管腳。這樣pld就完成了圖3所示電路的功能。(以上這些步驟都是由軟體自動完成的,不需要人為干預)

這個電路是乙個很簡單的例子,只需要乙個lut加上乙個觸發器就可以完成。對於乙個lut無法完成的的電路,就需要通過進製邏輯將多個單元相連,這樣fpga就可以實現複雜的邏輯。

由於lut主要適合sram工藝生產,所以目前大部分fpga都是基於sram工藝的,而sram工藝的晶元在掉電後資訊就會丟失,一定需要外加一片專用配置晶元,在上電的時候,由這個專用配置晶元把資料載入到fpga中,然後fpga就可以正常工作,由於配置時間很短,不會影響系統正常工作。 也有少數fpga採用反熔絲或flash工藝,對這種fpga,就不需要外加專用的配置晶元。 由於

fpga

需要被反覆燒寫,它實現組合邏輯的基本結構不可能像asic那樣通過固定的與非門來完成,而只能採用一種易於反覆配置的結構。查詢表可以很好地滿足這一要求,目前主流fpga都採用了基於sram工藝或者是基於flash工藝的查詢表結構,通過每次燒寫改變查詢表內容的方法實現對fpga的重複配置。

那麼查詢表取代與非門電路的原理是什麼呢?我們知道,乙個n輸入的邏輯運算,不管是與或非運算還是異或運算等等,最多隻可能存在2n種結果,若我們事先將相應的結果存放於乙個存貯單元,不就相當於實際了與非門電路的功能了嗎?fpga的原理正是如此,它通過燒寫檔案去配置查詢表的內容,從而在相同的電路情況下實現了不同的邏輯功能。

以例1為例,它的真值表如表1所示。我們只需用將輸出y的值事先存放在乙個1x16的sram或者flash中,然後用a、b、c、d做位址索引查詢輸出,就可以代替與門運算,得到等價的結果。

【例1】 乙個四輸入與閘電路

assign y = a&b&c&d;

表1   例1對應的真值表

輸入                               輸出

>> fpga中的寶貴資源

io資源:其決定了gpga的擴充套件性;

dcm:數字時鐘管理器,用來實現倍頻,並且可以消抖;

ip核:這個就不用說了吧

bram:可以用來實現成堆疊/fifo/ram等(這個怎麼實現我就不明白了,沒有做過)

上面有些是自己總結,不可全信哦。

Vue 指令的基本原理(可能)

const object1 object.defineproperty object1,property1 object1.property1 77 throws an error in strict mode 嚴格模式下錯誤console.log object1.property1 expecte...

REST API基本原理理解

rest api 利用現有的http協議來實現。核心概念就是 資源 操作 的api。rest api 是一種面向服務的api,介面中性,適合搭建web service時採用。何為資源 資源就是乙個url。例如 其中stu201311是乙個學號。那麼這條url就表示stu201311這個 學生資源 何...

mysql的基本原理 Mysql 基本原理

mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...