按照基于Windows的語言(C、C++、C#)等編程語言的初學(xué)入門教程,第一個(gè)歷程應(yīng)該是“Hello World!”的例程。但由于硬件上的驅(qū)動(dòng)難易程度,此例程將在在后續(xù)章程中推出。硬件工程師學(xué)習(xí)開發(fā)板的第一個(gè)例程:流水燈,一切美好的開始。 本章將會(huì)在設(shè)計(jì)代碼的同時(shí),講解Quartus II 軟件的使用,后續(xù)章節(jié)中只講軟件的思想,以及解決方案,不再做過多的累贅描述。 一、Step By Step 建立第一個(gè)工程 (1)建立第一個(gè)工程,F(xiàn)ile-New-New Quartus II Project,如下圖所示,OK。 (2)Next,如下圖所示,選擇工程目錄(不能有空格,中文路徑),同時(shí)輸入工程名與頂層文件名。 (3)若有現(xiàn)成的代碼,可以直接選擇添加入工程;否則,直接next,進(jìn)入下一步,如下圖所示: (4)根據(jù)自己的硬件設(shè)施,選擇相應(yīng)的設(shè)備目標(biāo)器件。 (5)Next,F(xiàn)inish。 二、工程代碼設(shè)計(jì) 1. water_led_design工程文件結(jié)構(gòu): 如上圖所示,工程分為三個(gè)模塊,分別為: (1)頂層模塊 : 例化各個(gè)模塊,工程的最高級(jí)別文件。 (2)分頻模塊 : 通過分頻得到固定的頻率(10Hz)。 (3)LED顯示模塊: 隨固定頻率,來操作LED燈。 2. 代碼設(shè)計(jì) (1)warter_led.v模塊設(shè)計(jì) a) New-File,新建verilog文件,保存于新建在工程目錄下的src文件夾中(只是為了工程文件結(jié)構(gòu)組織的清晰,更善于管理)。如下圖所示: b) 輸入代碼,定義輸入輸出接口,如下所示: [color=]module water_led [color=] ( [color=] input clk, //global clock 50MHz [color=] input rst_n, //global clock reset [color=] output [5:0] led_data //user led interface [color=] ); [color=] endmodule (2)clk_design.v模塊設(shè)計(jì) 由于系統(tǒng)輸入時(shí)鐘是50Mhz,若以50MHz的速度變換LED等,人眼壓根分辨不出來。因此利用分頻原理,來對(duì)50MHz進(jìn)行分頻,而適應(yīng)人眼。本模塊將50MHz分頻至10Hz,人眼分辨的極限是25Hz,因此10Hz能感覺得到(可以隨機(jī)修改)。Led_en的頻率計(jì)算公式:clk_led_en = 50_000000/(49_000000+1) = 10Hz,具體代碼如下: [color=]module clk_design [color=] ( [color=] input clk, [color=] input rst_n, [color=] output led_en [color=] ); [color=] reg [22:0] cnt; //49_99999,100ms [color=] parameter LED_CNT = 49_999999; [color=] always@(posedge clk or negedge rst_n) [color=] begin [color=] if(!rst_n) cnt else if(cnt cnt [color=] else cnt [color=] end [color=] assign led_en = (cnt == 23'd49_99999) ? 1'b1 : 1'b0; [color=] endmodule 模塊沒有分頻產(chǎn)生10Hz的頻率,而是生成了10Hz的使能時(shí)鐘,目的是防止時(shí)鐘滿天飛,使得FPGA 內(nèi)部布局布線紊亂,影響全局功能。雖然如此簡單的工程可以不用考慮,但是“習(xí)慣了嚴(yán)謹(jǐn)便成為了一種風(fēng)范”,因此使用使能時(shí)鐘,來對(duì)具體的時(shí)序進(jìn)行操作。具體使能時(shí)鐘、門控時(shí)鐘的異同、優(yōu)劣將會(huì)在后續(xù)章節(jié)中解說。 (3)led_display.v模塊設(shè)計(jì) 根據(jù)輸入的led_en使能信號(hào),來操作led燈的效果,此處采用最簡單的算法——遞增進(jìn)位。代碼如下所示: [color=]module led_display [color=] ( [color=] input clk, [color=] input rst_n, [color=] input led_en, [color=] output reg [5:0] led_data [color=] ); [color=] always@(posedge clk or negedge rst_n) [color=] begin [color=] if(!rst_n) led_data [color=] else if(led_en) led_data [color=] else led_data [color=] end [color=] endmodule [color=] (4)從新修改water_led_design頂層文件,添加相關(guān)例化模塊。最后結(jié)果如下: [color=] module water_led_design [color=] ( [color=] input clk, //global clock 50MHz [color=] input rst_n, //global clock reset [color=] output [5:0] led_data //user led interface [color=] ); [color=] //------------------------- [color=] //generater clock 10Hz [color=] wire led_en; [color=] clk_design clk_design_inst [color=] ( [color=] .clk (clk), [color=] .rst_n (rst_n), [color=] .led_en (led_en) [color=] ); [color=] //------------------------- [color=] //set the display of led [color=] led_display led_display_inst [color=] ( [color=] .clk (clk), [color=] .rst_n (rst_n), [color=] .led_en (led_en), [color=] .led_data (led_data) [color=] ); [color=] endmodule 3. 代碼編譯 (1)通過Processing-Start Compilation,或者工具欄的圖標(biāo)如下: (2)編譯結(jié)果如下,可見相關(guān)信息: (3)警告的分析及解決: a) Warming(4)如上圖所示,具體解釋如下: i. 沒有電容配置 ii. 沒有把unused的pin設(shè)置為三態(tài)。在Assignment-Device-Device and Pin Opitions-Unused Pins,設(shè)置如下圖所示: iii. 沒有電容配置 iv. 可以忽略 b) Critical Warming(5)如上圖所示,具體解釋如下: i. 引腳沒有分配IO ii. 沒有sdc時(shí)序約束文件 iii. 沒有sdc約束文件 iv. 時(shí)序沒有達(dá)到要求 v. 時(shí)序沒有達(dá)到要求 出現(xiàn)這些警告的原因是因?yàn)镼uartus II 10.1以后的版本軟件,不再自帶TimeQuest Timing Analyzer,只有Classic Timing Analyzer,雖然不加sdc時(shí)序約束對(duì)于一般情況也不一定會(huì)有錯(cuò),但軟件設(shè)計(jì)的必然會(huì)出現(xiàn)這樣的警告。關(guān)于TimingQuest sdc,會(huì)在后續(xù)章節(jié)中闡述,此處不做具體說明。 關(guān)于Quartus II 警告信息分析以及零警告的處理,可以右擊警告查看help,altera會(huì)告訴您相應(yīng)的解決方案;此外,Bingo已上傳Chinaaet“Quartus II 警告分析.pdf”,下載地址為:http://www.chinaaet.com/lib/detail.aspx?id=86271 初學(xué)折有不到之處可以查閱該pdf,記住,永遠(yuǎn)不要輕易忽略警告。 三、Modelsim-Altera仿真 1. 為什么要仿真 首先討論兩個(gè)問題: (1)仿真?是真的嗎? 仿真,只是為了模擬真實(shí)現(xiàn)象,測試代碼的行為以及時(shí)序的正確性;當(dāng)然,仿真永遠(yuǎn)是模仿的,不可能是絕對(duì)準(zhǔn)確的,只能在一定程度上模擬真實(shí)時(shí)序,讓我們的設(shè)計(jì)變得更可靠。仿真對(duì)于電路設(shè)計(jì)者,只是一個(gè)軟件測試的平臺(tái),而不是實(shí)際硬件設(shè)施的測試結(jié)果。 (2)一定要仿真嗎? 未必!如果你有足夠的把握時(shí)序的準(zhǔn)確性,腦子里能夠完成整個(gè)電路的時(shí)序邏輯工作流程,仿真就不是那個(gè)必須的了;對(duì)于已經(jīng)成型的模塊,保證時(shí)序準(zhǔn)確的情況下,何必在徒勞的仿真呢?按常理,是現(xiàn)有Quartus II軟件,再有仿真軟件的吧,Testbench只是測試程序,鏈接兩者之間的橋梁。 回想,在n年前的老工程師,用block中用與非門與74系列芯片設(shè)計(jì)的原理圖,要仿真似乎變得很難?那些老前輩們是通過實(shí)物的測試,不斷的修正、改善,最后才得到可靠的電路。 因此,仿真 不是必須的。Bingo就經(jīng)常不仿真!不是說懶,是因?yàn)槟X子中的電路時(shí)序邏輯,本能性的能夠保證電路的準(zhǔn)確性,或者說出了問題能夠自行改正,不會(huì)失去了方向。所謂代碼在電腦上,電路在腦子中,每一句行為級(jí)語言,都加增添一個(gè)電路。 當(dāng)然,并非每一個(gè)人都可以這樣子的。對(duì)于初學(xué)者而言,仿真是非常重要的一個(gè)過程。原因是因?yàn)樵诔鯇W(xué)者腦子中,還未呈現(xiàn)固定邏輯實(shí)現(xiàn)的時(shí)序工作流程,換句話說,經(jīng)驗(yàn)不夠豐富吧。 當(dāng)然在時(shí)序很復(fù)雜而且龐大時(shí),時(shí)序仿真是必須的,因?yàn)樵谶@種情況下,大腦的模擬也許無法跟計(jì)算機(jī)的計(jì)算速度比擬了。 前文安裝Quartus II 軟件章節(jié)有提到過,Quartus II 9.1以前版本,軟件自帶仿真器,而9.1以后的版本,需要第三方軟件的支持。第三放仿真軟件有很多,而用的最多的,固然是Modelsim-Altera。本章節(jié)中Quartuus II 11.0與Modelsim-Altera協(xié)同工作,仿真測試本例程的代碼的時(shí)序。希望通過節(jié)的分析,對(duì)時(shí)序邏輯上有一個(gè)更深刻的認(rèn)識(shí)。 2. 仿真必備的知識(shí) Altera_Modelsim仿真資料:http://www.chinaaet.com/lib/detail.aspx?id=86257 四、配置FPGA 1. 配置綜合 配置引腳簡單的說就是通過軟件的設(shè)置,將FPGA內(nèi)部邏輯信號(hào)映射到IO上,具體有下面幾種方法: (1)在Assignments-Pin Planner中對(duì)應(yīng)IO手動(dòng)輸入IO引腳 (2)Quartus II Tcl Console 手動(dòng)輸入,輸入的格式為:“set_location_assignment PIN_28 -to clk” (3)Tcl Scripts,通過調(diào)入tcl 文件來進(jìn)行映射 (4)在Assignments-Import Assignments,通過調(diào)入(2)格式的文件來進(jìn)行映射。 后面兩種方法具體步驟可見網(wǎng)友“小時(shí)不識(shí)月”的網(wǎng)頁教程:http://www.cnblogs.com/yuphone/archive/2010/01/18/1650612.html 配置好查看Quartus II Pin Planner,如下圖所示: 配置完引腳在進(jìn)行綜合,就少了上述提醒沒有進(jìn)行引腳配置的2個(gè)警告。 注意1:對(duì)于Quartus II 中引腳配置的方法,若用最原始的第一種GUI手動(dòng)輸入配置,需要第一次編譯后讓軟件在Pin Planner生成IO,然后再GUI下手動(dòng)配置;若用其他三種方法,可以在第一次編譯以前,用命令輸入配置信息,在Quartus II 編譯后,自動(dòng)識(shí)別映射信息,達(dá)到同樣的效果。 注意2:對(duì)于系統(tǒng)及的FPGA設(shè)計(jì),由于工程之大,引腳之多,一般編譯綜合需要耗費(fèi)很大的時(shí)間,因此一般采用不采用第一種方法,而且在第一次編譯以前事先導(dǎo)入映射信息。 2. 目標(biāo)板下載模式 總而言之,Quartus II 軟件只是個(gè)GUI的 用戶終端,用來設(shè)計(jì)代碼,綜合FPGA邏輯電路,最終的目的,是通過USB Bluster、并口或者其他途徑下載到目標(biāo)板。具體有以下幾種: (1)配置FPGA——JTAG Mode 所謂配置FPGA就是將sof文件電路配置FPGA的SRAM(FPGA是基于SRAM格式的),在不掉電的情況下進(jìn)行現(xiàn)場配置,驗(yàn)證。此方式是通過JTAG接口下載的。 (2)燒錄EPCS——Active Serial Programming 所謂燒錄EPCS是生成的代碼信息燒錄到存儲(chǔ)芯片EPCS中,通過配置信號(hào)或者重新上電,配置FPGA SRAM;由于EPCS flash結(jié)構(gòu),因此EPCS中的掉電不丟失(類似于CPLD)。燒錄EPCS有兩種方法,如下 a) 通過ASP接口下載pof文件 b) 通過JTAG接口下載jic/jam文件,jic/jam文件由Quartus II 軟件對(duì)sof文件進(jìn)行轉(zhuǎn)換后得到。 (3)Passive Serial并口下載 (4)In Socket Programming下載 以上兩種模式,由于應(yīng)用不是很廣泛,在此不做過多闡述。 綜上說明,在成本敏感,或者電路板空間苛刻的情況下,完全可以舍去ASP接口,而用JTAG來替換。考慮到Altera設(shè)計(jì)了兩種接口的原因,是給用戶更大的選擇性,特殊場合下,可以只存在ASP接口,只進(jìn)行一次燒錄,而不用JTAG接口進(jìn)行測試。 3. JTAG的下載 (1)在工具欄打開或者菜單欄Tool打開Programming (2)若沒找到Hardware,在Hardware Setting中找到USB Bluster。 (3)選擇JTAG Mode (4)若沒有自動(dòng)加載sof文件,點(diǎn)擊Add File導(dǎo)入該工程的sof文件 (5)最后點(diǎn)擊Start,等待下載完畢,如下圖所示: 4. EPCS的下載 (1)在ASP模式下 a) Mode切換為Active Serial Programming模式 b) Change File為pof文件 c) 點(diǎn)擊Start,等待下載完畢。因?yàn)镕lash速度比SRAM慢,因此下載相對(duì)于Flash會(huì)較慢。 至此,可見目標(biāo)板上的流水燈已遞增的形式循環(huán)點(diǎn)亮。 (2)在JTAG模式下 a) 用Quartus II 自動(dòng)生成的sof文件,通過軟件轉(zhuǎn)換為jic文件,步驟如下: i. 打開File-Convert Programming File。 ii. 在Programming File Type選擇jic文件。 iii. Configuration device中選擇目標(biāo)板對(duì)應(yīng)的EPCS型號(hào) iv. File name可默認(rèn)或任意修改 v. 在File/Data area選中Flash Loader,然后右側(cè)點(diǎn)擊Add Device,找到自己型號(hào)的FPGA,確認(rèn)。 vi. 在File/Data area選中SOF Data,然后在右側(cè)點(diǎn)擊Add File,加載本工程目錄下的sof文件。 vii. 在File/Data area選中加載的sof文件,然后再右側(cè)點(diǎn)擊Properties,選中Compression(壓縮),確認(rèn)。(若EPCS容量允許下,可以省略此步驟,來提高下載速度) viii. 點(diǎn)擊Generate,生成jic文件,最終如下圖所示,然后Close。 b) 打開Programming,選擇JTAG Mode。 c) 選擇前面生成的jic文件,選中jic文件后面的Program/Configure d) 點(diǎn)擊Start,等待下載完成,如下圖所示: 至此,可見目標(biāo)板上的流水燈已遞增的形式循環(huán)點(diǎn)亮。 5. 編程/配置失敗原因 (1)USB下載器沒有連接好或USB線太長(沒插上,或者接口插錯(cuò)) (2)設(shè)備沒上電。 (3)FPGA Device型號(hào)選擇錯(cuò)誤 (4)EPCS型號(hào)選擇錯(cuò)誤 (5)布局布線不佳,導(dǎo)致下載時(shí)序錯(cuò)誤 (6)FPGA芯片已損壞 (7)EPCS芯片已損壞 (8)USB Bluster已損壞 |