如何使用FPGA開(kāi)發(fā)
介紹
與傳統(tǒng)的微控制器相比,FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)是獨(dú)一無(wú)二的,因?yàn)樗鼈儾粓?zhí)行順序指令。相反,它們由一組可配置的邏輯塊組成,這些邏輯塊可以被重新編程以執(zhí)行自定義的數(shù)字邏輯功能。這使得FPGA可以并行執(zhí)行多個(gè)操作,使其在信號(hào)處理、數(shù)據(jù)處理和實(shí)時(shí)控制等特定任務(wù)中非常高效。
為了定義FPGA的功能,我們使用硬件描述語(yǔ)言(HDL),它指定了邏輯元素應(yīng)該如何配置和互連。在這個(gè)項(xiàng)目中,我將使用SystemVerilog,這是Verilog的高級(jí)版本,它引入了額外的特性,如增強(qiáng)的類型安全、斷言和面向?qū)ο缶幊坦δ?,使其更適合FPGA設(shè)計(jì)。
對(duì)于硬件,我使用的是Arty S7-25,這是一個(gè)基于Xilinx Spartan-7 FPGA的開(kāi)發(fā)板。它在尺寸、性能和可負(fù)擔(dān)性之間提供了一個(gè)很好的平衡,使其成為初學(xué)者的絕佳選擇。該板具有雙Arduino頭,便于原型設(shè)計(jì),以及PMOD頭,允許擴(kuò)展額外的外設(shè)。當(dāng)我使用這個(gè)特定的板時(shí),如果您遵循這個(gè)項(xiàng)目,任何來(lái)自Spartan-7家族或更高版本的Xilinx FPGA都應(yīng)該兼容。
XADC (Xilinx模數(shù)轉(zhuǎn)換器)
XADC是Xilinx FPGA中的集成模數(shù)轉(zhuǎn)換器(ADC),使其能夠處理模擬信號(hào)和數(shù)字邏輯。該功能對(duì)于電壓監(jiān)測(cè)、傳感器數(shù)據(jù)采集和實(shí)時(shí)模擬信號(hào)處理等應(yīng)用特別有用。通過(guò)將ADC直接集成到FPGA中,減少了對(duì)外部ADC組件的需求,簡(jiǎn)化了硬件設(shè)計(jì)并提高了系統(tǒng)集成度。
XADC的主要特性:
?雙12位adc能夠以高達(dá)1 MSPS(每秒百萬(wàn)采樣)的速度采樣,允許高速數(shù)據(jù)采集。
?支持多達(dá)16個(gè)外部模擬輸入通道(根據(jù)FPGA封裝不同而不同),支持多個(gè)傳感器或信號(hào)連接。
?用于FPGA溫度監(jiān)測(cè)和電源電壓跟蹤的片上傳感器,有助于系統(tǒng)可靠性和熱管理。
?靈活的接口選項(xiàng):支持AXI Lite,動(dòng)態(tài)重新配置端口(DRP)或直接寄存器控制,允許與不同的FPGA設(shè)計(jì)集成。
?支持單極(0V至1V)和雙極(-0.5V至0.5V)輸入模式,適應(yīng)各種模擬信號(hào)范圍。
?可配置報(bào)警閾值,使自動(dòng)警報(bào)電壓或溫度異常。
XADC通過(guò)彌合模擬和數(shù)字域之間的差距,增強(qiáng)了FPGA的多功能性,使其成為需要在基于FPGA的系統(tǒng)中進(jìn)行實(shí)時(shí)模擬信號(hào)處理的應(yīng)用的理想選擇。
Vivado:賽靈思的FPGA設(shè)計(jì)軟件
Vivado是Xilinx的綜合FPGA設(shè)計(jì)套件,用于設(shè)計(jì)、模擬、合成和編程基于FPGA的系統(tǒng)。它為HDL開(kāi)發(fā)提供了一個(gè)完整的工具鏈,包括邏輯分析儀、IP集成器和調(diào)試工具,使其成為FPGA開(kāi)發(fā)必不可少的工具。無(wú)論您是實(shí)現(xiàn)簡(jiǎn)單的邏輯電路還是復(fù)雜的數(shù)字系統(tǒng),Vivado都可以通過(guò)其高級(jí)合成(HLS),基于塊的設(shè)計(jì)方法和硬件調(diào)試工具簡(jiǎn)化設(shè)計(jì)流程。
下載安裝程序
訪問(wèn)AMD/Xilinx官方網(wǎng)站并導(dǎo)航到下載部分。
下載最新版本的統(tǒng)一安裝程序,選擇與您的操作系統(tǒng)(Windows或Linux)兼容的版本。
注意:您需要登錄或創(chuàng)建一個(gè)免費(fèi)的AMD/Xilinx帳戶才能訪問(wèn)下載。
安裝過(guò)程
運(yùn)行安裝程序并按照屏幕上的說(shuō)明操作。
在安裝過(guò)程中,您可以選擇完全安裝或自定義安裝,這取決于您是否需要額外的工具,如Vitis(用于嵌入式開(kāi)發(fā))或僅用于FPGA設(shè)計(jì)的Vivado。
準(zhǔn)備好大量下載(幾gb),因此建議使用穩(wěn)定且快速的互聯(lián)網(wǎng)連接。
創(chuàng)建第一個(gè)項(xiàng)目
一旦安裝了Vivado,下一步就是在AMD Vivado設(shè)計(jì)套件中創(chuàng)建一個(gè)新項(xiàng)目。本項(xiàng)目將作為工作空間,您將在其中編寫(xiě),模擬和合成您的FPGA設(shè)計(jì)。
步驟1:創(chuàng)建項(xiàng)目
打開(kāi)Vivado并從歡迎屏幕中選擇Create New Project。
選擇一個(gè)項(xiàng)目名稱(例如,DisplayXADC)并選擇一個(gè)方便的位置來(lái)保存項(xiàng)目文件。
單擊Next繼續(xù)。
步驟2:選擇項(xiàng)目類型
當(dāng)提示項(xiàng)目類型時(shí),選擇RTL項(xiàng)目(注冊(cè)-傳輸級(jí)別),因?yàn)檫@允許您使用SystemVerilog編寫(xiě)設(shè)計(jì)。
啟用“此時(shí)不指定源”復(fù)選框,除非您已經(jīng)準(zhǔn)備好了源文件。
單擊Next繼續(xù)。
步驟3:創(chuàng)建源文件和約束文件
進(jìn)入項(xiàng)目后,創(chuàng)建一個(gè)新的源文件:選擇create file→選擇SystemVerilog作為文件類型。將其命名為任何您喜歡的名稱(例如,xadc_display.sv)。
創(chuàng)建空約束文件:選擇“創(chuàng)建文件”→確保文件類型為XDC (Xilinx Design Constraints)。將其命名為您喜歡的任何名稱(例如,constraints.xdc)。稍后將使用該文件定義引腳映射、時(shí)鐘約束和定時(shí)設(shè)置。
步驟4:選擇FPGA板
將出現(xiàn)一個(gè)對(duì)話框,提示您在零件和電路板之間進(jìn)行選擇。
選擇Boards選項(xiàng)卡并鍵入您的FPGA板型號(hào)(例如,Arty S7-25)。如果沒(méi)有顯示您的單板,請(qǐng)單擊“刷新”或確保安裝了單板文件。
單擊Next,然后單擊Finish以完成設(shè)置。
配置XADC
要在FPGA設(shè)計(jì)中使用XADC (Xilinx模數(shù)轉(zhuǎn)換器),需要在Vivado中添加和配置XADC IP核。按照以下步驟正確設(shè)置:
步驟1:添加X(jué)ADC IP核
在Vivado的左側(cè),找到并單擊IP Catalog。
在搜索欄中,輸入“XADC”。
選擇“XADC向?qū)А?,然后雙擊打開(kāi)其配置設(shè)置。
步驟2:自定義XADC IP
將出現(xiàn)一個(gè)對(duì)話框,允許您配置XADC核心。
選擇接口類型:配置接口模式為DRP (Dynamic Reconfiguration Port)。這允許通過(guò)寄存器實(shí)時(shí)訪問(wèn)ADC轉(zhuǎn)換。
選擇轉(zhuǎn)換模式:在模式選擇下,選擇“單通道”,設(shè)置為“連續(xù)模式”。這確保了ADC連續(xù)采樣單個(gè)模擬輸入,而不是通過(guò)多個(gè)通道循環(huán)。
禁用告警(本項(xiàng)目不需要):導(dǎo)航到“告警”頁(yè)簽。禁用所有警報(bào),因?yàn)榇藨?yīng)用程序不需要它們。這些告警通常用于監(jiān)控電源電平和FPGA溫度。
選擇模擬輸入引腳:在單通道選項(xiàng)卡下,找到外部模擬輸入部分。為A0引腳(或FPGA上相應(yīng)的ADC引腳)選擇VAUXP0/VAUXN0。確切的引腳映射可能因FPGA板而異,因此請(qǐng)檢查約束文件(.xdc)以驗(yàn)證正確的引腳。
步驟3:生成XADC IP核
保留所有其他設(shè)置為默認(rèn)值,除非您的應(yīng)用程序需要進(jìn)一步定制。
單擊OK關(guān)閉自定義窗口。
在下一個(gè)對(duì)話框中,選擇“生成輸出產(chǎn)品”,然后單擊“生成”。
此時(shí),將生成XADC IP核并準(zhǔn)備將其集成到您的設(shè)計(jì)中。該模塊將允許您的FPGA與模擬信號(hào)接口,例如從電位器或其他傳感器讀取電壓電平。
代碼
ConstrainFile
約束文件(.xdc)在FPGA設(shè)計(jì)中至關(guān)重要,因?yàn)樗x了項(xiàng)目的I/O引腳映射、時(shí)鐘約束和時(shí)序要求。該文件告訴FPGA使用哪個(gè)物理引腳進(jìn)行輸入和輸出,確保您的設(shè)計(jì)與外部硬件(如按鈕,led,傳感器或通信接口)正確交互。
每個(gè)FPGA板都有一個(gè)唯一的約束文件,因?yàn)椴煌陌逵胁煌囊_分配和硬件配置。
七段模塊
該子模塊設(shè)計(jì)用于一次控制單個(gè)七段LED顯示屏。它需要一個(gè)輸入時(shí)鐘信號(hào)來(lái)同步顯示更新和一個(gè)輸入數(shù)字(十六進(jìn)制0-F)。
高層模塊
主模塊被指定為源文件層次結(jié)構(gòu)中的“頂層”模塊。這個(gè)頂層模塊作為設(shè)計(jì)的入口,類似于C語(yǔ)言編程中的主要功能。通過(guò)用清晰的層次結(jié)構(gòu)構(gòu)建設(shè)計(jì),頂層模塊確保所有組件有效地協(xié)同工作,使調(diào)試和擴(kuò)展系統(tǒng)更容易。
頂層模塊的角色
?它充當(dāng)集成和連接設(shè)計(jì)中所有其他子模塊的最高級(jí)模塊。
?它定義了與FPGA外部引腳接口的I/O端口。
?它實(shí)例化其他模塊的實(shí)例,在它們之間傳遞信號(hào)以確保正確的通信。
初始化模塊實(shí)例
在頂部模塊中,您將創(chuàng)建項(xiàng)目中定義的其他模塊的實(shí)例。這些實(shí)例的行為類似于軟件編程中的函數(shù)調(diào)用,但它們不是按順序執(zhí)行,而是并行操作。
我們首先定義它的輸入和輸出端口,這決定了FPGA如何與外部硬件組件交互。
時(shí)鐘輸入(用于同步)
模擬輸入(用于從XADC讀取數(shù)據(jù))
輸出控制七段顯示
實(shí)例化XADC模塊
接下來(lái),我們實(shí)例化XADC模塊,該模塊連續(xù)采樣模擬輸入信號(hào)并將其轉(zhuǎn)換為16位數(shù)字值。然后對(duì)這些數(shù)據(jù)進(jìn)行處理,以提取相關(guān)信息進(jìn)行顯示。
實(shí)例化七段顯示模塊
由于我們正在使用兩個(gè)七段顯示,因此我們創(chuàng)建了sevenSegment模塊的兩個(gè)實(shí)例。這些實(shí)例接收處理過(guò)的數(shù)據(jù)并驅(qū)動(dòng)相應(yīng)的顯示段。
數(shù)據(jù)處理和路由
來(lái)自XADC的原始數(shù)據(jù)是16位寬,但是一個(gè)7段的顯示器通常一次只顯示一個(gè)數(shù)字。
為了顯示有意義的值,我們對(duì)16位數(shù)據(jù)進(jìn)行切片,只提取高階位,它們代表ADC轉(zhuǎn)換結(jié)果的最高有效數(shù)字。
切片后的數(shù)據(jù)被發(fā)送到七段模塊,在那里被轉(zhuǎn)換成二進(jìn)制編碼格式(BCD)顯示。
構(gòu)建和編程
一旦編碼階段完成,我們就進(jìn)入構(gòu)建和編程過(guò)程,在此過(guò)程中,設(shè)計(jì)被合成、實(shí)現(xiàn)并轉(zhuǎn)移到FPGA硬件。
步驟1:生成比特流
?在Vivado中,找到左側(cè)面板中的“構(gòu)建和調(diào)試”部分。
?點(diǎn)擊“生成比特流”來(lái)啟動(dòng)這個(gè)過(guò)程。
?如果出現(xiàn)提示,單擊“Yes”繼續(xù)。
該過(guò)程包括三個(gè)主要步驟:綜合:將SystemVerilog代碼轉(zhuǎn)換為門(mén)級(jí)表示。實(shí)現(xiàn):將邏輯映射到FPGA的物理資源上。比特流生成:創(chuàng)建將加載到FPGA上的最終二進(jìn)制文件。
此過(guò)程可能需要一些時(shí)間,具體取決于設(shè)計(jì)的復(fù)雜性和系統(tǒng)的性能。
步驟2:連接FPGA板
?一旦比特流成功生成,轉(zhuǎn)到“打開(kāi)硬件管理器”。
?現(xiàn)在,使用微型USB電纜將FPGA板連接到計(jì)算機(jī)。確保單板已上電。
?在硬件管理器中,點(diǎn)擊“自動(dòng)連接”。這將掃描連接的FPGA設(shè)備。將出現(xiàn)檢測(cè)到的硬件設(shè)備列表。
步驟3:FPGA編程
?在列表中找到您的FPGA設(shè)備。
?右鍵單擊設(shè)備,選擇“程序設(shè)備”。
?將出現(xiàn)一個(gè)對(duì)話框,確認(rèn)要使用的比特流文件(.bit)。
?點(diǎn)擊“Program”將設(shè)計(jì)加載到FPGA上。
該程序在FPGA中是臨時(shí)的,一旦電源被切斷,它就會(huì)回到工廠或以前燒毀的程序。如果您想將程序刻錄到FPGA中,則選擇“程序eFUSE寄存器”,這將刻錄程序,并且在電源周期后不會(huì)丟失。
布線
在這個(gè)項(xiàng)目中,我使用IO0到IO13引腳連接兩個(gè)七段LED顯示屏。這些引腳被分配來(lái)控制單個(gè)LED段。
連接七段顯示器
?根據(jù)您的設(shè)計(jì)將7段LED段連接到IO0-IO13。
?應(yīng)相應(yīng)地連接公共地(用于公共陰極顯示器)或公共電源(VCC)(用于公共陽(yáng)極顯示器)。
?確保顯示模塊的地與FPGA的地相連,完成電路。
自定義Pin分配
?可以根據(jù)項(xiàng)目需要更改這些pin分配。
?如果修改了pin分配,則必須相應(yīng)地更新約束文件(.xdc)以反映新的連接。
?驗(yàn)證七段顯示器與FPGA的I/O電壓水平的電壓兼容性(例如,3.3V邏輯用于Arty S7-25)。
連接X(jué)ADC電位器
?您可以使用任何通用的10K電位器作為模擬輸入設(shè)備。
?連接方式:一端接VCC (3.3V)。另一端到GND。中間(雨刷)引腳到XADC輸入引腳(VAUXP0/VAUXN0,如約束文件中定義)。
本文編譯自hackster.io