<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > FPGA開發(fā)板快速教程(二)

          FPGA開發(fā)板快速教程(二)

          作者: 時間:2017-06-06 來源:網(wǎng)絡(luò) 收藏
          第二章
          第一節(jié) 的基本開發(fā)流程

          器件(Programable Logic Device)的簡稱,是現(xiàn)場可編程門陣列(Field Programable Gate Array)的簡稱,兩者的功能基本相同,只是實現(xiàn)原理略有不同,所以我們有時可以忽略這兩者的區(qū)別,統(tǒng)稱為器件或/FPGA。

          是電子設(shè)計領(lǐng)域中最具活力和發(fā)展前途的一項技術(shù),它的影響絲毫不亞于70年代單片機的發(fā)明和使用。

          PLD能做什么呢?可以毫不夸張的講,PLD能完成任何數(shù)字器件的功能,上至高性能CPU,下至簡單的74電路,都可以用PLD來實現(xiàn)。PLD如同一張白紙或是一堆積木,工程師可以通過傳統(tǒng)的原理圖輸入法,或是硬件描述語言自由的設(shè)計一個數(shù)字系統(tǒng)。通過軟件仿真,我們可以事先驗證設(shè)計的正確性。在PCB完成以后,還可以利用PLD的在線修改能力,隨時修改設(shè)計而不必改動硬件電路。使用PLD來開發(fā)數(shù)字電路,可以大大縮短設(shè)計時間,減少PCB面積,提高系統(tǒng)的可靠性。 PLD的這些優(yōu)點使得PLD技術(shù)在90年代以后得到飛速的發(fā)展,同時也大大推動了EDA軟件和硬件描述語言(HDL)的進步。

          如何使用PLD呢?其實PLD的使用很簡單,學(xué)習(xí)PLD比學(xué)習(xí)單片機要簡單的多,有數(shù)字電路基礎(chǔ),會使用計算機,就可以進行PLD的開發(fā)?! ?

          開發(fā)PLD需要了解兩個部分:1.PLD開發(fā)軟件 2.PLD本身

          由于PLD軟件已經(jīng)發(fā)展的相當(dāng)完善,用戶甚至可以不用詳細了解PLD的內(nèi)部結(jié)構(gòu),也可以用自己熟悉的方法:如原理圖輸入或HDL語言來完成相當(dāng)優(yōu)秀的PLD設(shè)計。所以對初學(xué)者,首先應(yīng)了解PLD開發(fā)軟件和開發(fā)流程。了解PLD的內(nèi)部結(jié)構(gòu),將有助于提高我們設(shè)計的效率和可靠性。

          下面我們以基于Altera公司的QuantusII軟件來簡單說明一下FPGA的開發(fā)流程。

          下圖是一個典型的基于QuantusII的FPGA開發(fā)流程。

          本文引用地址:http://www.ex-cimer.com/article/201706/349480.htm(1)建立工程是每個開發(fā)過程的開始,QuantusII(以下簡稱Q2)以工程為單元對設(shè)計過程進行管理。

          (2)建立頂層圖??梢赃@樣理解,頂層圖是一個容器,將整個工程的各個模塊包容在里面,編譯的時候就將這些模塊整合在一起。也可以理解為它是一個大元件,包含各個模塊,編譯的時候就是生成一個這樣的大元件。

          (3)采用ALTERA公司提供的LPM功能模塊。Q2軟件環(huán)境里包含了大量的常用功能模塊,例如計數(shù)器、累加器、比較器、譯碼器等等;如果不懂得在工程中采用這些現(xiàn)有的功能模塊真是太浪費了。以本人的經(jīng)驗,一個設(shè)計中一般只有極少部分的模塊需要自己從零設(shè)計。

          (4)自己建立功能模塊。當(dāng)然,有些設(shè)計中現(xiàn)有的模塊功能不能滿足具體設(shè)計的要求,那就只能自己設(shè)計啦。可以用硬件描述語言也可以用原理圖的輸入方法??梢园阉鼈儶毩⒌禺?dāng)作一個工程來設(shè)計,并生成模塊符號(Symbol),然后在頂層圖中使用這個模塊的符號,并將源文件(實現(xiàn)該模塊的原理圖或HDL文件)拷到頂層圖所在的工程目錄下。這個過程好比你要做一個電路,現(xiàn)在市面上沒有你想要的某個芯片,你就只能自己做一塊這樣的一塊芯片,然后添加到你的電路板上。

          (5)將頂層圖的各個功能模塊用連線連起來。這個過程類似電路圖設(shè)計,把各個芯片連接起來,組成電路系統(tǒng)。

          (6)系統(tǒng)的功能原理圖至此已經(jīng)基本出爐了,下一步要為該設(shè)計選擇芯片載體,才能真正在物理上實現(xiàn)系統(tǒng)的功能。這一步的主要工作是:(1)選擇芯片型號;(2)為頂層圖的各個輸入輸出信號分配芯片的管腳;(3)設(shè)置編譯選項,目的是讓編譯器知道更多的信息。

          (7)編譯。這個過程類似軟件開發(fā)里的編譯,但實際上這個過程比軟件的編譯要復(fù)雜得多,因為它畢竟最終要實現(xiàn)硬件里的物理結(jié)構(gòu),包含了優(yōu)化邏輯的組合、綜合邏輯以及布線等步驟。在類似Q2這樣的集成環(huán)境里面,這些過程都可以一氣呵成,集成環(huán)境幫你自動完成了幾個步驟的工作。當(dāng)然,你也可以用其它工具來實現(xiàn)各個步驟的工作,這些內(nèi)容超出了本教程陳述的范圍。

          (8)編譯后會生成*.sof或*.pof文件,前者可以通過JTAG下載到FPGA內(nèi)部,設(shè)計無誤的話即能實現(xiàn)預(yù)期的功能,但斷電后FPGA里的這些信息會丟失;后者可以下載到FPGA的配置芯片(EEPROM或FLASH芯片),掉電后這些配置信息不會丟失,重新上電以后通過該配置芯片對FPGA的內(nèi)部RAM進行配置。

          (9)對于復(fù)雜的設(shè)計,工程編譯了以后可以采用Q2的仿真功能或其它仿真軟件(如ModelSim)對設(shè)計反復(fù)進行仿真和驗證,直到滿足要求。


          第二節(jié) 基于QuartusII的實例


          實驗一 實驗板上的KEY1按鈕控制FPGA核心板上的第一個LED燈。

          本實驗比較簡單,使用本站FPGA開發(fā)板或者CPLD開發(fā)板以及其它FPGA開發(fā)板都可進行實驗。

          目的:通過該實例學(xué)習(xí),可以了解FPGA的基本開發(fā)流程,熟識quartusII軟件基本功能的使用。

          原理:利用一個常開按鈕(實驗板上的KEY1)作為輸入(常開時輸入1,閉合時輸入0),經(jīng)過一個反相器后輸出到核心板的第一個LED。KEY1常開時,LED亮,按下(閉合)實驗板上的KEY1,該LED熄滅。

          1. 建立工程

          運行QuatrusII軟件(以下簡稱Q2),建立工程,F(xiàn)ileàNew Project Wizad如

          點擊New Project Wizard 后彈出指定工程名的對話框,在Diectory, Name, Top-Level Entity中如下圖填寫:

          按Next按鈕,出現(xiàn)添加工程文件的對話框:

          在這里我們先不用管它,直接按Next進行下一步,選擇FPGA器件的型號:

          在Family下拉筐中,我們選擇Cyclone系列FPGA,然后在“Available devices:”中根據(jù)核心板的FPGA型號選擇FPGA型號,注意在Filters一欄選上“Show Advanced Devices”以顯示所有的器件型號。執(zhí)行下一步出現(xiàn)對話框:


          這里是選擇其它EDA工具的對話框,我們用Q2的集成環(huán)境進行開發(fā),因此這里不作任何改動。按Next進入工程的信息總概對話框:

          按Finish按鈕即建立一個空項目。

          2. 建立頂層圖

          執(zhí)行FileàNew,彈出新建文件對話框:

          選擇“Block Diagram Schematic File”按OK即建立一個空的頂層圖,缺省名為“Block1.bdf”,我們把它另存為(FileàSave as),接受默認的文件名,并將“Add file to current project”選項選上,以使該文件添加到工程中去。如圖所示:


          3. 添加邏輯元件(Symbol)

          雙擊頂層圖圖紙的空白處,彈出添加元件的對話筐:

          在Libraries里尋找所需要的邏輯元件,如果知道邏輯元件的名稱的話,也可以直接在Name一欄敲入名字,右邊的預(yù)覽圖即可顯示元件的外觀,按OK后鼠標(biāo)旁邊即拖著一個元件符號,在圖紙上點擊左鍵,元件即安放在圖紙上。

          在圖紙上分別添加非門(not)、輸入(input)、輸出(output)三個symbol,如圖所示:

          連線,將鼠標(biāo)移到symbol連線端口的那里,鼠標(biāo)變成圖示模樣: ,按下左鍵拖動鼠標(biāo)到另一個symbol的連線端。本例中,這三個symbol的連線如下圖所示:


          分別雙擊input和output symbol的名字“pin_name”、“pin_name1”,將它們的名字改為Key1,LED1:

          4. 分配管腳

          為芯片分配管腳可以用QuartusII軟件里的“AssignmentsàPins”菜單,也可以用tcl腳本文件。用Tcl文件進行配置可重用性好,易于管理,因此本文介紹用tcl的方法。對于另一種方法,可以參考QuartusII軟件的幫助文檔。

          在工程目錄下建立一個name為Setup.tcl的file。FileàNew,選擇other files頁面:

          有關(guān)tcl文件的更詳盡內(nèi)容可參考QuartusII的幫助文檔,對于我們所選用的FPGA開發(fā)板SOPC開發(fā)板來說,由于不同型號的FPGA核心板的管腳與實驗板上的引腳也不同,因此不同的核心板對應(yīng)的.tcl文件也不同(關(guān)于核心板引腳與實驗板引腳對應(yīng)的詳細情況請參照“CT-SOPCx學(xué)習(xí)套件用戶手冊”或相關(guān)電路原理圖)。在實際項目中,該文件也可以根據(jù)具體管腳分配要求來改寫。

          對應(yīng)于EP1C6 FPGA開發(fā)板,EP1C12 FPGA開發(fā)板:

          #Setup.tcl

          # Setup pin setting

          set_global_assignment -name RESERVE_ALL_UNUSED_PINS AS INPUT TRI-STATED

          set_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF

          set_location_assignment PIN_1 -to led1

          set_location_assignment PIN_122 -to key1

          保存到工程目錄下,并注意在保存對話框選上“Add file to current project”選項。然后打開Tools -> Tcl Scripts,選中剛才編輯的Script文件:Setup,并點擊Run,如下圖:

          注意:建立工程時如果路徑名有中文字符或者路徑名有空格字符,則tcl Script文件將運行不了。比如,本例建立的工程“FPGA_led_test”目錄是: C:alteraquartus51myq2projectsFPGA_led_test

          如果是:

          C:alteraquartus51my q2projectsFPGA_led_test

          在該目錄下運行工程里的setup.tcl就會出錯。

          如果使用Tools -> Tcl Scripts 后沒有彈出“tcl Script”對話框可以試一下關(guān)了QII,再重新打開。使用TCL文件分配管腳是很方便的,用戶可以直接從相關(guān)例子工程中復(fù)制需要管腳分配表到自己的工程中,省時又方便。



          關(guān)鍵詞: 基本教程 PLD FPGA 可編程邏輯

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();