使用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文件对话框
路由