使用Quartus II 的MegeWizard Plug-In Manager中的宏功能模塊可以幫助用戶完成一些複雜系統的設計,並可以方便地對現有的設計文件進行修改。這些宏功能模塊包括LPM(Library Parameterized Megafunction)、MegaCore(例如FFT、FIR等)和AMPP(Altera Megafunction Partners Program,例如PCI、DDS等)。下面以波形發生器的設計為例,介紹Quartus II宏功能模塊的使用方法。
2.3.1 設計原理
波形發生器的原理圖如圖所示。其中,lpm_counter0是LPM計數器,LPM_ROM是LPM只讀存儲器(ROM)。ROM中保存的是某種波形信號(如鋸齒波或正弦波)的數據,其地址由計數器lpm_counter0提供。lpm_counter0是一個8位加法計數器,在時鐘的控制下計數器的輸出q[7..0]由「00000000」到「11111111」循環變化,使ROM輸出周期性的波形信號的數據 。
波形發生器的原理圖
2.3.2 編輯輸入頂層設計文件
設計開始時應首先為波形發生器建立新的設計工程,本例的設計工程名為「mydds」,並選擇Cyclone II系列的EP2C35F672C6(DE2的目標晶片)作為設計工程的下載目標晶片。新的工程建立後,在Quartus II集成環境下,執行「File」→「New」命令,打開一個新的「Block Diagram/Schematic File 」(模塊/原理圖文件)編輯窗口。
1. 加入計數器元件
首先加入「arithmetic」庫庫中的「lpm_counter」(計數器)LPM元件。LPM是參數化的多功能庫元件,每一種LPM元件都具有許多埠和參數,通過對埠的選擇與參數的設置得到設計需要的元件。計數器元件上有許多埠,實際設計只需要時鐘輸入clock和數據輸出q[]埠。通過參數設置就可以將不用的埠消去,並對使用埠的參數進行設置。
lpm_counter元件選擇窗
選定計數器元件後單擊元件選擇窗的「OK」按鈕,彈出如圖所示的「MegaWizard Plug-In Manager[page 2c]」對話框頁面。在該對話框頁面中,選擇VHDL(或Verilog HDL或AHDL)作為輸出文件的類型,並在「What name do you want for the output file ?」欄目中選擇或填入生成的計數器名稱及保存的文件夾(如D:\myeda\lpm_counter0)。完成上述操作後,單擊「Next」按鈕,進入「MegaWizard Plug-In Manager [page 3 of 7] LPM_COUNTER」頁面。在此頁面中設置計數器的q輸出位數為8bit,時鐘輸入clock的有效邊沿為「Up only」(上升沿有效)。
MegaWizard Plug-In
LPM_COUNTER
單擊「Next」按鈕,進入「MegaWizard Plug-In Manager [page 4 of 7] LPM_COUNTER」頁面。在此對話框頁面中,選擇計數器的類型為「Plain binary」(二進位)。計數器的類型除了二進位外,還可以選擇任意模值,如5、10、60等。
單擊「Next」按鈕,進入「MegaWizard Plug-In Manager [page 5 of 7]LPM_COUNTER」頁面。此頁面用於為計數器添加同步或異步輸入控制端,如「Clear」(清除)、「Load」(預置)等。
2. 建立存儲器初值設定文件
為了將數據裝入ROM中,在加入ROM之前,首先應建立一個存儲器初值設定文件(或稱為.mif格式文件)。建立存儲器初值設定文件的操作如下:
① 執行「File」→「New」命令,打開一個新的「Memory initialization file」(存儲器初值設定文件)編輯窗口,在彈出存儲器參數設置對話框中輸入存儲器的字數(Number of words)為256,字長(Word size)為8位
存儲器參數設置對話框
②單擊「OK」按鈕,彈出存儲器初值設定文件的界面,將此文件以.mif為類型屬性(如mydds.mif)保存在工程目錄中。在存儲器初值設定文件的界面中,右擊存儲器的某個地址(如0),彈出Address Radix(地址基數)和Memory Radix(存儲器基數)選擇快捷菜單。執行「Address Radix」命令可對存儲器的地址基數進行選擇,地址基數有Binary(二進位)、Decimal(十進位)、Octal(八進位)和Hexadecimal(十六進位)4種選擇,本例選擇地址基數為「Decimal」。執行「Memory Radix」命令可對存儲器單元中的數據基數進行設置,數據基數有Binary、Hexadecimal、Octal、Signed Decimal和Unsigned Decimal等5種選擇,本例的設計選擇「Unsigned Decimal」 (無符號十進位) 。
存儲器初值設定文件的界面
③ 將數據加入存儲器初值設定文件中。新建的存儲器初值設定文件中的數據全部為0,在存儲器初值設定文件的界面可以直接輸入每個存儲器字的數據,也可以右擊文件,在格式文件操作快捷菜單提示下,完成數據輸入。
例如,在格式文件操作快捷菜單中選擇「Custom Fill Cells」(塊填充)項,彈出「Custom Fill Cells」對話框。在對話框的「Starting address」欄目內輸入起始地址(如00),在「Ending address」欄目內輸入結束地址(如255);將「Incrementing/Decrementing」選中後,在「Starting Value」欄目中輸入起始值(如0),在「Increment by」(或Decrement by)欄目中輸入增加(或減少)值(如1)。完成上述操作後單擊「OK」按鈕,結束.mif格式文件中的數據填充,得到一個鋸齒波數據。
根據快捷菜單,還可以對格式文件中的數據進行拷貝、粘貼、填充0、填充1等操作。生成的存儲器初值設定文件(mydds.mif)的格式如下:
WIDTH=8;
DEPTH=256;
ADDRESS_RADIX=UNS;
DATA_RADIX=UNS;
CONTENT BEGIN
//存儲器的地址與數據
0 : 0;
1 : 1;
2 : 2;
//以下252行數據省略
254 : 254;
255 : 255;
END;
用上述方法只能生成一些簡單的波形數據,對於複雜的波形(如正弦波)的數據,需要在存儲器初值設定文件的界面上一個一個地將數據填入。利用C語言程序也可以生成存儲器初值設定文件(.mif)中的數據,例如生成正弦波數據的C語言源程序(myram.c)如下:
#include <stdio.h>
#include "math.h"
main()
{int i,k;
for(i=0;i<256;i++)
{k=128+128*sin(360.0*i/256.0*3.1415926/180);
printf("%d : %d;\n",i,k);
}
return;
}
在C語言編譯軟體環境下將myram.c文件通過編譯並運行後,在DOS(Windows的命令提示符)環境下執行命令:
myram > myram_1.mif
則將myram文件運行的結果保存在myram_1.mif文件(該文件可以任意命名,也可以不加文件屬性)中。以「記事本」方式打開myram_1.mif文件,將其地址和數據部分的內容(共256行)複製到以記事本方式打開的存儲器初值設定文件(mydds.mif)中,替換源文件中的地址和數據。
注意:如果原來的存儲器初值設定文件(.mif)中的地址基數選用「Hexadecimal」 (十六進位),而用C語言程序生成的地址基數是十進位,因此需要把mydds.mif中的「ADDRESS_RADIX=HEX;」語句修改為「ADDRESS_RADIX=DEC;」,表示地址基數為十進位,而原來的存儲器初值設定文件中的地址基數選用十進位,則不需要修改。在Quartus Ⅱ環境下打開修改後的mydds.mif,其存儲的數據即為正弦波的數據。
3. 加入只讀存儲器ROM元件
在彈出的元件選擇窗的「Libraries」欄目中展開「megafunction」的「storage」庫,選中庫中的「lpm_rom」(只讀存儲器ROM))元件,單擊「OK」按鈕完成LPM_ROM元件符號的加入。雙擊元件符號右上角屬性(property)框,彈出元件符號屬性(Symbol Properties)窗口的General頁面。元件符號屬性窗口有General(常規)、Port(埠)、Parameter(參數)和Format(格式)4個頁面,General頁面用於符號名稱(Symbol name)和實例名稱(Instance name)的設置;Port 頁面用於使用或不使用埠的設置;Parameter 頁面用於參數的設置;Format 用于格式的設置,如元件符號的線條、字體的顏色等。
在General頁面保持的默認的符號名稱LPM_ROM和實例名稱inst1。單擊元件符號窗口上方的「Port」按鈕,進入Port頁面。LPM_ROM一共提供了address(地址)、inclock(時鐘輸入)、memenab(存儲器使能)、outclock(時鐘輸出)和q[](數據輸出)5個埠,在Port頁面的status(狀態)欄中設置使用或不使用這些埠,在本例設計中,將address、inclock和q[]設置為「Used」(使用),將memenab和outclock設置為「Unused」(不使用)。
單擊元件符號窗口的「Parameter」按鈕,進入Parameter頁面。該頁面有6項參數需要設置。
① 在名稱為「LPM_ADDRESS_CONTROL」項的Value(值)框中選擇「"REGISTERED"」(註冊),在Type(數據類型)框中選擇Auto(自動)為數據類型。數據類型有多種,如「Signed Binary」(帶符號整型)、 「Unsigned Integer」(無符號整型)、「Octal」(八進位)、「Float」(浮點)等,這些數據類型都可以用「Auto」替代。
②在名稱為「LPM_FILE」項的Value框中輸入存儲器初值文件的名稱,本例的設計的名稱為「mydds.mif」,在Type框中選擇Auto為數據類型。
③在名稱為「LPM_NUMWORDS」項的Value框中填入存儲器的字數,本例設計的字數為256(即28),在Type框中選擇Auto為數據類型。
④在名稱為「LPM_OUTDATA」項的Value框中選擇「"UNREGISTERED"」(未註冊),在Type框中選擇Auto為數據類型。
⑤在名稱為「LPM_WIDTH」項的Value框中填入存儲器的字長,本例設計的字長為「8」,在Type框中選擇Auto為數據類型。
⑥在名稱為「LPM_WIDTHAD」項的Value框中填入存儲器地址的位數,本例設計的地址位數為「8」,在Type框中選擇Auto為數據類型。
單擊元件屬性窗口下方的「OK」按鈕,結束LPM_ROM參數屬性的設置。
4. 編輯和編譯頂層設計文件
在新建的圖形編輯窗口中加入計數器lpm_counter0和只讀存儲器LPM_ROM元件後,還需要加入一個輸入(input)元件和兩個輸出(output)元件,輸入元件接於lpm_counter0的clock端,並更名為「clk」,作為電路的時鐘輸入;一個輸出元件接於LPM_ROM的q[]端,並更名為「q[7..0]」,作為8位波形數據輸出;一個輸出元件接於lpm_counter0的輸出q[7..0]端,並更名為「qc[7..0]」,作為另一個8位數據輸出埠,由於存儲器的地址是從「00000000」遞增到「11111111」不斷循環,因此這個數據埠輸出的是一種鋸齒波。參照波形發生器原理圖,完成設計電路的內部連接,然後以「mydds.bdf」為文件名保存在工程目錄中,並通過Quartus II的編譯。
2.3.3 仿真頂層設計文件
在Quartus II 13.0界面執行「Assignments」→「Settings」命令,在彈出的設置(Settings)窗口,單擊選中「EDA Tool Settings」項,對「Simulation」欄目下的仿真測試文件進行設置和新的測試文件mydds.vho的添加。
執行「Tools」→「Run EDA Simulation Tool」→「RTL Simulation」命令,開始對設計文件的寄存器傳輸級時序仿真,命令執行後,系統會自動打開ModelSim-Altera 10.1d主界面和波形窗口。為了便於觀察,將波形窗口中q、clk和qc信號保留,其餘信號刪除,然後右擊信號q,執行彈出的Object快捷菜單的「Properties…」命令,彈出波形屬性窗口。在屬性窗口將將q的數制基數設置為十六進位(hexadecimal),單擊波形屬性窗口上方的「Format」按鈕,進入波形格式頁面,在該頁面選中「Analog」(模擬)格式,並在「Max:」欄中填入「300」作為模擬波形顯示幅度的最大值,單擊「OK」按鈕,結束q信號的波形格式設置。用同樣的方法設置qc信號為十六進位的模擬波形輸出格式。
右擊信號clk,執行彈出的Object快捷→「clock…」命令,彈出「Define Clock」(定義時鐘)窗口,在窗口的Period(周期)欄目中將時鐘周期改寫為10000(默認單位為ps),由於目標晶片的傳輸延遲在10ns左右,因此時鐘周期小於10000ps時將無法看到設計電路時序仿真的輸出波形。窗口中其他欄目保持默認,單擊「OK」按鈕,結束clk信號的設置。
單擊波形窗口的「運行全程」按鈕,約數秒後單擊「停止」按鈕結束仿真,然後單擊「全程」按鈕,展開仿真波形,用「縮小」或「放大」按鈕調整波形窗口,得到便於觀察的正弦波和鋸齒波仿真波形,仿真波形上的微小「尖峰」是設計電路的競爭-冒險現象。
設計電路的仿真波形
2.3.4 圖形文件的轉換
為了使利用Quartus II宏功能模塊設計的電路能在其他軟體平臺運行和驗證,可將其轉換為硬體描述語言(HDL)文件。執行Quartus II主窗口的「File」→「Create/Update」→「Create HDL Design File for Current File」命令,彈出生成HDL文件對話框,選擇生成Verilog HDL或VHDL類型文件。HDL文件類型確定後,單擊「OK」按鈕,即可為當前的設計生成Verilog HDL或VHDL文件。
生成HDL文件對話框