當前位置:
首頁 > 科技 > 從點讚美圖到「萬能」邏輯器件:談談現場可編程門陣列 | 技術

從點讚美圖到「萬能」邏輯器件:談談現場可編程門陣列 | 技術


?

圖源:Pixabay.com


 

撰文 | 吳進遠(美國費米國家加速器實驗室)


責編 | 陳曉雪




 

 


 


一位人品好到爆的朋友發了九張美食照片,自然是點贊無數,少不了還有許多朋友的讚美評論。「烙餅卷大蔥配上小米粥令人饞涎欲滴」,「蘑菇燉小雞是我的最愛」,「紅油辣子好地道,除了吃螺獅面,我頓頓都得來一勺」,等等等等。小小的手機屏頓時好像香了不少。


 


這些讚美,在廚藝渣渣如我的電子學老師看來,除了悄悄咽口水,還可以作為數字邏輯的好教材,用來說明一個邏輯學的定理:任何複雜的邏輯關係式,都可以分解成為一個多項式。怎麼分解,我們後面會談到

(見下文第二部分)

。邏輯關係式的這種性質,是人們設計「萬能」數字邏輯器件的基礎。對於《知識分子》廣大讀者,在科研工作中設計製作實驗裝備,這是一種非常實用的基礎技能。


 


談到「萬能」,大多數讀者的第一反應恐怕是以為我們在賣「大力丸」。我們使用邏輯器件來生成數字邏輯,而大家需要的數字邏輯關係式又是千變萬化的,如何能夠讓一種邏輯器件來滿足不同用戶千變萬化的需求呢?這其實是近幾十年來,電子工程和計算機技術所面臨的一個不可迴避的問題。


 

在這篇文章中,我們首先回顧一下近二三十年半導體電子學器件發展的脈絡,以此理解這個問題產生的原因。然後討論解決這個問題的若干個思路與方案。在眾多解決方案當中,現場可編程門陣列

(FPGA)

發展得相對比較成熟,實現門檻比較低,因而得到比較廣泛的應用。事實上,很多科研人員或早或晚地有可能在自己的科學實驗當中用到FPGA,希望通過這篇文章藉此做一個簡明的介紹。


 


 為什麼要萬能?



 


集成電路的工藝在不斷地進步,我們可以集成到一個晶元上的晶體管的數量越來越多。可這也給設計人員帶來了煩惱,這麼多晶體管讓它們幹什麼呢?


 


在集成電路發展的初期,人們將晶體管組合成為一些常用的邏輯單元,比如與門、或門、寄存器等等。每一個集成電路片當中,放置若干個這樣的功能模塊。模塊的輸入與輸出端通過引腳接到集成電路外部,用戶通過印刷電路板,將這些埠連接,組成需要的邏輯電路。如圖1所示。

 



?

圖1:早期用集成電路搭接的邏輯電路板


 


隨著集成電路的製造工藝與技術進一步發展,人們能夠把更多的門電路,寄存器等功能模塊放到同一個晶元當中,但這些模塊之間又該怎樣連接呢?如果按照張三

(A用戶)

的需求連接,這個集成電路片就很難賣給李四

(B用戶)

,即使找到A與B用戶都能接受的方案,又很難滿足王二麻子

(C用戶)

的需求。這個矛盾,隨著集成電路的集成度逐步增高,變得越來越突出。

 


大家可能會說,這還不簡單,每個用戶按照自己的需求設計自己的集成電路就可以了嘛。這的確是一個解決方案,這種用戶根據自己需求設計的集成電路叫做ASIC

(Application Specific Integrated Circuit,專用集成電路)

。在工業界,我們看到很多廠商都為自己的產品設計專用的集成電路,用來實現各種智能控制,通訊,計算等功能,甚至用在兒童玩具當中。


 


集成電路這種東西,批量生產時每一個集成電路片的成本並不太高。但是製作光刻掩模,調整設備,設定工藝參數等一次性成本非常高。因此,只有在大批量生產的情況下,才能將一次性成本分攤開,實現經濟上的可行性。


 


在科學研究領域,各種實驗裝置大多數情況下都不會複製成千上萬套,因而往往用不起專用集成電路。僅僅在核物理,高能物理當中,由於探測器需要很多通道,因此探測單元信號的放大,處理以及數字化的功能有一定的可能用專用集成電路來實現。


 


除了在科研領域,即使是在工業界,對於邏輯電路也存在很多小批量的需求。這種需求,促成了「萬能」或者通用的可編程邏輯器件的出現。


 


怎樣達到萬能?




回到朋友圈裡的九張美圖,我們可以詳細地分析一下這些讚美的評論。「烙餅卷大蔥配上小米粥令人饞涎欲滴」,「蘑菇燉小雞是我的最愛」,「紅油辣子好地道,除了吃螺獅面,我頓頓都得來一勺」,等等等等。


 


這些讚美,每一條都可以看成一個複雜的邏輯關係多項式中的一項。這個多項式中的每一項,是用「與」

(and)

運算連接起來的輸入變數。而所有這些項又由「或」

(or)

運算連接成為多項式。此外,多項式中某些輸入變數可能會先經過一個「非」

(not)

運算然後再參與其它運算。「與」運算相當於代數多項式中的乘法,「或」運算相當於加法,而「非」運算相當於負號。

 


比如前面朋友圈的評論就可以寫成如下邏輯多項式:


好吃 = (烙餅 and 大蔥 and 小米粥)


or (蘑菇 and 小雞)


or (紅油辣子 and (not(螺獅 and 麵條)))


 


上面這個關係式中的第三項,實際上還可以做進一步的分解。為了簡化問題,我們忽略烹調方法,把含有螺獅與麵條這兩種食材的食物叫做螺獅面,也就是說,螺獅面是含螺獅的食物與含麵條的食物這兩個集合的交集。那麼什麼食物不是螺獅面呢?不是螺獅面的食物屬於不含螺獅食物這個集合或者不含麵條食物這個集合。因此:


 


(not(螺獅 and 麵條))=(not(螺獅))or (not(麵條))


 


大家可能聽說過德·摩根定理吧,德·摩根定理是一對關係式,上面這個關係式是其中的一個。除了這個「非與變或」關係式之外,還有一個「非或變與」關係式。有興趣的讀者可以上網搜索「De Morgan"s laws」,以獲得更多信息。


 


利用德·摩根定理,前面朋友圈的評論就可以最終展開成為:


好吃 = (烙餅 and 大蔥 and 小米粥)


or (蘑菇 and 小雞)


or (紅油辣子 and (not(螺獅)))


or (紅油辣子 and (not(麵條)))


 


複雜邏輯關係式能夠分解為多項式,這個數學結論為我們設計通用邏輯電路器件指出了方向。


 


FPGA的前身:PAL與GAL






人們最早開發的通用邏輯器件:可編程陣列邏輯

(PAL)

就是基於前面談到的邏輯多項式性質設計的。圖2是PAL的原理圖。


 



?

圖2:可編程陣列邏輯(PAL)的原理圖


 


一個PAL器件可以接收多個邏輯電平輸入,每個輸入信號驅動兩路縱向信號線。一路保持原有邏輯電平,輸入為高電平時,輸出也是高電平,而當輸入為低電平時,輸出也是低電平。第二路信號通過一個反相器,將邏輯電平翻轉,輸入為高電平時,輸出變成低電平,輸入為低電平時,輸出為高電平,也就是說,對輸入信號作了「非」運算。


 


這樣,N個輸入信號一共驅動2N根縱向的信號線,根據用戶需要它們選擇性地與橫向的邏輯線連接。

(這裡談到的連接實際上是通過一個二極體或者三極體連接的,為了簡潔,我們沒有把相應電路的細節畫出來。)


 


每一根橫向的邏輯線實現一個「與」門功能,也就是說,所有與之連接的信號都必須同時為邏輯「1」,其輸出才是「1」。這樣,每一根橫向的邏輯線就成為邏輯關係式中的一項。若干根

(通常是8根)

橫向邏輯線的輸出送入一個「或」門,這樣,這個「或」門的輸出,就成為一個邏輯多項式的結果。


 


PAL器件出廠的時候,所有縱向線與橫向線的交點都是連接在一起的。用戶根據自己的需要,將不需要的連接點切斷,僅保留需要的連接點,這個過程就是編程。這樣,PAL就成為一個「萬能」的邏輯器件,可以滿足不同用戶的需求。


 


最早的PAL器件,有些產品曾經使用低熔點的金屬做連接點,用戶編程的時候,把不需要的連接點熔斷。人們把這樣一個編程的過程叫做把程序「燒」入器件,這種說法一直沿用到現在。這樣的器件顯然無法多次編程,只能搞一鎚子買賣。這與早期的可編程只讀存儲器

(PROM)

的情況類似。


 


很快,可擦除只讀存儲器

(EPROM)

和電子可擦除只讀存儲器

(EEPROM)

的技術被推廣到PAL的領域,從而出現了可以多次重複編程的邏輯陣列器件。對這樣的器件,人們使用了另一個名字:

通用陣列邏輯GAL


 


用戶使用PAL或GAL時,先用專門的語言將需要的邏輯關係式寫成一個文本文件,然後用專門的計算機軟體將邏輯關係式簡化展開成為多項式,並根據器件的構造,確定在器件內要保留的連接點。隨後,我們把編譯出來的結果「燒」入器件,器件就具備了我們需要的功能,可以焊到電路板上了。


 


這類可編程陣列邏輯器件已經有30多年的歷史了,一般來說,歷史這樣悠久的電子技術很早之前就應該過時淘汰了。不過,我最近在一些電子產品供應商的網站上搜索,發現儘管由於註冊商標的限制,人們已經不再使用PAL與GAL這兩個名字,但仍然有廠家在生產銷售類似的可編程器件。在實際工作中,使用這類可編程邏輯器件在電路板上來實現一些簡單的邏輯電路還是十分方便的。


 


FPGA的構造




前面談到的可編程陣列邏輯器件僅僅能在一定的限度內實現萬能的邏輯應用,有時候,比如當邏輯關係多項式的項數超過8個,現有的器件就不能適應了。這就需要我們尋找更加萬能的邏輯實現方法。


 


此外,現代的PAL或GAL器件雖然理論上可以擦除原有的內容重新編程,可是實際上一旦焊到電路板上,要想修改,就得把它們燙下來,重新編程,再重新焊回到電路板上,非常麻煩。

(不過,作者確實見過別的同事不幸地做過這樣的事情。)

因此使用PAL或GAL這類器件基本沒有後悔葯可以吃。而當一個器件中晶體管數量進一步增加後,沒有人能一次就把複雜的邏輯功能設計對,這就需要為用戶提供後悔葯,讓器件可以在焊到電路板上之後仍然可以隨時重新編程與設置,也就是說,要做到現場可編程。於是人們就設計出了

現場可編程門陣列

(field-programmable gate array, FPGA)

器件


 


這種更加萬能的邏輯實現方法是基於查詢表

(LUT)

的,幾乎所有主流FPGA產品都是用查詢表來實現邏輯功能的。大多數FPGA產品里用到的查詢表包括四根或六根輸入線,一根輸出線。


 


在實際器件中,每一個查詢表的後面都有一個寄存器

(DFF)

,組成一個邏輯單元,如圖3所示。











?

圖3:FPGA的邏輯單元


 


這個寄存器的作用,是將查詢表輸出的邏輯電平暫存,然後送到下一級的邏輯單元。這樣,我們在FPGA中就可以組成多個層級的邏輯處理流水線,通過一定的時序,實現更加複雜的邏輯或計算功能。


 


所謂查詢表實質上是一個小小的存儲器,對於一個4輸入

(或6輸入)

的查詢表,裡面有16個

(或64個)

存儲單元,每個存儲單元包含一個比特。查詢表的輸入線是存儲器的地址線,根據這幾根輸入線的不同邏輯組合,存儲器指向相應的存儲單元,將預先存在那裡的比特信息讀出,驅動輸出端,從而生成需要的邏輯功能。


 


查詢表真的是萬能的嗎?真的能生成任何邏輯功能嗎?對於查詢表的每一個輸入端,它只可能有兩個邏輯電平,低

(0)

或高

(1)

。因此,對於4個輸入的查詢表,最多只可能存在16個輸入邏輯組合。而對於每一個邏輯組合,邏輯單元的輸出值,不外乎只有0或1兩個可能。因此,不管我們需要生成多麼複雜的邏輯關係式,只要在16個存儲單元當中預先存入相應的0或1數據就可以了。


 


我們通過下表列出的幾個例子,來說明這個方法。順便介紹一下,這種形式的表叫

邏輯真值表

(Logic Truth Table)





 


表中,ABCD是4根輸入線對應的邏輯組合,一共有16個。AND4是4輸入的「與」門邏輯,4根輸入線必須全部是1時,輸出才是1,否則是0。而OR4是4輸入的「或」門邏輯,4根輸入線任意一個是1時,輸出就是1,只有4根輸入線全部是0時,輸出才是0。


 


第三列的M3V1是一個比較複雜的邏輯關係式,可以稱為多數及否決邏輯。在BCD這3根輸入線中,必須有2根以上輸入為1,同時輸入線A也必須不是0,或者BCD全是1,整個邏輯關係式的輸出才是1。這很像一個公司里董事會表決一個議案,要想通過議案,普通董事會成員

(BCD)

必須表決達到簡單多數贊成,但董事長

(A)

卻有一票否決權。不過,如果普通董事會成員一致通過,則董事長否決也沒有用。大家仔細分析前面這個真值表,就可以看清楚這個邏輯。


 


讀者可能會好奇,像這樣一個查詢表能夠生成多少種不同的邏輯關係式呢?我們看到,這個查詢表當中有16個存儲單元,每個單元存儲一個比特的數據,可以取0或1兩個數值。因此,16個存儲單元中存儲的數據可以有2^16 = 65536種不同的組合,每一種組合實質上是一種邏輯關係式的表述。當然,我們這裡假定4根輸入線不可以互相交換,如果考慮邏輯關係當中的交換律,不同邏輯關係的總數就沒有那麼多了。這個總數的計算有點複雜,但我們至少知道,

這樣一個查詢表足以表述任何一個四輸入端

(或三、二輸入端)

的邏輯關係式。


 


FPGA器件中有很多是基於RAM

(隨機存儲器)

的,一旦關掉電源,裡面的內容就全部丟失了。因此,每次接通電源後,必須把存在計算機或者電路板上其它器件里的數據重新載入到FPGA中,把用戶需要的邏輯寫入查詢表裡,FPGA才能按照用戶的要求工作。從這點看,FPGA不僅是可以實現現場可編程,而且是必須能夠現場可編程才能正常使用。FPGA里需要的這些設置信息,通常是通過器件上的幾個專用引腳,用串列數據的編碼方式送進去的。


 


FPGA與微處理器的異同






有的讀者可能會質疑,投票表決這樣一個事為什麼要這樣複雜呢?一張票一張票地數一下不就行了嗎?


 


這是一個很好的問題,它揭示了微處理器技術與可編程邏輯器件技術這兩大領域中思維方式的不同。


 


一張張地數,是微處理器的做法,其特點是,將一個複雜的功能拆解成許多步驟,每個步驟的處理卻非常簡單。這樣,我們可以利用微處理器中相對簡單,可塑性很差的處理單元,通過複雜而多步驟的程序,來實現複雜的功能。我們用到的計算機,智能電子產品等,都是按照這樣一個技術路線設計的。


 


而對於可編程邏輯器件,我們盡量將複雜的功能扁平地展開。對於複雜度比較高的功能,我們通常會把它們安排到若干級流水線當中。


 


這樣做雖然比較麻煩,但可以很方便地將多個數據計算或邏輯處理功能並行實現,因而處理速度可以比同等的微處理器快。比如前面討論的表決問題,用微處理器至少要4個時鐘周期,而用FPGA則只需要一個時鐘周期就能得到結果。固然,微處理器的時鐘周期很短,一般僅有幾個納秒。但在有些應用中,我們真的是等不起這幾個時鐘周期,比如對於一個像加速器這樣的大型科研設備,一旦某些子系統出現故障就要立即進入停機保護狀態,這就要求相應的保護系統判斷速度越快越好。


 


實際上,我們這裡談到對PAL或FPGA的「編程」,只是一個歷史上形成的,不很確切的術語。我們載入到FPGA中的固件並不是「程序」,而是對FPGA中各個邏輯單元功能,以及它們之間連接的電路描述。這種描述通常可以用專門的語言寫成,其中每一部分的次序往往可以任意安排,畢竟對於一個電路,先描述哪一塊後描述哪一塊並沒有實質的區別。相反。

我們為微處理器所編寫的是真正的程序,程序中的每一行對應於微處理器所執行的每一個處理步驟,通常這些步驟的先後順序是不可以隨便顛倒的。




FPGA的實際應用




在科學實驗當中,FPGA可以適應很多不同的應用需求。當然,它的應用也多少有點兒門檻,不過這個門檻相當低。一個用戶在電腦上下載安裝一個編譯軟體,再花200美元左右買個驗證板,如圖4所示,就能做很多事情。





?

圖4:一種入門級的FPGA器件驗證板


 


作者帶過不少高中生,他們往往花幾天到一周時間,就能學會初步的編程技能,讓FPGA控制發光二極體發出各種花樣的閃光,控制揚聲器唱歌。下面的視頻顯示在驗證板上載入了這種固件後的運行情況。


 




 


期待這篇文章,能幫助需要的讀者跨過應用的門檻。




製版編輯:黃玉瑩 

|




本頁刊發內容未經書面許可禁止轉載及使用


公眾號、報刊等轉載請聯繫授權


zizaifenxiang@163.com


歡迎轉發至朋友圈


▼點擊查看相關文章


5G

|

范岱年和許良英

|

 複製皮膚

|

孕吐

|

科學的春天


青蒿素

|可燃冰|P值爭論|許晨陽

|博士後

|潘建偉


張毅|王曉東

|張啟發

|崔維成

|

張鋒

|

楊振寧

|

李佩


盧煜明

|

王小凡

|吳文俊

|袁鈞瑛

|

張純如

|劉若川



知識分子

為更好的智趣生活

ID:

The-Intellectual

投稿:

zizaifenxiang@163.com

長按二維碼,關注知識分子






▼▼▼

點擊「閱讀原文」,直達知識分子書店!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 知識分子 的精彩文章:

「點滴」專欄:夏志宏:父親二三事
項目與評價「一把尺」:中國基礎科研的短板系列之三

TAG:知識分子 |