作者:郝旭帥??校對(duì):陸輝
大俠好,歡迎來(lái)到FPGA技術(shù)江湖,江湖偌大,相見(jiàn)即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。
大俠好,歡迎來(lái)到FPGA技術(shù)江湖。本次帶來(lái)FPGA系統(tǒng)性學(xué)習(xí)系列,今天開(kāi)始正式更新,之前更新過(guò)類似的郝旭帥FPGA零基礎(chǔ)學(xué)習(xí)系列,由于時(shí)間久遠(yuǎn),之前的系列所用開(kāi)發(fā)操作軟件、硬件設(shè)備及所涉及知識(shí)維度都有待更新及完善。
本系列將帶來(lái)FPGA的系統(tǒng)性學(xué)習(xí),從最基本的數(shù)字電路基礎(chǔ)開(kāi)始,最詳細(xì)操作步驟,最直白的言語(yǔ)描述,手把手的“傻瓜式”講解,讓電子、信息、通信類專業(yè)學(xué)生、初入職場(chǎng)小白及打算進(jìn)階提升的職業(yè)開(kāi)發(fā)者都可以有系統(tǒng)性學(xué)習(xí)的機(jī)會(huì)。
系統(tǒng)性的掌握技術(shù)開(kāi)發(fā)以及相關(guān)要求,對(duì)個(gè)人就業(yè)以及職業(yè)發(fā)展都有著潛在的幫助,希望對(duì)大家有所幫助。后續(xù)會(huì)陸續(xù)更新 Xilinx 的 Vivado、ISE 及相關(guān)操作軟件的開(kāi)發(fā)的相關(guān)內(nèi)容,學(xué)習(xí)FPGA設(shè)計(jì)方法及設(shè)計(jì)思想的同時(shí),實(shí)操結(jié)合各類操作軟件,會(huì)讓你在技術(shù)學(xué)習(xí)道路上無(wú)比的順暢,告別技術(shù)學(xué)習(xí)小BUG卡破腦殼,告別目前忽悠性的培訓(xùn)誘導(dǎo),真正的去學(xué)習(xí)去實(shí)戰(zhàn)應(yīng)用,這種快樂(lè)試試你就會(huì)懂的。話不多說(shuō),上貨。
本篇將設(shè)計(jì)一個(gè)簡(jiǎn)單的二輸入與門,來(lái)講解整個(gè)設(shè)計(jì)流程。至于設(shè)計(jì)語(yǔ)言就不在單獨(dú)列出一個(gè)章節(jié)去做特殊說(shuō)明,語(yǔ)法、操作、實(shí)驗(yàn)將同時(shí)講解,這樣更具有帶入性,便于讀者閱讀和學(xué)習(xí)。
1、設(shè)計(jì)前準(zhǔn)備
在設(shè)計(jì)之前我們需要在兩個(gè)方面進(jìn)行準(zhǔn)備:硬件方面和軟件方面。
硬件方面
開(kāi)發(fā)FPGA設(shè)計(jì),最終的產(chǎn)品是要落在使用FPGA芯片完成某種功能。所以我們首先需要一個(gè)帶有Intel FPGA芯片的開(kāi)發(fā)板。
本文中設(shè)計(jì)將采用CYCLONE系列FPGA進(jìn)行講解,如果讀者有其他系列(必須是Intel FPGA,否則無(wú)法在Quartus上開(kāi)發(fā)),也可以進(jìn)行學(xué)習(xí),不同系列的開(kāi)發(fā)流程基本相同。
軟件方面?
我們需要綜合工具-quartus 軟件和仿真工具-modelsim軟件。正確安裝這兩個(gè)軟件是開(kāi)發(fā)Intel FPGA的必要條件。
圖1 :Quartus 軟件圖標(biāo)
按照《quaruts prime 18.0標(biāo)準(zhǔn)版安裝與破解-郝旭帥團(tuán)隊(duì)V1》的方式安裝,Modelsim軟件的圖標(biāo)將不會(huì)出現(xiàn)在桌面上。并不是沒(méi)有安裝上,而是此時(shí)Quartus軟件認(rèn)為Modelsim軟件只是它的一個(gè)小程序包而已,所以就沒(méi)有體現(xiàn)單獨(dú)的軟件圖標(biāo)。
當(dāng)準(zhǔn)備好軟件后,筆者向大家推薦一個(gè)工程管理的方式,也是本文中做工程管理的方式,這樣會(huì)比較清楚。
做設(shè)計(jì)的話,會(huì)編寫很多設(shè)計(jì)文件、仿真文件以及綜合器會(huì)給我輸出很多的過(guò)程文件等等,那么這些文件最好都能有自己的一個(gè)“歸宿”,不要亂放。
路徑和命名中不允許出現(xiàn)非法字符(合法字符包括:數(shù)字、字母、下劃線。特別說(shuō)明:空格是非法的),筆者建議以字母開(kāi)頭。
我們是做FPGA開(kāi)發(fā)設(shè)計(jì)的,首先我們將建立一個(gè)文件夾,專門用來(lái)放FPGA開(kāi)發(fā)設(shè)計(jì)。例如:E:/fpga_design。
在后續(xù)的開(kāi)發(fā)設(shè)計(jì)中,我們會(huì)做各種各樣的設(shè)計(jì)。每個(gè)設(shè)計(jì)都有自己的名字,在上述文件內(nèi),用實(shí)驗(yàn)的名字命名一個(gè)文件夾。名字的話一定要帶有某種含義,不建議隨便給個(gè)字母序列當(dāng)做名字。例如:第一個(gè)要做的二輸入與門的設(shè)計(jì),命名為and_gate2_1。
在建立完某項(xiàng)設(shè)計(jì)的文件后,依次在其里面新建四個(gè)文件夾,分別為:rtl、qprj、msim、doc。
圖 2 :工程管理文件脈絡(luò)示意圖
rtl文件夾用于存放設(shè)計(jì)的源文件。
doc文件夾用于存放設(shè)計(jì)的一些文檔性的資料。
qprj文件夾用于存放quaruts 工程以及quartus生成的一些過(guò)程性文件。
msim文件夾用于存放仿真文件。
在 FPGA 設(shè)計(jì)時(shí),主要是這四個(gè)文件的使用。某些時(shí)候我們也會(huì)新加一些文件,例如:FPGA板卡需要我們?cè)O(shè)計(jì)自己時(shí),就會(huì)多一個(gè)文件夾PCB,用于存放PCB相關(guān)的工程或者源文件等。
2、建立工程
做好設(shè)計(jì)前準(zhǔn)備后,就可以開(kāi)始建立quartus 工程了。
在做設(shè)計(jì)時(shí),都是以工程為主體的設(shè)計(jì)。在沒(méi)有工程的情況下,利用quartus軟件打開(kāi)設(shè)計(jì)源文件等,也是不支持編譯和綜合的。
雙擊quartus 軟件的圖標(biāo)(圖4-1),打開(kāi)quartus軟件。在有的電腦上,軟件啟動(dòng)的速度不是很快(在確保自己已經(jīng)雙擊打開(kāi)的前提下,可以等待1分鐘),不要多次去雙擊圖標(biāo),容易造成PC卡死或者啟動(dòng)了很多個(gè)quartus軟件。
圖3 :quartus 18.0界面
筆者這里不對(duì)每個(gè)界面進(jìn)行單獨(dú)介紹,后續(xù)用到那個(gè)功能或者界面時(shí),會(huì)單獨(dú)介紹說(shuō)明。
點(diǎn)擊左上角File,選擇New Project Wizard…。
4 :打開(kāi)新工程創(chuàng)建向?qū)?/strong>
打開(kāi)新工程向?qū)?,首先出現(xiàn)一個(gè)工程向?qū)Ы榻B說(shuō)明。
圖5 :工程向?qū)У慕榻B界面
在工程向?qū)е?,我們?huì)指定工程名稱和位置,頂層實(shí)體的名稱,工程文件和庫(kù)文件,目標(biāo)器件,EDA工具。
在復(fù)雜設(shè)計(jì)時(shí),會(huì)將電路分成各個(gè)小模塊去做設(shè)計(jì),最終還需要一個(gè)大模塊將這些小模塊包括進(jìn)來(lái),對(duì)外呈現(xiàn)都是大模塊的接口。此時(shí),這個(gè)大模塊就是頂層實(shí)體(TOP level entity)。如果設(shè)計(jì)中只有一個(gè)模塊,那么這個(gè)模塊就是頂層實(shí)體。
點(diǎn)擊Next。
圖6 :指定工程位置、工程名稱和頂層實(shí)體的界面
將工程的位置指定到之前我們準(zhǔn)備好的文件夾(qprj)中。點(diǎn)擊編輯框后面的三個(gè)小點(diǎn),進(jìn)行文件搜索指定。
工程的名稱就是采用之前我們做的設(shè)計(jì)文件夾的名字,這個(gè)名字可以是任意的,筆者建議和文件夾保持一致,因?yàn)楫?dāng)初建立文件夾時(shí),就是選擇用工程的名字。直接輸入工程名稱and_gate2_1即可。
頂層實(shí)體的名字會(huì)自動(dòng)出現(xiàn),與工程的名字保持一致。我們也可以重新指定一個(gè)新名字,筆者建議與工程名字保持一致。
點(diǎn)擊Next。
圖7 :選擇建立的工程的類型
選擇空白工程(默認(rèn)空白工程),點(diǎn)擊Next。
圖8 :添加文件
建立工程時(shí),我們可以直接向工程中添加已有的文件。一般我們選擇什么都不添加,后續(xù)設(shè)計(jì)中,如果有提前做好的文件,也是選擇什么都不添加。建立完工程后,依然可以向工程添加文件。
點(diǎn)擊Next。
圖9 :選擇目標(biāo)器件
FPGA設(shè)計(jì)最終是要落實(shí)到芯片內(nèi)部,在這里要選擇對(duì)應(yīng)的芯片(自己手里開(kāi)發(fā)板的FPGA芯片)。芯片的型號(hào)在FPAG的芯片上有描述,如果芯片上看不清楚,或者芯片在被其他東西擋住,可以查看開(kāi)發(fā)板的資料,一般都有介紹。筆者手中開(kāi)發(fā)板的FPGA的型號(hào)為EP4CE10F17C8N。后續(xù)所有的選擇將按照筆者手中的型號(hào)進(jìn)行設(shè)計(jì)和選擇,讀者不相同的,請(qǐng)自行改動(dòng)。如果暫時(shí)還沒(méi)有開(kāi)發(fā)板的讀者,可以跟著筆者選擇繼續(xù)下面的步驟(沒(méi)有開(kāi)發(fā)板的話,后面有一些步驟是做不了的)。
選擇時(shí),首先選擇對(duì)應(yīng)的系列。
圖10 :選擇芯片所對(duì)應(yīng)的系列
選擇對(duì)應(yīng)的系列后,可以看到下面的器件列表(此列表的窗口是可以拉大的,可以直接擴(kuò)大整個(gè)界面)中,就出現(xiàn)很多的器件。呈現(xiàn)的器件都是按照一定的規(guī)律進(jìn)行排列的,可以很快的找到自己的芯片,然后單擊選擇芯片(先不考慮為什么沒(méi)有EP4CE10F17C8N,而選擇EP4CE10F17C8)。
圖11 :器件列表
如果每次新建工程都是這樣去尋找芯片的話,是有一定的累人。好在這個(gè)軟件給我們提供了篩選面板,我們可以把篩選條件輸入進(jìn)去。
圖12 :器件篩選
? ?設(shè)置好篩選條件后,器件列表中就只有四個(gè)器件了,很容易就可以找到我們這款芯片。
篩選條件中有封裝類型、管腳數(shù)目和速度等級(jí)。那么我們?cè)趺粗雷约菏种械男酒倪@些信息呢?
答案都隱藏在芯片的名字中。筆者手中的是CYCLONE IV系列的片子,下面就介紹一下這個(gè)系列的命名方式。
圖13 :CYCLONE IV E系列命名規(guī)則
如果是其他系列,請(qǐng)自行參考所對(duì)應(yīng)的芯片手冊(cè)。
通過(guò)觀察圖4-13,EP4CE10F17C8N中末位N,只是表示無(wú)鉛封裝,和具體內(nèi)部機(jī)構(gòu)沒(méi)有任何關(guān)系。故而選擇不帶N的,也是可以的。
注意無(wú)論是哪種方法,最后找到自己想要的芯片后,一定要點(diǎn)擊它,選中它。
點(diǎn)擊Next。
圖14 :選擇EDA工具
Quartus軟件是一個(gè)綜合工具,他可以關(guān)聯(lián)一些其他的工具協(xié)助設(shè)計(jì)FPGA。在這里我們?cè)趕imulation一欄,工具選擇modelsim-altera,格式選擇verilog HDL。其他保持默認(rèn)。
點(diǎn)擊Next。
圖15 :工程向?qū)渲每偨Y(jié)
這個(gè)總結(jié)顯示出在新工程向?qū)е校覀兯龅乃械脑O(shè)置。大家可以檢查一下,如果發(fā)現(xiàn)那一項(xiàng)和自己的要求不一致,就需要點(diǎn)擊back,修改后,在回到此步驟。
點(diǎn)擊Finsh,完成工程創(chuàng)建。
圖16 :工程建立完成后,工程向?qū)Ы缑?/strong>
工程建立完成后,工程向?qū)Ы缑骘@示出選擇的器件和指定的頂層實(shí)體。
打開(kāi)qprj文件夾。
圖17 :建立完工程后的qprj文件夾
db文件夾為基礎(chǔ)數(shù)據(jù)文件夾。
.qpf為quartus project file,quartus 工程文件。如果此時(shí)將quatus關(guān)閉了,雙擊此文件就可以打開(kāi)工程。
.qsf為quartus settings file,quartus 設(shè)置文件。在quaruts里面做的大部分操作都會(huì)記錄到此文件中。
Quarus 的版本很多,如果用一個(gè)版本建立的工程,用另外一個(gè)版本打開(kāi)可能會(huì)出一些bug,所以建議采用使用已建好工程的版本打開(kāi)??梢允褂糜浭卤镜姆绞酱蜷_(kāi).qsf。
圖18 :qsf文件的一部分
通過(guò)查看.qsf文件,可以了解到工程的最初用什么版本建立,最后用什么版本打開(kāi)(打開(kāi)時(shí),建議采用最后的版本打開(kāi))。
打開(kāi)工程的方式,不建議采用雙擊.qpf文件。有時(shí)間一個(gè)PC上面,會(huì)有多個(gè)quaruts軟件的情況,如果直接雙擊,就會(huì)采用某一個(gè)版本打開(kāi),這不一定是我們想要的。
建議打開(kāi)工程的方式,首先查看應(yīng)該選擇的版本,啟動(dòng)對(duì)應(yīng)的版本quartus軟件,點(diǎn)擊File,選擇Open project(不要點(diǎn)擊Open),找到工程,啟動(dòng)。
圖19 :打開(kāi)工程的途徑
3輸入設(shè)計(jì)
當(dāng)建立完工程后,就可以輸入設(shè)計(jì)。輸入設(shè)計(jì)的方法有三種:原理圖輸入、HDL代碼輸入、原理圖和HDL代碼混入輸入。
原理圖輸入
原理圖輸入就是以現(xiàn)有模塊級(jí)聯(lián)的方式實(shí)現(xiàn)功能。
點(diǎn)擊File,選擇New。
圖20 :新建模塊
?選擇design file中的Block Diagram/Schematic File。點(diǎn)擊ok。
圖21 :新建文件列表
對(duì)于新建的bdf文件立刻進(jìn)行另存為。
圖22 :另存為
另存為到qprj文件夾。Bdf文件是只有quartus軟件才能認(rèn)可,不具有移植性,把它放到工程文件夾中。
圖23 :保存路徑和名稱
點(diǎn)擊保存。特別注意保存路徑和保存名稱。不要盲目直接點(diǎn)擊保存,一定要再三確認(rèn)。
在BDF文件的空白位置,雙擊,打開(kāi)添加原件的窗口。
圖24 :打開(kāi)添加原件的窗口
在libraries中,選擇and2,點(diǎn)擊ok。
圖25 :添加二輸入與門
鼠標(biāo)會(huì)拖動(dòng)一個(gè)二輸入與門的符號(hào),此時(shí)點(diǎn)擊鼠標(biāo)左鍵,一個(gè)二輸入的與門就放置在文件中了。
圖26 :放置的二輸入與門
當(dāng)添加完二輸入與門后,也就意味著芯片內(nèi)部的設(shè)計(jì)完成?,F(xiàn)在需要將內(nèi)部設(shè)計(jì)與外部相連接。芯片與外界相連接靠的是IO。
雙擊空白處,選擇input(輸入),點(diǎn)擊ok。添加輸入IO。
圖27 :添加input管腳
二輸入與門,要有兩個(gè)輸入。同樣的方法,再次添加一個(gè)。同時(shí)也要有一個(gè)輸出,選擇output(輸出)(在input下面),添加一個(gè)輸出。
圖28 :添加兩個(gè)輸入和一個(gè)輸出
將管腳和二輸入與門進(jìn)行相連接。
把鼠標(biāo)移至需要連接線的地方時(shí),鼠標(biāo)會(huì)自動(dòng)變?yōu)槭譅睿ú皇鞘譅罴^),并且右下帶有一個(gè)“7”形的導(dǎo)管。然后按住鼠標(biāo)左鍵進(jìn)行導(dǎo)線的引出。當(dāng)連接到另外一個(gè)接口時(shí),
就會(huì)出現(xiàn)一個(gè)小方框,證明已經(jīng)連接上,此時(shí)釋放鼠標(biāo)左鍵即可。
圖29 :連接完成圖樣
此時(shí)默認(rèn)兩個(gè)輸入的管腳的名字為pin_name1和pin_name2。在設(shè)計(jì)時(shí),二輸入與門我們將其輸入命名為一個(gè)為A,一個(gè)為B,輸出為Y。
右擊pin_name1,選擇properties。
圖30 :選擇屬性
將pin name改為A。點(diǎn)擊ok。
圖31 :修改管腳名稱
將其他兩個(gè)管腳也做對(duì)應(yīng)修改。
圖32 :修改完管腳名稱的圖樣
此時(shí)點(diǎn)擊保存(ctrl + s),使用原理圖的輸入方式就完成了。
HDL代碼輸入
用計(jì)算機(jī)語(yǔ)言設(shè)計(jì)一個(gè)數(shù)字電路系統(tǒng),其實(shí)質(zhì)就是用一種語(yǔ)言描述一個(gè)硬件模型,因此這樣的語(yǔ)言又稱為硬件描述語(yǔ)言(Hardware Description Language),或使用縮寫HDL。雖然現(xiàn)在HDL已經(jīng)有多種語(yǔ)言版本,而且還在發(fā)展中。但是在本書討論的HDL僅包括現(xiàn)在最常使用的Verilog HDL和VHDL兩種語(yǔ)言系統(tǒng)。
目前在國(guó)內(nèi)做FPGA設(shè)計(jì)的公司中,使用Verilog HDL占據(jù)大多數(shù),故而本書以Verilog HDL為主,在后續(xù)的章節(jié)中,專門設(shè)置一章來(lái)講解VHDL。
選擇File,New,選擇design file中的verilog HDL file。點(diǎn)擊ok。
圖33 :新建verilog HDL file
新建完成后,立刻另存為,保存到rtl中。hdl文件的移植性比較高,無(wú)論在哪個(gè)平臺(tái)都是通用的。
圖34 :保存verilog HDL文件
保存時(shí),注意名字和保存路徑。Verilog文件的后綴為.v。
建立完,verilog HDL文件后,就需要輸入二輸入與門所對(duì)應(yīng)的verilog代碼了。
Verilog 語(yǔ)法和C很相似,學(xué)習(xí)起來(lái)比較容易。下面我們按照做電路的方式講解verilog語(yǔ)言。
做電路的話,首先需要拿出一塊打的面包板,剪出合適大小的一塊。相當(dāng)于圈了一個(gè)地方,做設(shè)計(jì)只能在這塊區(qū)域內(nèi)。
對(duì)于verilog語(yǔ)言來(lái)說(shuō),需要用module和endmodule圈出一個(gè)區(qū)域,設(shè)計(jì)代碼只能在這塊區(qū)域中。Verilog語(yǔ)言區(qū)分大小寫,我們一律采用小寫。module和endmodule是verilog的關(guān)鍵字,在綜合器中會(huì)變藍(lán)。如果endmodule沒(méi)有變藍(lán),請(qǐng)多打一個(gè)回車或者空格。
圖35 :verilog第一步
當(dāng)剪出合適大小的面包板后,需要其上面寫一個(gè)名字。后面應(yīng)用也好,說(shuō)起來(lái)也好,好歹有個(gè)名字。
在verilog中,也需要有一個(gè)module name。
在verilog中命名的話,需要遵從一定的規(guī)則。由字母、數(shù)字、下劃線構(gòu)成;建議字母開(kāi)頭;不能夠與verilog的關(guān)鍵字相同;命名是要有一定的意義。
對(duì)于module name來(lái)說(shuō),一般還有一個(gè)要求,與文件名稱保持一致。那么此時(shí)我們要做二輸入與門,文件名稱是and_gate2_1。要求module name也寫成and_gate2_1。
圖36 :verilog第二步
當(dāng)對(duì)面包板命名后,需要給它添加輸入和輸出的端口(合理的布局接口)。
二輸入與門有兩個(gè)輸入,一個(gè)為A,另外一個(gè)為B;一個(gè)輸出為Y。在verilog中,布置接口的方式有兩種。
圖37 :布置接口的第一種方式
圖38 :布置接口的第二種方式
在verilog中,module name(and_gate2_1)之后的那個(gè)括號(hào)中的內(nèi)容成為端口列表。
Verilog布置接口的第一種方式為1995標(biāo)準(zhǔn),第二種方式為2003標(biāo)準(zhǔn)。目前大多數(shù)平臺(tái)都可以支持這兩種方式。筆者建議用2003標(biāo)準(zhǔn)。
端口列表中,描述端口時(shí),用逗號(hào)隔開(kāi),最后一個(gè)端口后面不加逗號(hào)。在端口列表的括號(hào)后面有一個(gè)分號(hào)。
對(duì)于描述端口來(lái)說(shuō),有最基本的四項(xiàng):方向、類型、位寬、名稱。
input表示輸入,output表示輸出,inout表示輸入輸出。
類型中比較常用的有兩種:一種是wire,另外一種reg。wire類型時(shí),wire可以省略不寫。另外input必須是wire類型。筆者建議wire不省略,都寫上。
在做電路時(shí),位寬表示有幾根線。有時(shí)候?yàn)榱朔奖悖瑫?huì)將同一種類的線進(jìn)行同時(shí)命名,此時(shí)就需要用到位寬。例如:5位的地址線??梢詥为?dú)命名5次,但是比較麻煩。位寬用中括號(hào)括起來(lái),例:[3:0],[3:1],[2:5]。如果位寬為1的話,省略不寫。筆者建議位寬的右側(cè)為0,左側(cè)為位寬減一。
名稱就是為這個(gè)輸入命名了一個(gè)名字。命名時(shí)要遵從verilog命名規(guī)則。
在做完端口后,需要在面包板上做出符合功能的設(shè)計(jì),然后用連接線將設(shè)計(jì)和輸入輸出管腳相連接。
二輸入與門的設(shè)計(jì)是需要在中間放一個(gè)組合邏輯電路二輸入與門。
Verilog中,描述組合邏輯的第一種方式是利用assign語(yǔ)句進(jìn)行描述。
圖39 :assign語(yǔ)句描述二輸入與門
assign語(yǔ)句要求被賦值變量(Y)為wire類型,中間采用阻塞賦值(=)的方式,最后面是賦值表達(dá)式,在verilog中,算術(shù)與用&來(lái)表示(后續(xù)介紹算術(shù)運(yùn)算和邏輯運(yùn)算的區(qū)別)。
至此,二輸入與門的HDL輸入就完成了。
原理圖和HDL代碼混入輸入
在復(fù)雜設(shè)計(jì)時(shí),我們可以用HDL代碼生成底層模塊,用原理圖的方式,將底層模塊進(jìn)行連接。此方式在后續(xù)的章節(jié)中介紹。
4、綜合和分析
當(dāng)設(shè)計(jì)輸入完成后,需要對(duì)設(shè)計(jì)進(jìn)行綜合分析,同時(shí)也檢查一下其中是否存在錯(cuò)誤??梢詥螕艟C合分析按鈕,可以雙擊綜合分析選項(xiàng),也可以利用快捷鍵(Ctrl + K)。
圖40 :綜合分析按鈕
圖41 :綜合分析選項(xiàng)
進(jìn)行綜合分析時(shí),有時(shí)會(huì)提出一個(gè)提示:
圖42 :某文件被改變,是否要保存
出現(xiàn)上述提示,就證明我們?cè)谠O(shè)計(jì)時(shí),修改了某些文件后,沒(méi)有點(diǎn)擊保存。此時(shí)點(diǎn)擊Yes即可。但是這是一個(gè)非常不好的習(xí)慣,建議大家修改完任何設(shè)計(jì)都要及時(shí)保存。
圖43 :Task的綜合分析前面的進(jìn)度條和后面的已用時(shí)間
經(jīng)過(guò)一段時(shí)間后,會(huì)出現(xiàn)錯(cuò)誤。
圖44 :出現(xiàn)錯(cuò)誤
出現(xiàn)錯(cuò)誤后,可以觀察quartus 的下部massage窗口。
圖45 :massages窗口報(bào)錯(cuò)信息
報(bào)錯(cuò)信息為:錯(cuò)誤(12049):無(wú)法將實(shí)體“and_gate2_1”的重復(fù)聲明編譯到庫(kù)“work”中。報(bào)錯(cuò)的原因是我們?cè)诒竟こ讨新暶髁硕鄠€(gè)and_gate2_1,在電路中是不允許出現(xiàn)多個(gè)電路模塊是同樣的名字。
在設(shè)計(jì)時(shí),為了演示原理圖輸入和HDL代碼輸入,工程中存在原理圖輸入的and_gate2_1和HDL代碼輸入的and_gate2_1。
在工程向?qū)Ы缑?,選擇Hierarchy,選擇Files。Hierarchy為結(jié)構(gòu),顯示工程的電路模塊的結(jié)構(gòu);Files為文件,顯示工程中存放的所有文件??梢岳么朔绞讲榭矗こ讨惺欠翊嬖诙鄠€(gè)and_gate2_1。
圖46 :選擇Files界面
在Files界面中,可以發(fā)現(xiàn)工程中確實(shí)存在兩個(gè)and_gate2_1。
圖47 :Files界面
此時(shí)右鍵選擇第and_gate2_1.v,選擇Remove file from project。
圖48 :選擇移除
隨后在確定界面點(diǎn)擊Yes。
圖49 :確認(rèn)移除
將其移除工程后,就會(huì)只剩下一個(gè)原理圖輸入的and_gate2_1。然后進(jìn)行綜合分析,等待結(jié)果完成。
圖50 :綜合分析成功
如果中間有錯(cuò)誤的話,請(qǐng)參考輸入設(shè)計(jì)中的原理圖輸入,查看自己的步驟是否正確。
再一次選擇到Files界面,將and_gate2_1.bdf移除。將HDL代碼輸入的and_gate2_1.v
重新添加回來(lái)。在Files上右鍵,選擇Add/Remove Files in project(添加或移除文件)。
圖51 :從工程中添加或移除文件
選擇編輯框后面三個(gè)點(diǎn)。
圖52 :尋找添加文件
找到and_gate2_1.v,選中,點(diǎn)擊打開(kāi)。
圖53 :添加選中文件
注意添加文件的路徑,and_gate2_1.v是存放在rtl文件夾中。
然后點(diǎn)擊apply,OK。就添加成功。
圖54 :確認(rèn)添加文件
點(diǎn)擊綜合分析,確認(rèn)綜合分析成功。如果綜合分析失敗,請(qǐng)參考輸入設(shè)計(jì)中的HDL輸入,查找錯(cuò)誤的地方。
無(wú)論是哪一種輸入方式,綜合分析成功。雙擊RTL視圖選項(xiàng),打開(kāi)RTL視圖,查看quartus綜合出的電路模型。
圖55 :RTL視圖的選項(xiàng)
在RTL視圖中,綜合出來(lái)的電路圖,只是電路模型而已。在FPGA中是沒(méi)有與門的,有的只是LUT等效的二輸入與門電路。
圖56 :RTL視圖的二輸入與門
綜合分析成功后,會(huì)產(chǎn)生一個(gè)報(bào)告。
圖57 :綜合分析報(bào)告
在報(bào)告中,可以看出綜合狀態(tài)、軟件信息、工程版本信息、頂層實(shí)體、器件系列、目標(biāo)器件、時(shí)序模型、邏輯單元數(shù)量、寄存器數(shù)量、管腳數(shù)量、虛擬管腳數(shù)量、存儲(chǔ)器大小、嵌入式乘法器的使用個(gè)數(shù)、鎖相環(huán)使用個(gè)數(shù)。
只是設(shè)計(jì)了一個(gè)二輸入的與門,所以使用一個(gè)邏輯單元,3個(gè)管腳,其他都沒(méi)有涉及到。
5、RTL仿真??
在綜合分析完成后,對(duì)于簡(jiǎn)單的設(shè)計(jì),通過(guò)查看RTL視圖中綜合出來(lái)的電路模型,就能夠知道所做設(shè)計(jì)是否正確。但是對(duì)于復(fù)雜的設(shè)計(jì),電路模型比較復(fù)雜,無(wú)法直接判斷是否設(shè)計(jì)正確。
如果直接將不知道正確與否的設(shè)計(jì)加載到板卡中,很多時(shí)候無(wú)法通過(guò)結(jié)果直接看出來(lái)是否設(shè)計(jì)比較嚴(yán)謹(jǐn)。所以要求設(shè)計(jì)者在軟件環(huán)境下對(duì)所做設(shè)計(jì)進(jìn)行一定的測(cè)試。
仿真是利用模型復(fù)現(xiàn)實(shí)際系統(tǒng)中發(fā)生的本質(zhì)過(guò)程,并通過(guò)對(duì)系統(tǒng)模型的實(shí)驗(yàn)來(lái)研究存在的或設(shè)計(jì)中的系統(tǒng)。
當(dāng)所研究的系統(tǒng)造價(jià)昂貴、實(shí)驗(yàn)的危害性大或需要很長(zhǎng)的時(shí)間才能了解系統(tǒng)參數(shù)變化所引起的后果時(shí),仿真是一種特別有效的研究手段。
仿真其實(shí)就是模擬實(shí)際情況。對(duì)于電路來(lái)說(shuō),就是給予合適的輸入,觀測(cè)輸出是否和設(shè)計(jì)時(shí)所預(yù)想的相同。
圖58 :仿真的示意圖
電路的輸入、中間過(guò)程和輸出,都是數(shù)字信號(hào),用波形來(lái)表示比較直觀。
在真正的電路中,是存在電路延遲的。在仿真時(shí),如果加載的綜合出來(lái)的電路模型,那么此時(shí)驗(yàn)證的內(nèi)容主要是測(cè)試模型的邏輯功能是否正確,不考慮延時(shí)信息。這種仿真被稱為功能仿真、RTL仿真、前仿真、前仿。
仿真的途徑有兩個(gè),一個(gè)是quaruts 自帶的仿真環(huán)境,一個(gè)是modelsim的仿真環(huán)境。
Quartus 自帶的仿真環(huán)境
點(diǎn)擊File,New,選擇Uiversity Program VWF。
圖59 :新建VWF文件
點(diǎn)擊OK。
圖60 :VWF初始化界面
在“空白位置”雙擊。
圖61 :插入節(jié)點(diǎn)或者總線
點(diǎn)擊“節(jié)點(diǎn)查找”。
圖62 :節(jié)點(diǎn)查找
點(diǎn)擊“l(fā)ist”。在“filter”中,默認(rèn)選擇的是“Pins:all”,當(dāng)點(diǎn)擊“List”后,“Nodes Found”的界面中會(huì)出現(xiàn)所有的端口。
圖63 :查找需要激勵(lì)和觀測(cè)的信號(hào)
選中所有的端口,點(diǎn)擊“>>”,全部添加到“Selected Nodes”中。
圖64 :選擇觀測(cè)和激勵(lì)信號(hào)
點(diǎn)擊“OK”。
圖65 :確定選擇的信號(hào)
點(diǎn)擊“OK”。
圖66 :選擇信號(hào)完成
A端口和B端口是二輸入與門的兩個(gè)輸入,只要給A、B兩個(gè)端口加載上合適的信號(hào),觀測(cè)Y端口的輸出是否正確即可。
A端口和B端口一共只有四種情況“00”、“01”、“10”和“11”,只要將四種情況全部加載一遍即可。
利用鼠標(biāo)左鍵,選中A端口信號(hào)一段或者B端口信號(hào)一段,利用上方的置1或者置0按鈕,將輸入信號(hào)做成下圖所示:
圖67 :設(shè)置輸入信號(hào)
設(shè)置好輸入信號(hào)后,點(diǎn)擊保存,將其保存到qprj文件中。雖然其為仿真文件,但是此文件依然只是quartus軟件能識(shí)別,可移植性太差。
點(diǎn)擊Simulation -> Run Functional Simulation(運(yùn)行功能仿真)。
圖68 :選擇運(yùn)行功能仿真
經(jīng)過(guò)一段時(shí)間的運(yùn)行。
圖69 :運(yùn)行功能仿真的過(guò)程
在運(yùn)行中,如果有報(bào)錯(cuò),請(qǐng)認(rèn)真回顧上述步驟。
圖70 :功能仿真結(jié)果圖
通過(guò)分析上述結(jié)果圖,容易得出結(jié)論:AB“00” –?> ?Y“0”, AB“01” –?> ?Y“0”, AB“10” –?> ?Y“0”, AB“11” –?> ?Y“1”。通過(guò)波形的圖的分析,二輸入與門的功能仿真是沒(méi)有任何問(wèn)題的。
利用quartus 自帶的仿真器,可以支持原理圖輸入和HDL代碼輸入;可移植性不強(qiáng);對(duì)于一些復(fù)雜的輸入信號(hào),利用這種驅(qū)動(dòng)方式較為復(fù)雜;在企業(yè)設(shè)計(jì)研發(fā)中,很少有人會(huì)用這個(gè)工具。
利用modelsim仿真
Mentor公司的ModelSim是業(yè)界最優(yōu)秀的HDL語(yǔ)言仿真軟件,它能提供友好的仿真環(huán)境,是業(yè)界唯一的單內(nèi)核支持VHDL和Verilog混合仿真的仿真器。
利用quaruts 自帶的仿真器仿真時(shí),是利用繪制波形的方式進(jìn)行輸入信號(hào)的驅(qū)動(dòng)。但是這種方法移植性不好,無(wú)法在modelsim中充當(dāng)激勵(lì)。
在開(kāi)發(fā)中用的比較多的方式是利用HDL的方式進(jìn)行充當(dāng)激勵(lì),modelsim軟件會(huì)自動(dòng)抓取HDL代碼中的信號(hào)進(jìn)行繪制波形,用于設(shè)計(jì)者的觀測(cè)。
Modelsim的軟件無(wú)法為原理圖的輸入方式進(jìn)行仿真,所以要將HDL代碼輸入的方式添加到工程,將原理圖輸入的方式移除工程。在企業(yè)工程開(kāi)發(fā)時(shí),不建議使用原理圖的方式輸入,移植性太低。所以在后續(xù)的章節(jié)中,將全部采用代碼的輸入方式進(jìn)行設(shè)計(jì)。
新建一個(gè)verilog文件,命名為and_gate2_1_tb,保存到msim中。這個(gè)verilog文件是當(dāng)做測(cè)試文件的,命名時(shí),建議名字設(shè)置成為被測(cè)試模塊的名字,然后后面加上“_tb”。tb為testbench的簡(jiǎn)寫。
圖71 :and_gate2_1_tb代碼
`timescale是verilog中定義時(shí)間標(biāo)度的關(guān)鍵字。1ns/1ps中的1ns表示時(shí)間的單位,在veirlog中不支持直接寫出單位,例:5 ns,ns等時(shí)間單位是不被識(shí)別的。當(dāng)定義了1ns為時(shí)間單位后,表示時(shí)間時(shí),可以直接寫出,例:表示10ns時(shí),可以直接寫10即可。1ns/1ps中的1ps表示時(shí)間的精度,由于精度的存在我們可以寫小數(shù)。例:表示5.5ns時(shí),可以直接寫5.5。但是也正是由于精度的存在,小數(shù)不能無(wú)限制向下描述。例:表示5.523ns時(shí),可以成5.523,如果表示5.258963ns,那目前的精度是到不了這么精確的。精度是1ps,因此小數(shù)的位數(shù)最多能有三位。在設(shè)計(jì)中,很少用到比ps還要精確的單位,所以一般的時(shí)間標(biāo)度都是1ns/1ps。
Testbench文件也是verilog文件,所以也必須遵從verilog的標(biāo)準(zhǔn)。
在tb文件中,是沒(méi)有端口的。在測(cè)試時(shí),輸入的信號(hào)都由內(nèi)部產(chǎn)生,輸出信號(hào)只要引出到內(nèi)部即可,仿真器會(huì)自動(dòng)捕獲。所以tb的模塊是沒(méi)有端口的。
在測(cè)試文件中,需要將被測(cè)試元件例化進(jìn)來(lái)。例化的方式如下:
圖72 :例化方式
在例化時(shí),首先是模塊名稱(and_gate2_1),后面是例化名稱,這個(gè)名字可以任意名字,筆者建議例化名稱要和模塊名稱有一定的關(guān)系,筆者采用模塊名稱后加上_inst,表示例化的意思。后面的括號(hào)是端口列表,每一個(gè)端口的前面加上一個(gè)“.”,后面加上一個(gè)“()”,此時(shí)表示這個(gè)端口可以連接線了,連接線放到“()”里面就是連接上了。
對(duì)于連接線來(lái)說(shuō),命名也是任意的,筆者建議連接線的名字和要連接的端口的名字要有一定的關(guān)系,筆者采用端口名字前面加tb_,表示tb中的連接線。
所有的連接線都需要提前定義。在定義時(shí),都可以采用“wire”類型(后續(xù)會(huì)有更改)。
當(dāng)例化完成,連接線定義和連接完成后,就需要開(kāi)始測(cè)試了。而測(cè)試就是給模塊的輸入賦值,觀測(cè)輸出是否正確。
在測(cè)試時(shí),我們需要順序性的給出激勵(lì),verilog提供了一種比較簡(jiǎn)單的方式“initial”語(yǔ)句。在這個(gè)語(yǔ)句中,我們只需要順序性的給出激勵(lì)就可以了?!?”表示延時(shí),延時(shí)在verilog中是不可綜合的,但是在仿真中,是存在的。
“1’b0”中的1表示位寬為1,’b表示后面的數(shù)碼為2進(jìn)制,0表示數(shù)碼為0。
在賦值時(shí),建議采用位寬+進(jìn)制+數(shù)碼的方式進(jìn)行賦值。
Verilog中,begin end表示中間的語(yǔ)句是一個(gè)整體,verilog和C類似,每一個(gè)函數(shù)或者語(yǔ)句下只能包含一個(gè)語(yǔ)句塊。C語(yǔ)言中采用大括號(hào),verilog中采用begin end。
上述的initial語(yǔ)句塊中,描述了tb_A和tb_B被先賦值00,延遲20ns,被賦值為01,延遲20ns,被賦值為10,延遲20ns,被賦值為11。
Verilog語(yǔ)法規(guī)定,在initial語(yǔ)句中被賦值的變量,應(yīng)該定義為reg類型。
圖73 :定義變量(連接線)
在寫完testbench后,可以綜合分析一下。保證沒(méi)有任何的語(yǔ)法錯(cuò)誤。
在仿真之前,需要指定仿真文件。
選擇assignments -> settings。
圖74 :選擇settings
選擇simulation。
圖75 :選擇simulation
選擇compile test bench 后,選擇后面的test benches…。
圖76 :選擇test benches
選擇New,新建一個(gè)test bench。
圖77 :新建test bench
在test bench name的對(duì)話框中輸入:and_gate2_1_tb。默認(rèn)模塊中的頂層實(shí)體也是相同的。
圖78 :輸入testbench名字
點(diǎn)擊file name后面的三個(gè)點(diǎn),尋找and_gate2_1_tb文件。
圖79 :查找testbench文件
找到msim文件夾中的and_gate2_1_tb,選中后,點(diǎn)擊open。
圖80 :確定testbench文件
點(diǎn)擊ADD。
圖81 :添加testbench
添加成功后,點(diǎn)擊ok。
圖82 :添加成功
點(diǎn)擊ok。
圖83 :新建成功一個(gè)testbench
點(diǎn)擊OK。
圖84 :設(shè)置完成
在設(shè)置完成后,進(jìn)行綜合和分析。
綜合和分析完成后,點(diǎn)擊tools ?-> Run Simulation -> RTL Simulation。
圖85 :進(jìn)行RTL 仿真
稍微等一段時(shí)間,modelsim軟件會(huì)自動(dòng)啟動(dòng)。如果沒(méi)有啟動(dòng)的話,并且報(bào)錯(cuò)的話,請(qǐng)查看modelsim的關(guān)聯(lián)位置。
圖86 :無(wú)法連接到modelsim軟件
點(diǎn)擊tools 中的options。選擇EDA Toos options。
圖87 :配置關(guān)聯(lián)路徑
在modelsim-Altera中,看看路徑是否正確(這是筆者的安裝路徑,請(qǐng)自行查看自己的安裝路徑),注意最后那個(gè)“”,很多的系統(tǒng)中,沒(méi)有它也是不對(duì)的。
配置完成后,點(diǎn)擊ok。
重新點(diǎn)擊RTL 仿真。
圖88 :modelsim的基本界面
在wave界面中,點(diǎn)擊一下鼠標(biāo)左鍵,就會(huì)出現(xiàn)一個(gè)黃色的光標(biāo)。
點(diǎn)擊“全局縮放”。
圖89 :放大縮小的圖標(biāo)
在全局縮放前面一個(gè)為縮小,后面一個(gè)為放大。兩頭的兩個(gè)圖標(biāo),暫時(shí)不考慮。
全局縮放后,所有的波形都顯示到wave窗口中,經(jīng)過(guò)分析,設(shè)計(jì)正確。
此時(shí)就可以關(guān)閉modelsim軟件。
圖90 :是否確定關(guān)閉modelsim
點(diǎn)擊“是”即可關(guān)閉。
6、鎖定管腳
輸入設(shè)計(jì)后,經(jīng)過(guò)綜合和分析以及RTL仿真后,證明設(shè)計(jì)的邏輯功能是沒(méi)有任何錯(cuò)誤的。但是設(shè)計(jì)是在芯片內(nèi)部進(jìn)行實(shí)現(xiàn)的,如果想要發(fā)揮功能,勢(shì)必要與外部的邏輯電路進(jìn)行相連接。
在上述例子中,設(shè)計(jì)了二輸入與門。我們可以將兩個(gè)輸入綁定到任意的兩個(gè)管腳上,將輸出綁定到任意一個(gè)管腳上。經(jīng)過(guò)下載后,可以在輸入的管腳上加載電平,測(cè)量輸出管腳的電平,驗(yàn)證設(shè)計(jì)是否正確。
在FPGA學(xué)習(xí)開(kāi)發(fā)板上,大部分都會(huì)有一些按鍵和LED,這些按鍵就可以為輸入提供高低電平,LED就可以檢測(cè)輸出的電平值。
所以最好的驗(yàn)證方法是,將輸入的管腳分配到連接有按鍵的管腳上,將輸出分配到帶有LED的管腳上。
自己制作或者購(gòu)買的開(kāi)發(fā)板,都會(huì)有原理圖。
圖91 :四位按鍵的電路原理圖
經(jīng)過(guò)分析,key1的網(wǎng)絡(luò)是直接連接到FPGA芯片上的;按鍵釋放時(shí),key1網(wǎng)絡(luò)為高電平,按下時(shí),key1網(wǎng)絡(luò)為低電平。其他按鍵原理相同。
圖92 :LED電路
經(jīng)過(guò)分析,LED1的網(wǎng)絡(luò)是直接連接到FPGA芯片上的;當(dāng)FPGA將LED1網(wǎng)絡(luò)置成高電平時(shí),LED是熄滅的;當(dāng)FPGA將LED1網(wǎng)絡(luò)置成低電平時(shí),LED是點(diǎn)亮的。其他的LED原理類似。
不同的電路原理,后續(xù)會(huì)得出不同的結(jié)果。請(qǐng)認(rèn)真分析原理。
通過(guò)查看各個(gè)網(wǎng)絡(luò)與FPGA的芯片連接關(guān)系,就可以得出按鍵、LED電路與FPGA的線連接的IO。
圖93 :外部網(wǎng)絡(luò)與FPGA連接示意圖
經(jīng)過(guò)查看,兩個(gè)按鍵分別選擇M15和M16。LED選擇G15。
點(diǎn)擊assignments ?-> ?pin planner。打開(kāi)管腳規(guī)劃器。
圖94 :打開(kāi)管腳規(guī)劃器
在對(duì)應(yīng)端口的Location標(biāo)簽下的空白窗位置雙擊。
圖95 :準(zhǔn)備輸入管腳號(hào)
輸入對(duì)應(yīng)的管腳號(hào)。
圖96 :輸入對(duì)應(yīng)的管腳號(hào)
輸入完成后,點(diǎn)擊關(guān)閉即可。
點(diǎn)擊綜合和分析,等待綜合分析完成。
7、布局布線
綜合分析只是將外部的輸入轉(zhuǎn)換成為對(duì)應(yīng)的電路模型或者對(duì)應(yīng)FPGA的電路模型,我們可以對(duì)電路模型進(jìn)行RTL仿真,來(lái)排除邏輯功能的錯(cuò)誤。
在FPGA片內(nèi)實(shí)現(xiàn)的話,就需要對(duì)模型進(jìn)行“實(shí)地”布置,利用FPGA片內(nèi)的資源來(lái)實(shí)現(xiàn)模型,并且要固定好位置和連接線。這部分操作稱為適配,也被稱為布局布線。
圖97 :布局布線選項(xiàng)
雙擊Fitter即可進(jìn)行布局布線。
布局布線后形成的報(bào)告有可能和之前綜合分析形成的報(bào)告中的資源利用有所出入,最終我們以布局布線后的資源為準(zhǔn)。
8、時(shí)序仿真
在真正的電路中,是存在電路延遲的。在仿真時(shí),如果加載的綜合出來(lái)的電路模型,那么此時(shí)驗(yàn)證的內(nèi)容主要是測(cè)試模型的邏輯功能是否正確,不考慮延時(shí)信息。這種仿真被稱為功能仿真、RTL仿真、前仿真、前仿。
在仿真時(shí),也可以加載布局布線后的電路模型,那么此時(shí)驗(yàn)證的內(nèi)容主要是測(cè)試模型的延時(shí)是否能夠達(dá)到我們的要求。這種仿真被稱為時(shí)序仿真、后仿真、后仿、門級(jí)仿真。
雙擊EDA Netlist writer,產(chǎn)生后仿真所需要的模型。
圖98 :EDA Netlist Writer選項(xiàng)
啟動(dòng)后仿真。
圖4-89 :?jiǎn)?dòng)后仿真
直接默認(rèn)選擇,點(diǎn)擊RUN。
圖99 :選擇時(shí)序模型
綜合器給出了外部不同條件下的時(shí)序模型,這里先不敘述他們各自的作用,后續(xù)時(shí)序分析中,會(huì)專門提到各個(gè)模型的作用。
圖100 :二輸入與門后仿真波形圖
在輸入信號(hào)都變?yōu)楦吆螅敵鲂盘?hào)沒(méi)有立刻變化為高,而是延遲了一段時(shí)間后,才變?yōu)楦唠娖健?/p>
在二輸入與門中,電路的延遲對(duì)于我們來(lái)說(shuō)是可以接受的,沒(méi)有任何的要求。在后續(xù)的一些復(fù)雜的電路中,就要求電路的延遲不能太大,否則就會(huì)影響電路的功能。
時(shí)序仿真在企業(yè)設(shè)計(jì)中用的不太多,對(duì)于時(shí)序的很多問(wèn)題,采用靜態(tài)時(shí)序分析來(lái)查看。所以在后續(xù)的設(shè)計(jì)中,時(shí)序仿真將不在重點(diǎn)敘述。
9、生成配置文件并下載
在布局布線后,需要將對(duì)應(yīng)的結(jié)果下載到FPGA片內(nèi)。對(duì)于模型來(lái)說(shuō)是無(wú)法下載的,只有通過(guò)編譯,形成某種文件才可以下載。
雙擊Assembler(Generate programming files),產(chǎn)生配置文件。
圖101 :產(chǎn)生配置文件選項(xiàng)
利用下載電纜連接FPGA開(kāi)發(fā)板和PC。Intel FPGA的下載器為usb blaster ,當(dāng)連接到PC后,需要安裝驅(qū)動(dòng)。
將FPGA開(kāi)發(fā)板通電。
打開(kāi)設(shè)備管理器。在通用串行總線控制器的下面,觀看有沒(méi)有Altera USB blaster。如果有的話,證明已經(jīng)有了驅(qū)動(dòng),不需要再次安裝。如果沒(méi)有Altera USB blaster,在其他設(shè)備中,觀測(cè)有沒(méi)有“其他設(shè)備”。如果沒(méi)有“其他設(shè)備”的話,就需要認(rèn)真的檢查開(kāi)發(fā)板的各個(gè)連接線的連接情況。
圖102 :Altera USB blaster驅(qū)動(dòng)
圖103 :其他設(shè)備
選中USB-Blaster,右擊,選擇更新驅(qū)動(dòng)程序。
圖104 :如何搜索驅(qū)動(dòng)程序軟件
選擇“瀏覽計(jì)算機(jī)以查找驅(qū)動(dòng)程序軟件”。
圖105 :瀏覽計(jì)算機(jī)上的驅(qū)動(dòng)程序文件
點(diǎn)擊“瀏覽”,按照?qǐng)D4-96中所示路徑(quartus 的安裝路徑,讀者請(qǐng)尋找自己的路徑,后面的路徑是相同的)選擇文件夾,然后點(diǎn)擊確定。
點(diǎn)擊下一步,開(kāi)始安裝驅(qū)動(dòng)。安裝過(guò)程中,PC會(huì)詢問(wèn)是否安裝,點(diǎn)擊安裝即可。
安裝完成后,可以將下載線從PC上重新插拔一下。在通用串行總線控制器中就有Altera USB Blaster的驅(qū)動(dòng)。
安裝好驅(qū)動(dòng)后,點(diǎn)擊quartus 界面中tools的programmer。點(diǎn)擊Hardware setup。
圖106 :下載界面
選擇USB Blaster后,點(diǎn)擊close。
圖107 :選擇USB Blaster
選擇USB Blaster后,下載界面中顯示出,USB Blaster。此時(shí)直接Start即可開(kāi)始下載。右上角會(huì)有下載進(jìn)度條。
圖108:下載界面
如果下載界面沒(méi)有可下載的文件,可以點(diǎn)擊add files,在qprj中的output files文件夾中,有一個(gè)后綴為.sof文件。選擇后,下載即可。
下載完成后,此界面就可以關(guān)閉。詢問(wèn)是否保存時(shí),選擇否即可。
當(dāng)配置完成后,我們就可以進(jìn)行驗(yàn)證。按下按鍵,分析LED的燈的狀態(tài)。我們做的是二輸入與門,它的真值表如下:
圖109 :二輸入與門真值表
通過(guò)記錄按鍵和LED的狀態(tài),也會(huì)得到一組真值表。
圖110 :二輸入與門的按鍵和LED功能真值表
通過(guò)分析按鍵和LED的工作原理,可以化簡(jiǎn)真值表。
圖111 :二輸入與門的按鍵和LED化簡(jiǎn)真值表
通過(guò)分析兩個(gè)真值表,確認(rèn)功能正確。
不同的按鍵和LED原理,可以對(duì)應(yīng)去分析。
大多數(shù)FPGA的內(nèi)部實(shí)現(xiàn)是用SRAM等效出來(lái)的電路,SRAM是一種掉電丟失的器件。所以FPGA下載成功后可以正常運(yùn)行,但是掉電后,F(xiàn)PGA會(huì)丟失之前配置的所有信息。
這種情況非常不利于產(chǎn)品的研發(fā),設(shè)備斷電時(shí)常有的事情,而斷電后再上電,還是希望FPGA能夠正常工作的。
正是由于FPGA掉電丟失所有信息,所以在FPGA的周邊會(huì)配置一塊掉電不丟失的存儲(chǔ)器(flash),可以將配置信息存儲(chǔ)到存儲(chǔ)器中,F(xiàn)PGA每次上電后讀取存儲(chǔ)器的內(nèi)容即可。
向flash中存儲(chǔ)信息,需要將上述.sof文件轉(zhuǎn)換為.jic文件。
在quartus 界面中,點(diǎn)擊file ?-> Convert Programming file。
圖112 :轉(zhuǎn)換配置文件
在programming file type中選擇jic文件,在configuration device中選擇EPCS16。EPCS16是altera 公司推出的一款flash的型號(hào),國(guó)內(nèi)大多數(shù)開(kāi)發(fā)板上不是altera公司推出的芯片,但是能夠兼容。EPCS16是一個(gè)16Mbit的flash。讀者需要觀察自己手中開(kāi)發(fā)板的flash型號(hào),找到與之對(duì)應(yīng)的altera公司的兼容產(chǎn)品,選擇即可。
圖113 :添加flash loader
選擇flash loader,點(diǎn)擊add device,選擇ep4ce10,單擊OK。
圖114 :選擇FPGA系列
選擇SOF data,點(diǎn)擊add file,找到之前的配置文件.sof,點(diǎn)擊open。
圖115 :選擇配置文件
點(diǎn)擊generate,開(kāi)始生成.jic文件。
圖116 :生成文件成功
點(diǎn)擊OK后,關(guān)閉界面即可。
重新打開(kāi)下載界面。選擇下載文件,點(diǎn)擊delete。
圖117:移除默認(rèn)下載文件
點(diǎn)擊add files,將生成的.jic文件(在qprj中的outputfiles文件中)添加進(jìn)來(lái),勾選program/configure,然后點(diǎn)擊start。
圖118:下載.jic文件
下載此文件速度比較慢,請(qǐng)耐心等待。
下載后,F(xiàn)PGA不能夠正常工作,需要斷電后上電,F(xiàn)PGA就可以正常工作了。
以后每次斷電再上電,都可以正常工作。
本文的1到9小節(jié)就是正常的開(kāi)發(fā)流程。在此過(guò)程之外,還有可能會(huì)加入一些其他的流程,例:功耗分析、時(shí)序約束等等。
更多資料可在叁芯智能FPGA論壇(www.sxznfpga.com)下載獲取。