另外,QuartusII中含有大量的功能强大的LPM宏功能模块,其中利用LPM_ROM可以方便地定制ROM。下面以一个正弦信号发生器的设计为例,介绍LPM_ROM的应用。
1.工作原理
正弦信号发生器的原理图如图5-31所示,其中,counter6是LPM计数器或地址发生器,data_rom是地址线为6位、数据线为8位的LPM只读存储器(ROM),用于存储正弦波一个周期的数据,这样正弦波一个周期含有64个波形数据。ROM中存储的正弦波数据,其地址由计数器counter6提供。counter6是一个6位加法计数器,在时钟clk的控制下计数器的输出q[5..0]由000000到111111循环变化,使ROM输出周期性的波形信号的数据。只要在输出端q[7..0]接上8位的D-A转换器,用示波器就可以观察到正弦波的波形。其中,地址发生器的时钟clk的输入频率f0与每周期的波形数据点数(在此为64点),以及D-A输出的频率的关系是f=f0/64。
图5-31 正弦信号发生器的原理图
设计开始时,应首先为正弦信号发生器建立新的设计项目,本例的设计项目名为“singt”,新的项目建立后,在QuartusⅡ集成环境下,执行“File”菜单的“New”命令,打开一个新的“BlockD iagram/Schematic File”(模块/原理图文件)编辑窗口。
2.定制初始化数据文件
为了将数据装入ROM中,在加入并设置ROM之前,应先建立一个存储器初始化数据文件。QuartusⅡ可以接受的LPM_ROM模块中的初始化数据文件的格式有两种:Memory Initialization File(.mif格式)和Hexadecimal(Intel-Format)File(.hex格式),在实际应用中只要使用其中一种格式的文件即可,本例使用.mif格式文件。
1)在QuartusⅡ集成环境下,执行“File”菜单的“New”命令,在“New”对话框中选择“Other Files”选项卡,打开一个新的“Memory Initialization File”(存储器初始化数据文件)对话框,如图5-32所示,在弹出的存储器ROM的参数设置对话框中输入存储器的字数(Number of words)为64,字长(Word size)为8位,如图5-33所示。
图5-32 新建.mif格式文件
图5-33 存储器参数设置对话框
2)存储器的参数设置结束后单击“OK”按钮,弹出存储器初始化数据文件的界面,新建的初始化数据文件表格中的数据全部为0,此时可以将波形数据填入数据表格中。在存储器初始化数据文件的界面中,右击存储器左列的某个地址,弹出右键快捷菜单,其中包括Address Radix(地址基数)和Memory Radix(存储器基数)两项。执行Address Radix项可对存储器的地址基数进行选择,地址有Binary、Decimal、Octal和Hexadecimal4种基数选择。执行Memory Radix项则可对存储器单元中的数据基数进行设置,存储器数据有Binary、Hexadecimal、Octal、Signed Decimal和Unsigned Decimal5种基数选择。存储器数据表格中任一数据(如第4行的1)对应的地址为左列(24)与顶行数(6)之和(即24+6=30,十六进制为1E,二进制为00011110),如图5-34所示。
完成后,将此文件以.mif为类型属性(如singt.mif)保存在工程目录中。
图5-34 存储器数据表格
也可以使用QuartusⅡ以外的文本编辑器设计或打开MIF文件,其格式如下所示。其中,冒号左边是地址值,右边是对应的数据,并以分号结尾。
mif文件也可以用程序语言生成,如C语言或MATLAB语言。下面是产生正弦波数据值的C程序:
把上述程序编译后,可在DOS命令行下执行命令
将生成data_rom.mif文件,再加上.mif文件的头部说明即可。
3.定制LPM_ROM元件
双击原理图编辑窗口,在弹出的元件选择对话框的“Libraries”栏目中,单击“megefunc-tions”选项,并选择“storage”的“lpm_rom”(只读存储器ROM)LPM元件,如图5-35所示。
图5-35 LPM_ROM元件选择对话框(www.xing528.com)
单击“OK”按钮,弹出如图5-36所示的“MegaWizardPlug-InManager[page2c]”对话框。在该对话框中,选择VHDL(或VerilogHDL)作为输出文件的类型,并将生成的只读存储器名称及保存的文件夹输入到“What name do you want for the output file?”栏目中。
图5-36 MegaWizard Plug-In Manager[page2c]对话框
根据设计要求设置宏功能模块的相关参数。如ROM模块的q输出位数为8bit,字数为64,采用单时钟控制方式。是否需要设置一些附加端口,如时钟使能、异步复位等,如图5-37和5-38所示。
图5-37 选择data_rom模块数据线和地址线宽度
图5-38 选择地址锁存信号clock
完成此页的参数设置后单击“Next”按钮,进入ROM参数设置的“MegaWizard Plug-In Manager-LPM_ROM[page5of7]”对话框,如图5-39所示。在此页面的“Doyouwant to specify the initial content of the memory?”栏目中选中“Yes,use this file for the memory con-tentdata”项,并输入以上已经设置的初始化数据文件名(如singt.mif)。另外,将“Alow In-System Memory…”项选中,表示允许QuartusⅡ能通过JTAG口对下载于FPGA中的ROM进行在系统测试和读写。
图5-39 选择ROM初始化数据文件
完成此页的参数设置后单击“Next”按钮,进入ROM参数设置的“MegaWizard Plug-In Manager-LPM_ROM[page7of7]”对话框。这是ROM参数设置的最后一个页面,此页面主要用于选择生成ROM的输出文件。至此,ROM参数设置完成,用鼠标左键单击“Finish”按钮结束设置,在原理图编辑器中单击左键放置LPM_ROM宏功能模块,如图5-40所示。
4.定制LPM_COUNTER计数器元件
图5-40 定制完成的ROM元件
双击原理图编辑窗口,在弹出的元件选择对话框的“Libraries”栏目中,单击“mege-functions”选项,并选择“arithmetic”的“lpm_counter”(计数器)LPM元件,如图5-41所示。根据要求对计数器的端口进行选择与参数设置,本例完成的“lpm_counter”宏功能计数器元件如图5-42所示。
图5-41 LPM_COUNTER元件选择对话框
5.编辑和编译正弦波发生器顶层设计文件
在原理图编辑窗口中加入只读存储器data_rom和计数器counter6元件后,再加入设计电路的输入和输出元件,按照正弦信号发生器原理图完成电路中的连线。并以“singt.bdf”作为顶层文件名将设计文件保存于工程目录中,并通过QuartusⅡ的编译。
图5-42 定制完成的COUNTER元件
6.仿真顶层设计文件
为正弦波信号发生器建立仿真文件并进行仿真,仿真波形输出的数据就是在存储器初始化数据文件中加入的(正弦波信号发生器)数据,如图5-43所示。
图5-43 正弦波信号发生器的仿真波形
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。