官术网_书友最值得收藏!

第2章 FPGA板級電路設計

本章導讀

本書所論及的所有實踐工程將基于一套由多個電路板組成的FPGA開發平臺,這套開發平臺既有以Altera Cyclone IV FPGA為基礎的核心板,也有諸如AD/DA、UART、USB2.0、CMOS攝像頭、AV解碼器、工業液晶屏接口、觸摸屏接口、VGA接口、HDMI接口等外設為主的子板。本章將對基于FPGA的最小系統的各個設計要素進行討論,同時也會對我們將要使用的這套開發平臺的各個電路板進行簡要的介紹,同時也會穿插著對電路設計的要點進行論述。

2.1 FPGA板級電路設計五要素

和純粹基于PC的各種軟件編程不同,FPGA器件的學習僅靠一臺PC是不夠的。對于任何一個學習者而言,能夠擁有一塊板載FPGA器件的電路板平臺是非常必要的。當然了,前期的開發調試肯定還是離不開PC的。和基于PC的軟件編程(如在Visual C++工具上實現C/C++語言的編程,在各種網絡編程工具上實現.net/java語言的編程)相同的是,可編程器件的開發也有專用的語言(目前主流的語言是Verilog和VHDL)和專用的開發工具(如Xilinx公司的開發工具ISE/Vivado, Altera公司的開發工具Quartus II以及其他的第三方工具)。不同點也顯而易見,PC的軟件編程由于最終就是實現在PC本地或者網絡上,那么它就不需要開發者配備額外的設備;而基于FPGA器件的開發,其最終的功能是需要實現在特定的FPGA器件內部的,因此開發者勢必需要首先具備載有FPGA器件的一塊電路板。除此以外,還需要具備一條用于連接PC和可編程器件的用于傳輸配置數據流的連接線,我們通常稱此連接線為“下載線”。

如圖2-1所示,對于任何一個FPGA開發者而言,一條下載線和一塊板載FPGA器件的電路板應該說是最基本的硬件配備了。電路板的作用不言而喻,我們設計的目的便是希望通過對板載的FPGA器件編程,以控制電路板上的其他外設按照我們既定的功能運轉;而下載線是起到連接PC和電路板的作用,它將協助開發人員將已經在PC的軟件工具上預先設計好的功能配置數據流固化到電路板的FPGA器件中(可用于前期的開發、調試以及產品化后的升級)。

圖2-1 下載線和電路板

既然需要一塊板載FPGA器件的電路板,那么這塊電路板該如何設計呢?如圖2-2和圖2-3所示,分別為Xilinx公司最新的Zynq Soc FPGA開發板和Altera公司最新的Cyclone V Soc FPGA開發板。乍一看,整齊有序且美觀大方,豐富的外設資源,恐怕大伙都要垂涎三尺了,而要咱們初學者也DIY一個,那真叫“比駱駝穿過針的眼還難”。

圖2-2 Xilinx —— Zynq Soc FPGA開發板

圖2-3 Altera —— Cyclone V Soc FPGA開發板

別心慌,先拋開電路板各種各樣復雜的外設功能,我們可以先探討一下單純實現一片FPGA器件的核心電路(即能讓FPGA工作起來的最基本且元器件最少的電路)是如何設計的。相比于其他嵌入式系統芯片的電路設計,單純的FPGA核心電路其實還算是非常簡單的。根據過往的設計經驗,筆者簡單地將FPGA核心電路歸納為五部分:電源電路、時鐘電路、復位電路、配置電路和外設電路,我們姑且稱之為五要素。下面我們將逐一探討各個要素在FPGA器件的運行中扮演的角色及其常規電路的設計方式。

2.1.1 能量供應——電源電路

自然界的任何生物體都需要有能量的供應,人需要吃飯喝水、花草樹木需要陽光雨露、鳥獸蟲魚也都有可食之物。人工智能也是如此,爐灶需要煤氣、汽車需要加油、亮燈需要供電……小小的芯片工作起來也離不開能量的供給。

FPGA器件需要有電源電壓的能量供應才能工作。尤其對于規模較大的器件,其功耗也相對較高,其供電系統的好壞將直接影響到整個開發系統的穩定性。所以,設計出高效率、高性能的FPGA供電系統具有極其重要的意義。

不同的FPGA器件、不同的應用方式會有不同的電壓電流的需求。如圖2-4所示,簡單歸納,可以將FPGA器件的電壓需求分為三類:核心電壓、I/O電壓和輔助電壓。

圖2-4 供電電壓

核心電壓是FPGA內部各種邏輯電路正常工作運行所需要的基本電壓,該電壓用于保證FPGA器件本身的工作。通常選定某一款FPGA器件,其核心電壓一般也都是一個固定值,不會因為電路的不同應用而改變。核心電壓值可以從官方提供的器件手冊中找到。

I/O電壓顧名思義便是FPGA的I/O引腳工作所需的參考電壓。在引腳排布上,FPGA與ASIC最大的不同,便是FPGA所有的可用信號引腳基本都可以作為普通I/O使用,其電平值的高低完全由器件內部的邏輯決定。當然了,它的高低電平標準也受限于所供給的I/O電壓。任何一片FPGA器件,它的I/O引腳通常會根據排布位置分為多個bank。同一個bank內的所有I/O引腳所供給的I/O電壓是共用的,可以給不同的bank提供不同的I/O電壓,它們彼此是不連通的。因此,不同bank的不同I/O電壓為FPGA器件的不同接口應用提供了靈活性。這里舉一個例子,Cyclone III系列器件的某些bank支持LVDS差分電平標準,此時器件手冊會要求設計者給用于LVDS差分應用的bank的I/O電壓供1.5V電壓,這就不同于一般的LVTTL或LVCOMS的3.3V供電需求。而一旦這些用于LVDS傳輸的I/O bank電壓供給為1.5V,那么它就不能作為3.3V或其他電平值標準傳輸使用了。

除了前面提到的核心電壓和I/O電壓,FPGA器件工作所需的其他電壓我們通常都稱為輔助電壓。例如FPGA器件下載配置所需的電壓,當然了,這里的輔助電壓值可能與核心電壓值或I/O電壓值是一致的。很多FPGA的PLL功能塊的供電會有特殊要求,也可以認為是輔助電壓。由于PLL本身是模擬電路,而FPGA其他部分的電路基本是數字電路,因此PLL的輸入電源電壓也很有講究,需要專門的電容電路做濾波處理,而它的電壓值一般和I/O電壓值不同。

目前比較常見的供電解決方案主要是LDO穩壓器、DC/DC芯片或電源模塊。LDO穩壓器為電流輸出要求不高的應用提供了簡單廉價的解決方案;而基于DC/DC芯片的解決方案能夠保證較高的電源轉換效率,散熱容易一些,輸出電流也更大,是大規模FPGA器件的最佳選擇;而電源模塊簡單實用并且能夠有更穩定的性能,只不過價格通常比較昂貴,在成本要求不敏感的情況下,是FPGA電源設計的一種最為簡單快捷的解決方案。總而言之,對于電源方案的選擇以及電源電路的設計,一定要事先做好前期的準備工作,如以下幾點是必須考慮的:

? 器件需要供給幾檔電壓,壓值分別是多少?

? 不同電壓檔的最大電流要求是多少?

? 不同電壓檔是否有上電順序要求?(大部分的FPGA器件是沒有此項要求的)

? 電源去耦電容該如何分配和排布?

? 電源電壓是否需要設計特殊的去耦電路?

關于設計者需要確定的各種電氣參數以及電源設計的各種注意事項,其實在器件廠商提供的器件手冊(handbook)、應用筆記(application notes)或是白皮書(white paper)中一般都會給出參考設計。所以,設計者若希望能夠較好地完成FPGA器件的電源電路設計,事先閱讀大量的官方文檔是必須的。

說到電源,也不能不提一下地端(GND)電路的設計,FPGA器件的地信號通常是和電壓配對的。一般應用中,統一共地連接是沒有問題的,但也需要注意特殊應用中是否有隔離要求。FPGA器件的引腳引出的地信號之間通常是導通的,當然也不能排除有例外的情況。如果漏接個別地信號,器件通常也能正常工作,但是筆者也遇到過一些特殊的狀況,如Altera的Cyclone III器件底部的中央有個接地焊盤,如果設計中忽略了這個接地信號,那么FPGA很可能就不干活了,因為這個地信號是連接FPGA內部的很多中間信號的地端,它并不和FPGA的其他地信號直接導通。因此,在設計中也一定要留意地信號的連接,電源電路的任何細小疏忽都有可能導致器件的罷工。

2.1.2 心臟跳動——時鐘電路

人體擁有非常奇妙的循環系統,而心臟是這個循環系統的發動機,它向全身各部位供應血液。如圖2-5所示,心臟有四個空腔,上面兩個叫心房(atrium),下面兩個叫心室(ventric1e)。右心房收納全身的靜脈血,通過右心室從肺動脈泵出,此時肺動脈中流的是靜脈血,通過肺中的氣體交換,變成含氧豐富的動脈血,由肺靜脈送至左心房,再通過左心室的主動脈泵向全身各個組織器官以滿足其正常生理活動的需要。這便是人體無時無刻不在進行著的心跳過程。

圖2-5 心臟示意圖

了解了心臟之于人體內部循環系統的作用,反觀時鐘信號之于FPGA器件,其實也有著異曲同工之妙。伴隨著每一次的心跳過程,都有血液的運轉和流動;同樣的,伴隨著每一個時鐘脈沖的產生,也都有數字信號的輸入和輸出。對于在FPGA器件內實現的任何時序邏輯應用,失去了時鐘信號便意味著信號的傳輸將處于停滯狀態。時鐘信號的重要性可見一斑。

如圖2-6所示,理想的時鐘模型是一個占空比為50%且周期固定的方波。Tc l k為一個時鐘周期,T1為高脈沖寬度,T2為低脈沖寬度,Tc l k=T 1+T 2。一般情況下,FPGA器件內部的邏輯會在每個時鐘周期的上升沿執行一次數據的輸入和輸出處理,而在兩個時鐘上升沿的空閑時間里,則可以用于執行各種各樣復雜的處理。而一個比較耗時的復雜運算過程,往往無法在一個時鐘周期內切割成幾個耗時較小的運算,然后在數個時鐘上升沿后輸出最終的運算結果。時鐘信號的引入,不僅讓所有的數字運算過程變成“可量化”的,而且也能夠將各種不相關的操作過程同步到一個節拍上協同工作。

圖2-6 理想時鐘波形

FPGA器件的時鐘信號源一般來自外部,我們通常使用晶體振蕩器(簡稱晶振)產生時鐘信號。當然了,一些規模較大的FPGA器件內部都會有可以對時鐘信號進行倍頻或分頻的專用時鐘管理模塊,如PLL或DLL。由于FPGA器件內部使用的時鐘信號往往不只是供給單個寄存器使用,因為在實際應用中,成百上千甚至更多的寄存器很可能共用一個時鐘源,那么從時鐘源到不同寄存器間的延時也可能存在較大偏差(我們通常稱為時鐘網絡延時),而我們知道,這個時間差過大是很要命的。因此,FPGA器件內部設計了一些稱之為“全局時鐘網絡”的走線池。通過這種專用時鐘網絡走線,同一時鐘到達不同寄存器的時間差可以被控制到很小的范圍內。而我們又如何能保證輸入的時鐘信號能夠走“全局時鐘網絡”呢?有多種方式,對于外部輸入的時鐘信號,只要將晶振產生的時鐘信號連接到“全局時鐘專用引腳”上;而對于FPGA內部的高扇出控制信號,通常工具軟件會自動識別此類信號,將其默認連接到“全局時鐘網絡”上,而設計者若是不放心,也可通過編譯報告進行查看,甚至可以手動添加這類信號。關于時鐘電路的設計和選型,有如下幾個基本事項需要考慮:

? 系統運行的時鐘頻率是多少?(可能有多個時鐘)

? 是否有內部的時鐘管理單元可用(通常是有)?它的輸入頻率范圍是多少(需要查看器件手冊進行確認)?

? 盡可能選擇專用的時鐘輸入引腳。

? 時鐘走線盡可能短,有條件最好做包地處理,確保外部輸入時鐘信號干凈、穩定。

2.1.3 狀態初始——復位電路

FPGA器件在上電后都需要有一個確定的初始狀態,以保證器件內部邏輯快速進入正常的工作狀態。因此,FPGA器件外部通常會引入一個用于內部復位的輸入信號,這個信號稱之為復位信號。對于低電平有效的復位信號,當它的電平為低電平時,系統處于復位狀態;當它從低電平變為高電平時,則系統撤銷復位,進入正常工作狀態。由于在復位狀態期間,各個寄存器都賦予輸出信號一個固定的電平狀態,因此在隨后進入正常工作狀態后,系統便擁有了我們所期望的初始狀態。

復位電路的設計也很有講究,一般的設計是期望系統的復位狀態能夠在上電進入穩定工作狀態后多保持一點時間。因此,阻容復位電路可以勝任一般的應用;而需要得到更穩定可靠的復位信號,則可以選擇一些專用的復位芯片。復位信號和FPGA器件的連接也有講究,通常也會有專用的復位輸入引腳。

至于上電復位延時的長短,也是很有講究的。因為FPGA器件是基于RAM結構的,它通常需要一顆用于配置的外部ROM或Flash進行上電加載,在系統上電穩定后,FPGA器件首先需要足夠的時間用于配置加載操作,只有在這個過程結束之后,FPGA器件才能夠進入正常的用戶運行模式。而上電復位延時過短,等同于FPGA器件根本就沒有復位過程;當然了,如果上電復位延時過長,那么對系統性能甚至用戶體驗都會有不同程度的影響,因此,設計者在實際電路中必須對此做好考量,保證復位延時時間的長短恰到好處。關于FPGA器件的復位電路,我們也需要注意以下幾個要點:

? 盡可能使用FPGA的專用復位引腳。

? 上電復位時間的長短需要做好考量。

? 確保系統正常運行過程中復位信號不會誤動作。

2.1.4 靈活定制——配置電路

20世紀80年代,聯合測試行為組織(Joint Test Action Group, JTAG)制定了主要用于PCB和IC的邊界掃描測試標準。該標準于1990年被IEEE批準為IEEE 1149.1-1990測試訪問端口和邊界掃描結構標準。隨著芯片設計和制造技術的快速發展,JTAG越來越多地被用于電路的邊界掃描測試和可編程芯片的在線系統編程。

FPGA器件都支持JTAG進行在線配置,JTAG邊界掃描的基本原理如圖2-7所示。在FPGA器件內部,邊界掃描寄存器由TDI信號作為數據輸入,TDO信號作為數據輸出,形成一個很大的移位寄存器鏈。而JTAG通過整個寄存器鏈,可以配置或者訪問FPGA器件的內部邏輯狀態或者各個I/O引腳的當前狀態。

圖2-7 JTAG邊界掃描原理

在這里我們不過多研究JTAG的原理。對于電路設計來說,JTAG的四個信號TCK/TMS/TDI/TDO(TRST信號一般可以不用)以及電源、地連接到下載線即可。

說到FPGA的配置,這里不得不提一下它們和CPLD內部存儲介質的不同。CPLD由于大多是基于PROM或Flash來實現可編程特性,因此對它們進行在線編程時就已將配置數據流固化好了,重新上電后還能夠運行固有的配置數據。FPGA大多是基于SRAM來實現可編程特性,換句話說,通過JTAG實現在線編程時,在保持不斷電的情況下,FPGA能夠正常運行,而一旦掉電,SRAM數據丟失,FPGA則一片空白,無法繼續運行任何既定功能。因此,FPGA通常需要外掛一個用于保存當前配置數據流的PROM或Flash芯片,我們通常稱之為“配置芯片”, CPLD則不需要。

因此,對于FPGA器件,我們若希望它產品化,可以脫機(PC機)運行,那么就必須在板級設計時考慮它的配置電路。也不用太擔心,其實FPGA廠商的器件手冊里也會給出推薦的配置芯片和參考電路,大多情況下“依葫蘆畫瓢”便可。當然了,板級設計還是馬虎不得的,有如下幾個方面是需要注意的:

? 配置芯片盡量靠近FPGA。

? 考慮配置信號的完整性問題,必要時增加阻抗匹配電阻。

? 部分配置引腳可以被復用,但是要謹慎使用,以免影響器件的上電配置過程。

FPGA配置電路的設計是非常重要的,相關信號引腳通常都是固定并且專用的,需要參考官方推薦電路進行連接。

2.1.5 自由擴展——外設電路(I/O應用)

FPGA器件擁有著豐富的I/O資源,它的可擴展性非常強,這也是我們使用它的一個很重要原因。如果說前面四個部分電路的設計相對而言都比較固定,那么I/O引腳應用則相對要自由很多。當然了,這里所謂的“自由”,并不意味電路設計的隨意,而是針對電路設計豐富的可選擇性而言的。話說回來,這里的“自由”也還是要建立在一定的基礎之上的。筆者根據多年的工程經驗,對于I/O與外設的連接擴展,歸納出了以下要點:

? 輸入和輸出時鐘信號盡量分配到專用的引腳上。

? 差分信號對必須分配到支持差分傳輸的專用引腳上。

? 高速信號分配到支持高速傳輸的專用引腳上,如支持DDR的專用I/O接口。

? 一些硬核使用的引腳可能是固定的,千萬不能隨意分配。

? 總線信號盡量分配到同一個bank或者相近的bank中。

? 一些可能產生噪聲干擾的信號(如時鐘信號)盡量遠離器件的配置信號和其他敏感信號。

? 引腳分配時盡可能減少交叉連接。

2.2 FPGA核心電路板設計

前面花了不少篇幅準備理論知識,接下來就要開始動手實踐了。我們的硬件平臺是核心板+子板結構,非常方便靈活,玩上手了會有種“FPGA版樂高積木”的感覺。信不信由你,反正我是玩出了點味道。閑話少說,FPGA核心電路板的板級硬件設計電路馬上呈現。

2.2.1 硬件整體架構設計

如圖2-8所示,FPGA核心板電路架構主要有電源電路和數字電路兩個部分。電源電路部分是一些基本的供電元器件,如電源插座、電源開關、電源指示燈以及LDO電源電路。數字電路則以Altera Cyclone IV FPGA為核心,25MHz的時鐘晶振和RC電路產生的復位信號作為FPGA運行的最基本信號源;FPGA的I/O引腳外接一個指示燈,便于指示其工作狀態;JTAG插座用于FPGA的在線配置以及其他多種FPGA配置方式的實現;64Mbit的SPI Flash用于存儲FPGA的配置數據,PC可以通過JTAG插座和FPGA本身實現對這顆SPI Flash的固化;128M×8bit的NAND Flash和32M×16bit的DDR2 SDRAM和FPGA可以構成一個基本的嵌入式系統,在后續的例程中它們大有用處;3個32PIN的標準插座可用于外接FPGA子板,進行各種外設功能的擴展。

圖2-8 FPGA核心板電路架構

2.2.2 電源電路設計

如圖2-9所示,J1為FPGA的電源插座,SW1為電源開關,都是市面上最常見的元件,D2則是電源指示燈,當開關SW1閉合時,D2點亮,指示當前系統供電狀態。

圖2-9 FPGA電源插座電路

由于我們所選擇的Cyclone IV系列FPGA器件整體功耗并不大,因此可獲得更好的低紋波電源性能,如圖2-10所示,我們使用了4顆LDO產生FPGA所需要的3.3V、2.5V、1.8V和1.2V四檔電壓。

圖2-10 FPGA四檔電源電壓產生電路

如圖2-11所示,從Cyclone IV器件手冊中可以查到,Cyclone IV系列器件的供電一般分4大類,壓值有3~4檔(可能更多檔,這主要取決于不同bank的I/O電壓是否有特殊供電需求)。這4類電源分別是內核電壓VCCINT、I/O電壓VCCI/O、PLL模擬電壓VCCA和PLL數字電壓VCCD_PLL。這4類電源電壓中,內核電壓固定1.2V、PLL模擬電壓固定2.5V、PLL數字電壓固定1.2V;唯一不確定,或者說有選擇余地的電源是I/O電壓,它可以根據用戶實際應用所需要的I/O標準選擇不同的電壓,我們的板子由于需要使用DDR2 SDRAM,它所連接的FPGA bank對應的I/O電壓是1.8V,其他的bank都使用最常見的3.3V電壓供電。

圖2-11 Cyclone IV系列器件的供電標準

說到I/O電壓,我們不得不多提兩句,畢竟可以兼容非常多的I/O電壓標準是FPGA的一大優勢,尤其是各種高速差分信號的支持。圖2-12中列出了我們這款器件支持的各種I/O電平標準。方形框出的3.3-V LVTTL和SSTL-18 Class I則是我們這款FPGA核心板中實際使用的I/O電平標準。

圖2-12 Cyclone IV FPGA所支持的各種電平標準

FPGA的供電電路如圖2-13和圖2-14所示。在FPGA的供電電路中,每1~2個電源引腳我們都配有1個去耦電容。當然了,在空間允許的情況下,每個電源引腳盡量都就近放置去耦電容。

圖2-13 FPGA PLL供電電路

圖2-14 FPGA I/O和核壓供電電路

關于FPGA電源電路的PCB Layout設計,通常需要遵循以下的原則。

? 完整的或分割的電源層都應該就近與其對應的地層。

? 電源層和地層之間的絕緣層應該盡可能的薄,以增強耦合電容與平面電容(通常取3~4mil)。

? 為了最小化電感值,電源引腳應當就近直接連到相應的電源層。避免器件的電源引腳與供電源端或電源層之間的走線寬度過窄。板級設計者應該多參考電源芯片廠商提供的設計指南。

? 電源分割線的間距應該在25~100mil。

? 不同電源引腳不能夠共用一個過孔。換句話說,每個電源引腳都應該至少有一個專用的過孔連接到電源層。

2.2.3 時鐘與復位電路設計

FPGA的時鐘輸入都有專用引腳,通過這些專用引腳輸入的時鐘信號,在FPGA內部可以很容易地連接到全局時鐘網絡上。所謂的全局時鐘網絡,是FPGA內部專門用于走一些有高扇出、低時延要求的信號,這樣的資源相對有限,但是非常實用。FPGA的時鐘和復位通常是需要走全局時鐘網絡的。如圖2-15所示,這是Cyclone IV器件的內部全局時鐘網絡的布局示意圖。如果說一個城市當中的各種羊腸小道、普通馬路是FPGA器件內部的一般布線資源,那么我們就可以認為FPGA內部的全局時鐘網絡就是高架路(高速公路)。圖2-15中我們也不難發現,除了FPGA外部的一些專用時鐘引腳,PLL的輸出以及FPGA內部的一些信號也都可以連接到FPGA的全局布線網絡上。

圖2-15 FPGA全局時鐘網絡

時鐘和復位電路如圖2-16所示。外部使用了25MHz的有源晶振,連接FPGA的專用時鐘輸入引腳,FPGA內部的PLL可以將外部時鐘頻率進行倍頻或分頻,甚至進行相位的調整。復位使用簡單的RC電路,也是連接到FPGA的專用輸入時鐘引腳,走內部全局時鐘網絡。

圖2-16 FPGA時鐘和復位電路

FPGA上電復位時間需要大于FPGA器件啟動后的配置加載時間,這樣才能夠確保FPGA運行后的復位初始化過程有效。因此,我們也可以來看看這個電路的設計是否滿足實際要求。

如圖2-17所示,這是器件手冊中關于上電配置時間的計算公式。

圖2-17 器件手冊中AS配置時間計算公式的截圖

如圖2-18所示,我們所使用的EP4CE22器件的配置數據量為5748 552bits。

圖2-18 器件手冊中配置數據存儲量的截圖

我們實測當SPI Flash對FPGA進行配置時的時鐘為32MHz。由此我們便可以計算配置所需的時間,取最壞的情況,即配置時鐘頻率在最低情況下,配置所需時間為:5748 552bits*(31.25ns/1bit)= 180ms。

如圖2-19所示,這里標示了復位輸入引腳作為3.3-V LVTTL標準電平的最低VIH電壓值是1.7V,那么可以由此計算阻容復位電路從0V上升到1.7V所需的時間。

圖2-19 器件手冊中I/O電平標準的截圖

V0為電容上的初始電壓值;V1為電容最終可充到或放到的電壓值;Vtt時刻電容上的電壓值。則有公式t=RC×Ln[(V1-V0)/(V1-Vt)]。

求充電到1.7V的時間。將已知條件V0=0, V1=3.3V, Vt=1.7V代入上式得:1.7=0+3.3× [[1-exp(-t/RC)],算得t=0.7239RC

代入R=47k, C=10uf得t = 0.34s,即340ms。

由此我們驗證了阻容復位的時間遠大于FPGA器件的上電復位時間。當然了,這里沒有考慮FPGA器件從上電到開始配置運行所需的電壓上升時間,一般這個時間不會太長。所以我們的阻容復位肯定是有效的。如果需要實際的確認,還是要通過示波器設備來輔助觀察實際信號的延時情況。

關于FPGA時鐘電路的PCB Layout設計,通常需要遵循以下原則:

? 時鐘晶振源應該盡可能放在與其連接的FPGA時鐘專用引腳的臨近位置。

? 時鐘線盡可能走直線。如果無法避免轉彎走線,使用45度線,盡量避免T型走線和直角走線。

? 不用同時在多個信號層走時鐘線。

? 時鐘走線不要使用過孔,因為過孔會導致阻抗變化及反射。

? 靠近外層的地層能夠最小化噪聲。如果使用內層走時鐘線,要有良好的參考平面,且走帶狀線。

? 時鐘信號應該有終端匹配電路,以最小化反射。

? 盡可能使用點到點的時鐘走線。

? 如圖2-20所示,對于時鐘差分對的走線,必須嚴格按照D>2S規則,以最小化相鄰差分對間的串擾。

圖2-20 時鐘差分對的間隔

? 確保整個差分對在整個走線過程中的線間距恒定。

? 確保差分對的走線等長,以最小化偏斜和相移。

? 同一網絡走線過程中避免使用多個過孔,以確保阻抗匹配和更低的感抗。

? 高頻的時鐘和USB差分信號對走線盡可能短。

? 高頻時鐘或周期性信號盡可能遠離高速差分對以及任何引出的連接器(例如I/O連接器、控制和數據連接器或電源連接器)。

? 應當保證所有走線有持續的地和電源參考平面。

? 為了最小化串擾,盡量縮短高頻時鐘或周期性信號與高速信號并行走線的長度。推薦的最小間距是3倍的時鐘信號與最近參考面間距。

? 當一個時鐘驅動多個負載時,使用低阻抗傳輸線以確保信號通過傳輸線。

? 信號換層時使用回路過孔。

? 同步時鐘的延時應該與數據相匹配。確保時鐘與同步數據總線在同一層走線,以最小化不同層之間的傳輸速率差異。

2.2.4 配置電路設計

我們所說的FPGA配置電路,一方面要完成從PC上把bit文件下載到FPGA或存儲器的任務,另一方面則要完成FPGA上電啟動時加載配置數據的任務。在開始設計FPGA的配置電路之前,我們不妨用一些篇幅簡單了解一下FPGA的配置過程和配置方式。

大多數FPGA器件都是基于RAM結構的,當然了,也有基于Flash結構的,但RAM結構的是主流,也是我們討論的重點。而RAM是易失存儲器,在掉電后保存在上面的數據就丟失了,重新上電后需要再次加載配置數據。因此,我們肯定不希望每次重新上電后都用PC去加載一次,工程應用也不允許我們這么做。所以,FPGA旁邊都有一顆配置芯片,它通常是一顆Flash存儲器。不管是串行還是并行的Flash,它們的啟動加載原理基本相同。

為避免混淆,這里對FPGA的下載配置和啟動配置做一點區分。FPGA器件的下載配置,是指將PC上的FPGA配置數據流通過下載線纜燒錄到FPGA或者Flash存儲器中。而FPGA器件的啟動配置,則是指將配置數據流從PC或者Flash存儲器中加載到FPGA內,使其運行起來。

FPGA器件的下載配置,最常見的是基于JTAG的配置方式,這種方式既可以直接將PC上的配置數據流加載到FPGA上在線運行,也可以通過FPGA器件本身間接地將數據燒錄到Flash等外部配置芯片中。另一種下載配置是將配置數據流直接下載到配置芯片中。由于JTAG方式靈活多用,尤其是在線調試非常快速便利,因此我們的FPGA核心板電路中就只預留了JTAG接口。

FPGA器件的啟動配置主要有JTAG方式、AS和PS配置方式。

AS配置方式由FPGA器件引導配置過程,它控制著外部存儲器及其初始化過程。FPGA器件處于主動地位,配置器件處于從屬地位。配置數據通過DATA0引腳送入FPGA。配置數據被同步在DCLK輸入上,1個時鐘周期傳送1位數據。

PS配置方式則由PC或其他控制器控制配置過程。在PS配置期間,配置數據從外部儲存器件通過DATA0引腳送入FPGA。配置數據在DCLK上升沿鎖存,1個時鐘周期傳送1位數據。

JTAG接口是一個業界標準,主要用于芯片測試等功能,使用IEEE Std 1149.1聯合邊界掃描接口引腳,支持JAM STAPL標準,可以使用Altera下載電纜或主控器來完成。

FPGA在正常工作時,它的配置數據存儲在RAM中,加電時須重新下載。在實驗系統中,通常用計算機或控制器進行調試,因此可以使用PS配置方式。在實用系統中,多數情況下必須由FPGA主動引導配置操作過程,這時FPGA將主動從外圍專用存儲芯片中獲得配置數據,而此芯片中FPGA配置信息是用普通編程器將設計所得的pof格式的文件燒錄進去。

JTAG模式在線下載FPGA的原理如圖2-21所示,PC端的Quartus II軟件通過下載線纜將配置數據流(sof文件)下載到FPGA內部,下載完成后在FPGA中立刻執行下載代碼,速度很快,非常適合調試。

圖2-21 JTAG方式下載配置過程

FPGA下載數據到配置芯片的原理如圖2-22所示,PC端的Quartus II軟件通過下載線纜將配置數據流(jic文件)下載到配置芯片中。由于配置芯片和JTAG接口都是分別連接到FPGA的,它們不是直接連接的,所以配置文件先從PC傳送到FPGA,然后FPGA內部再轉送給配置芯片,在該過程中FPGA相當于起到一個橋接的作用。

圖2-22 JTAG方式下載數據到配置芯片

看完JTAG模式下在線配置FPGA和燒錄配置芯片的原理,我們再了解一下FPGA上電初始的配置過程。FPGA上電后,內部的控制器首先工作,確認當前的配置模式,如果是外部配置芯片啟動,則通過和外部配置芯片的接口(如我們的SPI接口)將配置芯片的數據加載到FPGA的RAM中,配置完成后開始正式運行。當然了,有人可能在想,JTAG在線配置是否和配置芯片加載相沖突呢?非也,JTAG在線配置的優先級是最高的,無論此時FPGA中在運行什么邏輯,只要JTAG下載啟動,則FPGA便停下當前的工作,開始運行JTAG下載的新的配置數據。

先看器件手冊中給出的一些相關參考設計,如圖2-23所示,這是FPGA和用于配置的SPI Flash的接口連接方式,即我們所說的AS配置方式。注意FPGA的幾個主要引腳nSTATUS\CONF_DONE\nCONFIG\nCE的連接,或者上拉,或者接地,主要是為了保證這些信號在上電初始處于一個確定的電平狀態,防止錯誤電平導致誤觸發。DATA\DCLK\NCSO\ASDO這4個引腳便是SPI接口,連接到SPI Flash。

圖2-23 AS配置參考電路的截圖

如圖2-24所示,FPGA有組MSEL引腳是用于設置FPGA初上電時的啟動模式,我們的FPGA上電使用Standard AS模式從SPI Flash里面加載配置數據。

圖2-24 MSEL引腳配置說明的截圖

有了前面的理論做鋪墊,我們的設計也就有依有據了。如圖2-25所示,這是我們的SPI Flash芯片,它的4個信號分別連接到FPGA器件的相應引腳上。

圖2-25 FPGA的AS配置電路

前面是上電啟動配置數據的電路,通過一個SPI Flash來實現。而PC端到FPGA器件的下載則是通過JTAG來實現的,JTAG這個概念網絡上滿天飛了,大家自己去消化,但凡有CPU的地方,基本都有JTAG的存在,FPGA也不例外。另外,大家注意前面的MSEL設置了FPGA啟動模式是Standard AS模式,但是JTAG永遠是最高優先級的模式,任何時刻,只要JTAG需要進行下載配置,那么配置模式將會轉換。JTAG下載插座以及部分配置專用引腳的連接電路如圖2-26所示。

圖2-26 JTAG插座與FPGA配置電路

2.2.5 DDR2電路設計

FPGA通常有專用的接口支持諸如DDR2、DDR3等高速的存儲器,因此在對其引腳進行連接時,需要使用FPGA定義好的專用存儲器接口總線,不能隨心所欲地隨意連接。Altera公司的FPGA器件,在它們的官方網站上都可以下載到與器件對應的引腳定義文檔(通常有excel格式、txt格式或pdf格式),在這些文檔中,詳細羅列了哪些引腳可以用于存儲器數據總線、地址總線、時鐘或控制信號的連接。因此,在著手設計前,一定要先參考并定義好FPGA與存儲器間的接口連接。

DDR2芯片的連接電路如圖2-27所示。

圖2-27 DDR2芯片接口電路

DDR2芯片接口以及PCB layout通常需要遵循以下原則:

? 單端信號的電路板阻抗一般控制在50 ohm ± 10%;差分信號的電路板阻抗一般控制在100 ohm ± 10%。

? DQ、DQS、CK/CK#選擇VSS作為參考平面;地址、命令、控制信號線選擇VDD作為參考平面。

? 雙向I/O,如DQ,串行端接電阻放置在走線的中間,用于抑制振鈴、過沖和下沖。

? 單向信號,如地址、控制和命令線,串行端接電阻放置在走線的中間或信號的發送端,推薦放在信號的發送端。

? 推薦的線寬為:

? 推薦的線間距為:

? DQS一般布線在DQ信號組的中間。

? DQS與時鐘信號線不相鄰。

? 為了避免串擾,數據信號組和地址、控制、命令信號組之間的走線間距應在±20mils,建議它們在不同的信號層走線。

? 時鐘信號組盡量走在內層,CK和CK#的走線長度偏差在±20mils以內,最好是±10mils以內。

? 數據信號組的走線長度和時鐘信號組的走線長度偏差在±500mils以內。

? 同一組信號線的走線長度偏差在±50mils(±25mils)以內。

? 地址、命令、控制信號線的走線長度與時鐘信號組的走線長度偏差在±400mils以內。

? 同一地址、命令、控制信號組內的走線長度偏差在±50mils。

? 所有信號走線長度控制在2000mils(50mm)以內。

? VREF布局布線:

● VREF和其他信號之間保持20mm間距。

● VDD到VREF的走線盡可能短。

● 去耦電容盡可能靠近VREF。

● VREF走線至少20~25mils。

● VREF和相鄰走線之間至少保持15~25mils間距。

? 布線順序:

● 數據信號DQ、DQS、DM

● 地址信號,命令信號CAS#、RAS#、WE#

● 控制信號CS#、CKE

● 時鐘信號

● 反饋信號

? 如圖2-28所示,蛇形走線的相鄰走線間距是線寬的5倍。

圖2-28 蛇形走線線寬與間距的關系

2.2.6 NAND Flash電路設計

如 圖2-29所 示,這 是NAND Flash芯片的接口電路。只要NAND Flash的R/B#(Ready/Busy#)信號上拉,其他信號都連接到FPGA的I/O引腳上就好。

圖2-29 NAND Flash芯片接口電路

2.2.7 引腳分配與I/O擴展電路

如圖2-30所示,核心板上專門留了一個LED指示燈連接到FPGA引腳上,用于板子的測試。PIN_113輸出高電平LED將被導通點亮,低電平LED截止則不亮。

圖2-30 連接FPGA引腳的LED驅動電路

FPGA核心板其余的I/O引腳通過3個32PIN的連接器引出。如圖2-31、圖2-32和圖2-33所示。

圖2-31 P2插座連接電路

圖2-32 P3插座連接電路

圖2-33 P4插座連接電路

2.3 擴展外設子板設計

如圖2-34所示為圍繞FPGA器件設計的核心板,它的誘人之處在于引出的3個32PIN插座。這3組可擴展的接口可以連接各種各樣的外設子板,可以作為一個電子愛好者無限DIY的平臺。針對該核心板,我們目前已經推出的可用于實現一些項目工程的外設子板有AD/DA外設子板、UART/USB外設子板、FX2(USB 2.0)外設子板、CMOS攝像頭子板、AV視頻采集子板設計、7寸工業液晶屏子板、VGA顯示驅動子板和HDMI顯示驅動子板。

圖2-34 FPGA核心板實物照片

如表2-1所示,這是我們目前推出的核心板和各個子板的主要外設列表。

表2-1 各個子板的主要外設列表

2.3.1 AD/DA外設子板設計

SF-BASE基本外設子板的各個主要外設芯片的實物位置如圖2-35所示。

圖2-35 SF-BASE子板實物照片

在后續項目實例中,我們主要使用了SF-BASE子板AD/DA芯片的功能,AD/DA芯片的引腳定義如表2-2所示。

表2-2 SF-BASE的AD/DA芯片引腳定義

A/D芯片的電路如圖2-36所示。它通過一個單向(從A/D芯片到FPGA)數據傳輸的SPI接口與FPGA相連。FPGA通過這組SPI接口讀取當前模擬電壓值。為了得到不同的模擬電壓值,我們的板子在A/D芯片的模擬輸入端設置了一個3.3V的分壓電阻,當跳線帽連接了P3的1~2引腳時,調節可變電阻R24的阻值便能改變當前A/D采樣的數據。跳線帽若連接P3的2~3引腳,則AD芯片的輸入模擬電壓來自于D/A芯片的當前輸出。

圖2-36 A/D芯片驅動電路

D/A轉換電路如圖2-37所示,該D/A芯片通過I2C接口與FPGA連接,FPGA通過這組I2C接口輸出數據,相應D/A芯片的VOUT輸出模擬電壓值。若跳線帽連接P2的1~2引腳,則不同的模擬電壓值輸出驅動D9指示燈呈現不同的亮度。

圖2-37 D/A芯片驅動電路

2.3.2 UART/USB外設子板設計

SF-USB子板的實物照片如圖2-38所示。

圖2-38 SF-USB子板實物照片

SF-USB子板主要用到其USB轉UART芯片FT232,該芯片內部功能框圖如圖2-39所示。它通過USB的D+/D-與PC進行通信,芯片內部能夠根據USB協議對數據進行處理,最終通過FIFO將這些數據轉換為UART協議和我們的FPGA進行通信。

圖2-39 FT232芯片內部功能框圖

FT232R的接口電路如圖2-40所示。P4為USB port,用于連接PC, UART_TX和UART_RX分別為FT232R芯片的UART發送和UART接收信號,對應的,UART_TX就是FPGA的UART接收,而UART_RX就是FPGA的UART發送信號。D2和D3連接著U2-23/22,在UART_RX和UART_TX收發時它們會閃爍以指示工作狀態。

圖2-40 FT232R接口電路

FT232R的引腳定義如表2-3所示。

表2-3 FT232R引腳定義

SF-USB子板的USB轉UART芯片連接到FPGA的信號定義如表2-4所示。

表2-4 SF-USB子板連接引腳定義

2.3.3 FX2(USB 2.0)外設子板設計

SF-FX2子板的實物照片如圖2-41所示。

圖2-41 SF-FX2子板實物照片

FX2(CY7C68013)是一款集成8051單片機的靈活的USB 2.0控制器,其帶寬可以接近USB2.0標稱的480Mbit/s。

FX2的內部功能框圖如圖2-42所示,從圖中不難看出,8051實際上并不直接參與USB數據的實際傳輸,而只是做一些基本的配置。從GPIF(或SlaveFIFO)接口傳輸的數據,在FX2內部傳到了RAM中進行緩存,并且可以直接送到USB 2.0的phy中傳輸給USB設備。

圖2-42 FX2內部功能框圖

SF-FX2子板和SF-VIP核心板需要進行連接的主要接口定義如表2-5所示。

表2-5 SF-FX2子板連接引腳定義

2.3.4 CMOS攝像頭子板設計

SF-MT9D111子板的實物照片如圖2-43所示。

圖2-43 SF-MT9D111子板實物照片

SF-MT9D111子板上板載美光的CMOS攝像頭MT9D111,它是美光的一款在單芯片系統上集成了一個先進的200萬像素圖像傳感器和功能強大的圖像處理技術芯片。單芯片系統中的自動特性可以調整各種參數,以便在各種光照條件下拍攝到優質圖像。MT9D111也可以簡化設計工程師的工作,因為所有的處理功能、內存以及與鏡頭的接口都集成在一個單傳感器處理芯片上。MT9D111是一顆1/3英寸、200萬像素的CMOS圖像傳感器,它自帶有集成的先進相機系統。此相機系統包含一個復雜的圖像流處理器(IFP)、一個實時JPEG編碼器、一個集成的微控制器、閃光控制、自動聚焦、光學縮放以及機械快門。整個系統級芯片(SoC)可以在低照度條件下具備卓越的性能,同時功耗很低。MT9D111的內部功能框圖如圖2-44所示。

圖2-44 MT9D111芯片內部功能框圖

SF-MT9D111子板的主要接口定義如表2-6所示。

表2-6 SF-MT9D111子板連接引腳定義

2.3.5 AV視頻采集子板設計

SF-AV子板的實物照片如圖2-45所示。

圖2-45 SF-AV子板實物照片

如圖2-46所示,SF-AV子板板載的ADV7180芯片是一顆AV解碼芯片,該芯片能夠自動檢測并轉換標準的AV電視信號,包括NTSC、PAL和SECAM等制式。該芯片輸出的數字信號接口為標準的ITU-R BT.656協議。

圖2-46 ADV7180芯片內部功能框圖

SF-AV子板的主要接口定義如表2-7所示。

表2-7 SF-AV子板連接引腳定義

2.3.6 7寸工業液晶屏子板設計

SF-L70子板以及液晶屏的實物照片如圖2-47所示。

圖2-47 SF-L70子板實物照片

SF-L70子板連接到FPGA的主要接口定義如表2-8所示。

表2-8 SF-L70子板連接引腳定義

如圖2-48所示,這里用到的觸摸屏控制器芯片AW2083數字端通過IIC總線與FPGA進行通信,模擬端則由四個輸入方向X+、X-、Y+、Y-組成,它們直接連接到電阻式觸摸屏的FPC上。

圖2-48 觸摸屏驅動電路

如圖2-49所示,這是連接到7寸液晶屏電路的FFC插座接口,它通過FPC(俗稱“軟排線”)連接到液晶屏上。

圖2-49 液晶屏接口電路

2.3.7 VGA顯示驅動子板設計

SF-VGA板載用于驅動VGA顯示器的專用D/A轉換芯片AVD7123, FPGA通過32pin連接器驅動ADV7123芯片產生供給VGA顯示器的色彩以及同步信號。SF-VIP核心板的FPGA與SF-VGA子板的ADV7123芯片連接的框圖如圖2-50所示。FPGA產生ADV7123的同步信號以及3組供給ADV7123內部3路并行D/A轉換的數字信號,經過ADV7123的這3組VGA色彩數字信號最終轉換為0~0.7V的模擬電壓送給VGA顯示器。而FPGA另外會產生用于同步色彩數據的場同步信號VSY和行同步信號HSY。

圖2-50 SF-CY3核心與SF-VGA子板模塊連接的系統框圖

SF-VGA子板的實物圖如圖2-51所示。

圖2-51 SF-VGA子板實物照片

ADV7123芯片以及外圍電路如圖2-52所示。它的3路D/A信號實際上都是8bit位寬,但是我們只使用了565的RGB(即5bit的R信號,6bit的G信號,5bit的B信號)輸出,所以把不使用的RGB信號都統一接地。用于同步數據傳輸的有時鐘LCD_CLK、轉換數據有效控制信號LCD_BLK和補償同步控制信號LCD_SYN。根據datasheet,實際上LCD_SYN我們無需使用,所以邏輯驅動給它0電平就可以了。而LCD_CLK是和輸出的數據總線同步的,根據我們所需要的顯示驅動分辨率和刷新率決定,LCD_BLK信號則在數據總線有效時拉高即可。

圖2-52 ADV7123與VGA接口電路

ADV7123的模擬輸出IOR、IOG、IOB信號直接連接到VGA插座上,同時FPGA輸出的兩個同步信號VGA_HSY和VGA_VSY也直接連接到VGA插座上。

SF-VGA與FPGA引腳定義如表2-9所示。

表2-9 SF-VGA與FPGA引腳定義

2.3.8 HDMI顯示驅動子板設計

SF-HDMI顯示驅動子板上板載HDMI控制器芯片ADV7513, FPGA與ADV7513芯片之間的接口示意如圖2-53所示。RGB565總線用于顯示圖像的傳輸;同步控制信號HDMI_DE、HDMI_HSY、HDMI_VSY、HDMI_CLK產生時序配合RGB565總線完成圖像的傳輸;IIC總線用于FPGA對ADV7513的寄存器配置,實現ADV7513接口模式和工作模式的初始化配置。

圖2-53 FPGA與ADV7513芯片接口示意圖

SF-HDMI子板的實物圖如圖2-54所示。

圖2-54 SF-HDMI子板實物照片

SF-HDMI與FPGA引腳定義如表2-10所示。

表2-10 SF-HDMI與FPGA引腳定義

主站蜘蛛池模板: 忻城县| 博乐市| 定结县| 元氏县| 白银市| 赣州市| 陇川县| 太谷县| 绥滨县| 湖北省| 偏关县| 博客| 洛川县| 唐山市| 两当县| 巩留县| 濮阳市| 金门县| 金门县| 临西县| 安乡县| 宁陵县| 万载县| 邯郸县| 林周县| 天台县| 颍上县| 澎湖县| 辉县市| 富阳市| 敦煌市| 铜鼓县| 吴旗县| 定州市| 南昌县| 绥阳县| 商水县| 桑日县| 广河县| 泗洪县| 安图县|