版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EDA技术实用教程第6章宏功能模块与IP应用
LPM是LibraryofParameterizedModules(参数可设置模块库)的缩写,Altera提供的可参数化宏功能模块和LPM函数均基于Altera器件的结构做了优化设计。在许多实际情况中,必须利用宏功能模块才可以使用一些Ahera特定器件的硬件功能。例如各类片上存储器、DSP(DigitalSignalProcessing)模块、LVDS(Low-VoltageDifferential(差分)Signaling)驱动器、嵌入式PLL(phase-lockedloop)以及SERDES[Serializer(串行化)/deserializer(并行化)]和DDIO电路模块等,这些可以以图形或硬件描述语言模块形式方便调用的宏功能块,使得基于EDA技术的电子设计的效率和可靠性有了很大的提高。设计者可以根据实际电路的设计需要,选择LPM库中的适当模块,并为其设定适当的参数,就能满足自己的设计需要,从而在自己的项目中十分方便地调用优秀的电子工程技术人员的硬件设计成果。1/456.1宏功能模块概述
KX康芯科技算术组件
累加器、加法器、乘法器和LPM算术函数
门电路多路复用器和LPM门函数I/O组件时钟数据恢复(CDR)、锁相环(PLL)、双数据速率(DDR)、千兆位收发器块(GXB)、LVDS接收器和发送器、PLL重新配置和远程更新宏功能模块存储器编译器FIFOPartitioner、RAM和ROM宏功能模块存储组件存储器、移位寄存器宏模块和LPM存储器函数
Altera提供多种方法来获取Altera
MegafunctionPartners(伴侣)Program(AMPP)和MegaCore宏功能模块,这些函数经严格的测试和优化,可以在Altera特定器件结构中发挥出最佳性能。使用这些知识产权的参数化模块减少设计和测试的时间。MegaCore和AMPP宏功能模块包括应用于通信、数字信号处理(DSP)、PCI和其他总线界面,以及存储器控制器中的宏功能模块。26.1宏功能模块概述
KX康芯科技6.1.1知识产权核的应用
AMPP程序
MegaCore函数
OpenCore评估功能
OpenCorePlus硬件评估功能
为了使用OpenCore和OpenCorePlus功能块,可以在获得使用许可和购买之前免费下载和评估AMPP和MegaCore函数。Altera提供以下程序、功能模块和函数,协助用户在QuartusII和EDA设计输入工具中使用IP函数:
OpenCore宏功能模块是通过OpenCore评估功能获取的MegaCore函数。Altera
OpenCore功能允许在采购之前评估AMPP和MegaCore函数。也可以使用OpenCore功能编译、仿真设计并验证设计的功能和性能,但不支持下载文件的生成(只能仿真)。
OpenCorePlus评估功能通过支持免费RTL仿真和硬件评估来增强OpenCore评估功能。RTL仿真支持用于在设计中仿真MegaCore函数的RTL模型。硬件评估支持用于为包括Altera
MegaCore函数的设计生成时限编程文件。可以在决定购买MegaCore函数的许可之前使用这些文件,进行板级设计验证。OpenCorePlus功能支持的MegaCore函数包括标准OpenCore版本和OpenCorePlus版本。OpenCorePlus许可用于生成时限编程文件,但不生成输出网表文件(无法编程下载目标芯片)。
AMPP程序可以支持第三方供应商,以便建立QuartusII配用的宏功能模块。AMPP合作伙伴提供了一系列为Altera器件实行优化的现成宏功能模块。AMPP函数的评估期由各供应商决定。可以从Altera网站/ipmegastore上的IPMegaStore下载和评估AMPP函数。
MegaCore函数是用于复杂系统级函数的预验证HDL设计文件,并且可以使用MegaWizardPlug-InManager进行完全参数化设置。MegaCore函数由多个不同的设计文件组成,用于实施设计综合后AHDL(Altera的HDL)包含文件和为使用EDA仿真工具进行设计和调试而提供的VHDL或VerilogHDL功能仿真模型。36.1宏功能模块概述
KX康芯科技6.1.2使用MegaWizardPlug-InManager
<输出文件>.bsf
:BlockEditor中使用的宏功能模块的符号(元件)。
<输出文件>.cmp
:组件申明文件。
<输出文件>.inc
:宏功能模块包装文件中模块的AHDL包含文件。
<输出文件>.tdf
:要在AHDL设计中实例化的宏功能模块包装文件。
<输出文件>.vhd
:要在VHDL设计中实例化的宏功能模块包装文件。
<输出文件>.v
:要在VerilogHDL设计中实例化的宏功能模块包装文件。
<输出文件>_bb.v
:VerilogHDL设计所用宏功能模块包装文件中模块的空体或
black-box申明,用于在使用EDA综合工具时指定端口方向。
<输出文件>_inst.tdf
:宏功能模块包装文件中子设计的AHDL例化示例。
<输出文件>_inst.vhd
:宏功能模块包装文件中实体的VHDL例化示例。
<输出文件>_inst.v
:
宏功能模块包装文件中模块的VerilogHDL例化示例。
MegaWizardPlug-InManager(宏向导插件管理器)可以帮助用户建立或修改包含自定义宏功能模块变量的设计文件,然后可以在顶层设计文件中对这些文件进行例化。这些自定义宏功能模块变量是基于Altera提供的宏功能模块,包括LPM(参数模块库)、MegaCore和AMPP(宏编程伴侣)函数。MegaWizardPlug-InManager运行一个向导,帮助用户轻松地为自定义宏功能模块变量指定选项。该向导用于为参数和可选端口设置数值。也可以从Tools菜单或从原理图设计文件中打开MegaWizardPlug-InManager,还可以将它作为独立实用程序来运行。以下列出了MegaWizardPlug-InManager为用户生成的每个自定义宏功能模块变量而生成的文件。46.1宏功能模块概述
KX康芯科技6.1.3在QuartusII中对宏功能模块进行例化
1、在VerilogHDL和VHDL中例化
2、使用端口和参数定义
3、使用端口和参数定义生成宏功能模块
计数器乘-累加器和乘-加法器加法/减法器RAM乘法器移位寄存器
对宏功能模块例化的途径有多种,如可以在BlockEditor(原理图)中直接例化;在HDL代码中例化(通过端口和参数定义例化,或使用MegaWizardPlug-InManager对宏功能模块进行参数化并建立包装文件);也可以通过界面,在QuartusII中对Altera宏功能模块和LPM函数进行例化。
Altera推荐使用MegaWizardPlug-InManager对宏功能模块进行例化以及建立自定义宏功能模块变量。此向导将提供一个供自定义和参数化宏功能模块使用的图形界面,并确保正确设置所有宏功能模块的参数。可以使用MegaWizardPlug-InManager建立宏功能模块或自定义宏功能模块变量。再利用MegaWizardPlug-InManager建立包含宏功能模块实例的VerilogHDL或VHDL包装文件,然后,可以在设计中使用此文件。对于VHDL宏功能模块,MegaWizardPlug-InManager还建立组件申明文件。可以采用或调用任何其他模块或组件相类似方法调用函数,直接在VerilogHDL或VHDL设计中对宏功能模块进行例化。在VHDL中,还需要使用组件申明。
QuartusIIAnalysis&Synthesis可以自动识别某些类型的HDL代码和生成相应的宏功能模块。由于Altera宏功能模块已对Altera器件实行优化,并且性能要好于标准的HDL代码;因此QuartusII可以使用生成方法。对于一些体系结构特定的功能;例如RAM和DSP模块,必须使用Altera宏功能模块。QuartusII在综合期间将以下逻辑映射到宏功能模块:56.2.1LPM_COUNTER计数器模块文本文件的调用
QuartusII中含有大量的功能强大的LPM模块。本节通过介绍一个LPM计数器LPMCOUNTER的调用方法、流程的测试,给出MegaWizardPlug-InManager管理器对同类宏模块的一般使用方法。主要介绍调用方法上的不同之处和不同特性的仿真测试方法。6.2LPM计数器模块使用方法
(1)打开宏功能块调用管理器。首先建立一个文件夹,例如d:\PM_MD。选择Tools->MegaWizardPlug-InManager命令,打开如图6-1所示的对话框,选中Createanewcustommegafuncfionvariation单选按钮,定制一个新的模块。如果要修改已编辑好的LPM模块,则选中Editanexistingcustommegafunctionvariation单选按钮。如果要拷贝已编辑好的LPM模块,选copy…。图6-1定制新的宏功能块
66.2.1LPM_COUNTER计数器模块文本文件的调用
6.2LPM计数器模块使用方法
单击图6-1的Next按钮后,打开如图6-2所示的对话框。左栏中有各类功能的LPM模块选项目录。单击算术项Arithmetic,展示LPM算术模块选项。选择计数器LPM_COUNTER。再于右上选择CycloneIII器件系列和VHDL语言方式。最后键入文件存放的路径和文件名:d:\LPM_MD\CNT4B,单击Next按钮。图6-2LPM宏功能块设定最后生成的CNT4B.vhd文件是对参数可设置宏模块库中的LPM_COUNTER例化调用的顶层文件。并将CNT4B.vhd放在当前工作库D:\PM_CNT中。76.2.1LPM_COUNTER计数器模块文本文件的调用
6.2LPM计数器模块使用方法
(2)在图6-2单击Next按钮后打开如图6-3所示的对话框。在对话框中选择4位计数器,选择“Createanupdowninput…”,使计数器有加减控制功能。最后单击Next按钮。图6-3设4位可加减计数器86.2.1LPM_COUNTER计数器模块文本文件的调用
6.2LPM计数器模块使用方法
(3)在图6-3单击Next按钮,打开如图6-4所示的对话框。在此若选择Plainbinary则表示是普通二进制计数器;现在选择Modulus…12,即模12计数器,从0计到11。然后选择时钟使能控制ClockEnable和进位输出Carry-out。图6-4设定模12计数器,含时钟使能和进位输出96.2.1LPM_COUNTER计数器模块文本文件的调用
6.2LPM计数器模块使用方法
(4)在图6-4单击Next按钮,打开如图6-5所示的对话框。在此选择4位数据同步加载控制Load和异步清零控制Clear。
最后按Next按钮后就结束设置。以上设置生成了LMP计数器模块的VHDL文件CNT4B.vhd;CNT4B.vhd可被高一层次的VHDL程序作为计数器元件调用。图6-5加入4位并行数据预置功能
106.2.1LPM_COUNTER计数器模块文本文件的调用【例6-1】QuartusII生成的计数器文件CNT4B.vhd。
LIBRARYieee;USEieee.std_logic_1164.all;LIBRARYlpm;--打开LPM库
USElpm.all;--打开LPM程序包
ENTITYCNT4BIS--异步清零、时钟使能、时钟输入、同步预置数加载控制、加减控制
PORT(aclr,clk_en,clock,sload,updown:INSTD_LOGIC;data:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位预置数
cout:OUTSTD_LOGIC;--进位输出
q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--计数器输出
ENDCNT4B;ARCHITECTURESYNOFcnt4bISSIGNALsub_wire0:STD_LOGIC;--进位结点
SIGNALsub_wire1:STD_LOGIC_VECTOR(3DOWNTO0);--计数器结点
COMPONENTlpm_counter--以下是参数传递说明语句
GENERIC(lpm_direction,lpm_port_updown,lpm_type:STRING;--定义字符串类型
lpm_modulus,lpm_width:NATURAL);--定义正整数类型生成的VHDL文件CNT4B.vhd(例6-1)只是调用了更底层(LPM程序包)的计数器元件模块文件。从文件可以看出更核心的计数器设计模块是LPM库中LPM程序包的lpm_counter。它是一个可以设定参数的封闭的模块,用户看不到内部设计,只能通过参数传递说明语句将用户设定的参数通过文件CNT4B.vhd传递进lpm_counter中。而CNT4B.vhd本身又可以作为一个底层元件被上层设计调用或例化。对于参数传递语句的语法内容可参阅第9.1节。116.2.1LPM_COUNTER计数器模块文本文件的调用【例6-1】QuartusII生成的计数器文件CNT4B.vhd。
接上页
PORT(sload,clk_en,aclr,clock,updown:INSTD_LOGIC;
cout:OUTSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(3DOWNTO0);data:INSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;BEGIN
cout<=sub_wire0;q<=sub_wire1(3DOWNTO0);
lpm_counter_component:lpm_counterGENERICMAP(--参数传递例化语句
lpm_direction=>"UNUSED",--单方向计数参数未用
lpm_modulus=>12,--定义模12计数器
lpm_port_updown=>"PORT_USED",--使用加减计数
lpm_type=>"LPM_COUNTER",--计数器类型
lpm_width=>4)--计数位宽
PORTMAP(sload=>sload,clk_en=>clk_en,aclr=>aclr,clock=>clock,data=>data,updown=>updown,cout=>sub_wire0,q=>sub_wire1);ENDSYN;例6-1中,lpm_counter是LPM库中调用的宏模块元件名。lpm_Counter_component是调用lpm_counter的宏模块元件例化名;其中的lpm_direction等称为宏模块参数名,是被调用的元件(lpm_counter)文件中己定义的参数名,而UNUSED等是参数值,它们可以是整数、操作表达式、字符串或在当前模块中已定义的参数。使用时注意GENERIC语句只能将参数传递到比当前层次仅低一层的元件文件中。12
【例6-2】设计例化CNT4B.vhd的顶层程序CNT4BIT.vhdLIBRARYieee;USEieee.std_logic_1164.all;LIBRARYlpm;--打开LPM库
USElpm.all;--打开LPM程序包
ENTITYCNT4BITIS--异步清零、时钟使能、时钟输入、同步预置数加载控制、加减控制
PORT(CLK,RST,ENA,SLD,UD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位预置数
COUT:OUTSTD_LOGIC;--进位输出
DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--计数器输出
ENDENTITYCNT4BIT;ARCHITECTUREtranslatedOFCNT4BITISCOMPONENTCNT4B
PORT(aclr,clk_en,clock,sload,updown:INSTD_LOGIC;data:INSTD_LOGIC_VECTOR(3DOWNTO0);
cout:OUTSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;BEGINU1:CNT4BPORTMAP(sload=>SLD,clk_en=>ENA,aclr=>RST,cout=>COUT,clock=>CLK,data=>DIN,updown=>UD,q=>DOUT);ENDARCHITECTUREtranslated;
为了能调用计数器文件CNT4B.vhd,并测试和硬件实现它,必须设计例6-2程序CNT4BIT.vhd来申明、例化调用CNT4B.vhd
。136.2.2创建工程与仿真测试6.2LPM计数器模块使用方法
按照第4章介绍的流程将例6-2设定为顶层工程文什,并对其仿真。图6-6是其仿真波形,注意第2个SLD加载信号在没有CLK上升沿处发生时,无法进行加载,显然它是同步的。从波形中可以了解此计数器模块的功能和性能。图6-6例6-2的CNT4BIT仿真波形为例6-2的CNT4BIT创建工程146.2.2创建工程与仿真测试6.2LPM计数器模块使用方法
按照第4章介绍的方法,首先建立一个空的原理图顶层文件,并将其创建为工程文件。然后在原理图编辑窗中打开如图4-41的窗口,选择此窗口左下的MegaWizardPlug-InManager按钮,按照本章以上的流程即能编辑生成一个计数器原理图元件文件CNT4B.bsf;.bsf是BlockSchematicFile的意思。将此元件调入原理图编辑窗就能编辑如图6-7所示的计数器电路。仿真结果应该与图6-6相同。图6-7原理图输入设计15图6-88位乘法累加器顶层设计6.3基于LPM的流水线乘法累加器设计KX康芯科技乘法累加器常在全硬件的数字信号处理的不同算法中用到。本节通过一个8位流水线乘法累加器的实例介绍以顶层原理图为工程,VHDL文本描述和宏功能块为原理图元件的输入和(混合)设计方法。图6-8是最终的原理图顶层设计。包含三种LPM模块,即寄存器LPM模块、流水线加法器LPM模块和流水线乘法器LPM模块。以下分刖介绍这些模块的调用。166.3.1LPM加法器模块设置调用6.3基于LPM的流水线乘法累加器设计图6-9从原理图编辑窗进入MegaWizardPlug-InManager管理器首先打开一个原理图编辑窗,存盘取名为MULTADD,然后将它创建成工程。再次进入本工程的原理图输入对话框后,单击左下的MegaWizardP1ug-InManager管理器按钮,根据上节介绍的流程进入图6-9所示的LPM模块编辑调用窗。17图6-10选择16位加法工作方式
6.3.1LPM加法器模块设置调用6.3基于LPM的流水线乘法累加器设计在进入图6-2所示的窗口下,选择LPM_ADD_SUB加减法器模块,再选择CycloneIII和VHDL;文件名可取为ADD16B。进入以后的对话框后分别选择16位加法器工作模式(图6-10),选择有加法进位输出;选择有符号加法方式(图6-11);选择2级流水线工作方式(图6-12);这时模块出现一条时钟输入线,即变成了有时序电路的模块。最后按Finish按钮即可将此加法器调入原理图编辑窗。186.3.2LPM乘法器模块设置调用6.3基于LPM的流水线乘法累加器设计流程同上。在进入图6-2所示的窗口下,选择LPM_MULT乘法器模块,文件名可取为MULT8B。在图6-13的对话框,选择有符号乘法工作方式;选择嵌入式专用硬件乘法器模块,即选择“Usededicatedmultiplie...”;调用专用乘法器,工作速度高,且不耗费逻辑宏单元。
进入图6-14所示对话框后,选择2级流水线工作方式(实际只一级)。最后将完成设置的乘法器模块加入图6-8所示的原理图中。19图6-88位乘法累加器顶层设计8位LPM寄存器模块FF8B设置6.3.2LPM乘法器模块设置调用6.3基于LPM的流水线乘法累加器设计在图6-2所示的窗中,于左栏中选择Storage中的LPM_FF即可调入寄存器模块:FF8B。最后根据图6-8,连接好电路图,准备全程编译和仿真测试。206.3.3乘法累加器的仿真测试6.3基于LPM的流水线乘法累加器设计以上工程MULTADD的仿真波彤如图6-15所示。由波形可见,在CLK的第4个上升沿后才得到第一个计算数据,之前都是0,这就是流水线计算结构的结果。
第4个上升沿后得到结果为S=0×0+23×15=345,而第5个上升沿后得到结果为S=23×15+11×22=587,第6个上升沿后得到结果为S=11×22+33×45=1727。图6-15电路图6-8的MULTADD工程仿真波形00T0T1T2T3T4分析:T0——准备好前一组数据。
T1——触发前一组数据锁存,准备好当前数据。
T2——触发前一组数据和当前数据分别相乘。
T3——缓冲
T4——触发前一组数据积和当前数据积相加。(从触发相乘T2到触发相加T4经过2个时钟)216.3.3乘法累加器的仿真测试6.3基于LPM的流水线乘法累加器设计图6-16是对于图6-13在进行不同选项后,编译给出资源使用情况。在图6-13的窗口选择Uselogicelements,生成图6-16右侧的数据,表明乘法器全部使用逻辑宏单元LE,共占用238个LE。若选择图6-13其余两项中的任一项都将得到图6-16左侧的数据报告,数据表明,使用了2个嵌入式乘法器,而LE只耗用了50个。图6-16对乘法器的构建模式选择不同设置后的编译报告图6-13选择专用乘法器模块构建乘法器
226.3.3乘法累加器的仿真测试6.3基于LPM的流水线乘法累加器设计其实,本设计项目可以直接用LPM库的乘法累加器模块ALTMULT_ADD实现,其参数设置窗如图6-17所示。图6-17ALTMULT_ADD模块设置对话框
23
【例6-3】两个8位乘8位的有符号数乘法器VHDL描述。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_SIGNED.ALL;ENTITYMULT8ISPORT(A1,B1,A2,B2:INSIGNED(7DOWNTO0);--定义有符号位矢
R1,R2:OUTSIGNED(15DOWNTO0));END;ARCHITECTUREbhvOFMULT8ISBEGINR1<=A1*B1;R2<=A2*B2;ENDbhv;6.3基于LPM的流水线乘法累加器设计KX康芯科技6.3.4乘法器的VHDL文本表述和相关属性设置本节探讨文本表述的乘法器。例6-3是两个8位乘8位的有符号数乘法器VHDL描述。如果仅按照普通的方法进行综合,综合出的乘法器一定会占用大量的逻辑资源,而且运行速度不见得快。24图6-18a例6-3的编译报告图6-18设置乘法器用DSP模块构建6.3.4乘法器的VHDL文本表述和相关属性设置6.3基于LPM的流水线乘法累加器设计在FPGA开发中,最常用的方法是直接调用FPGA内部已嵌入的硬件乘法器(DSP模块);可以通过QuartusII来设置使用DSP模块。方法是先进入图4-6的Settings窗,在左栏选择Analysis&SynthesisSettings项,在其右边对话框中按Moreettings按钮,在弹出的对话框(图6-18)中对DSPBlockBalancing项选择DSPblocks,即用DSP乘法器模块构建。
例6-3全程编译后的报告如图6-18a所示。其中用了两个9位DSP模块,0个逻辑宏单元。此项设计高速,且节省逻辑资源。25
【例6-4】两个8位乘8位的有符号数乘法器VHDL描述(带DSP模块属性设置)。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_SIGNED.ALL;ENTITYMULT8ISPORT(A1,B1,A2,B2:INSIGNED(7DOWNTO0);--定义有符号位矢
R1,R2:OUTSIGNED(15DOWNTO0));END;ARCHITECTUREbhvOFMULT8ISattributemultstyle:string;attributemultstyleofR1,R2:signalis“DSP”;BEGINR1<=A1*B1;R2<=A2*B2;
ENDbhv;图6-19例6-4的编译报告6.3基于LPM的流水线乘法累加器设计6.3.4乘法器的VHDL文本表述和相关属性设置如果不用上述设置,例6-4利用定义DSP模块属性的方法调用DSP模块。例6-4(定义DSP模块属性)编译报告入图6-19所示。其中用了2个9位DSP模块,0个逻辑宏单元。261.建立.mif格式文件(多种方法)
(1)直接编辑法6.4LPM随机存储器的设置和调用6.4.1存储器初始化文件生成图6-20MIF文件编辑窗在涉及RAM和ROM等存储器应用的EDA设计开发中,调用LPM模块类存储器是最方便、最经济、最高效和性能最容易满足设计要求的途径。本节介绍利用QuartusII调用LPMRAM的方法和相关技术,包括仿真测试、初始化配置文件生成、例化程序表述、属性应用以及存储器的纯VHDL语言描述等。存储器的初始化文件是可调出存于RAM或ROM中的数据或程序代码文件。通过EDA工具设计(或设定的存储器中代码)的文件,由EDA软件在统一编译时自动调入;此类初始化代码文件格式必须满足一定的要求。
QuartusII能接受两种格式初始化文件:MemoryInitializationFile(.mif)格式和Hexadecimal(Intel-Format)File(.hex)格式。
(1)直接编辑法。首先在QuartusII中打开MIF文件编辑窗,即选择File->New命令,在New窗中选择MemoryFile栏的MemoryInitializationFile项,单击OK按钮后,打开MIF数据文件大小选择窗口;在此根据存储器地址和数据宽度选择参数(如地址线为7位,选单元数Number为128;数据宽为8位,选择Wordsize为8位);按OK钮,将出现如图6-20所示的.mif数据表格;表格中的数据格式可通过右击窗口边缘的地址数据所弹出的窗口中选择。此表中任一数据对应的地址为左列与顶行数之和。填完后,选择File->SaveAs命令,保存此数据文件,取名为data7X8.mif保存。单元地址=18+1data7x8.mif27(2)文件编辑法
【例6-5】使用QuartusII以外的编辑器设计MIF文件。
DEPTH=128;;数据深度,即存储的数据个数
WIDTH=8;;输出数据宽度
ADDRESS_RADIX=HEX;;地址数据类型,HEX表示选择十六进制数据类型
DATA_RADIX=HEX;;存储数据类型,HEX表示选择十六进制数据类型
CONTENT;此为关键词
BEGIN;此为关键词
0000:0080;0001:0086;0002:008C;……(数据略去)007E:0073;007F:0079;END;6.4LPM随机存储器的设置和调用6.4.1存储器初始化文件生成
(2)文件编辑法。即使用QuartusII以外的编辑器设计MIF文件,其格式如例6-5所示。其中地址和数据都为十六进制,冒号左边是地址值,右边是对应的数据;并以分号结尾。存盘以mif为后缀,如取名为:data7X8.mif。286.4LPM随机存储器的设置和调用KX康芯科技6.4.1存储器初始化文件生成(3)C语言等软件生成
(打开目录)【例6-6】用C语言程序生成正弦波波点数据值
#include<stdio.h>#include"math.h"main(){inti;floats;
for(i=0;i<1024;i++){s=sin(atan(1)*8*i/1024);
//atan(1)*8=(π/4)*8=2π,sin(2π*i/1024)
printf(“%d:%d;\n”,i,(int)((s+1)*1023/2));//当s=-1~1,波点值=0~1023}}
(用工具软件“正弦表.exe”产生波点数据)
.mif格式文件波点可用C语言程序生成;如例6-6是产生正弦波数据值的程序。把例6-6程序编译后,在DOS命令行下执行命令:
romgen>sin_rom.Mif;
将生成sin_rom.mif文件,再加上.mif文件的头部说明即可。假设romgen是编译后的程序名。此外,也可以用MATLAB和DSPBuilder生成此文件。
WIDTH=8;DEPTH=64;ADDRESS_RADIX=HEX;
DATA_RADIX=HEX;CONTENTBEGIN296.4LPM随机存储器的设置和调用KX康芯科技6.4.1存储器初始化文件生成(4)专用MIF文件生成器图6-21利用康芯MIF生成器生成MIF正弦波数据文件
(4)专用MIF文件生成器。参考附录1.4的MIIF文件生成器的用法,可生成不同波形、不同数据格式、不同符号(有无符号)、或不同相位的MIF文件。例如某ROM的数据线宽为8位,地址线宽为7位,即可以放置128个8位数据。或者说,如果需要将一个周期分为128个点,每个点精度为8位二进制数的,初始相位为0度的正弦信号波数据,放在ROM或RAM中,则此初始化文什应该如图6-21的设置。
以文件data7XS.mif存盘。用记事本打开此文件将如图6-22所示。图6-22打开MIF文件306.4LPM随机存储器的设置和调用KX康芯科技6.4.1存储器初始化文件生成2.建立.hex格式文件
第一种方法与以上介绍的方法相同,只是在New窗口中选择Otherfiles项后,选择Hexadecimal(Intel-Format)File项,选ROM的数据数Number为64,数据宽Wordsize取8位;输入数据;最后存盘.hex格式文件。
31KX康芯科技2.建立.hex格式文件
第二种方法是用普通8051单片机KEIL编译器来产生。方法是利用汇编程序编辑器将此64个数据编辑于如图7-3所示的编辑窗口中,然后用单片机ASM编译器产生.hex格式文件。在此不妨取名为sdata.asm,编译后得到sdata.hex文件。
图6-23用汇编器生成HEX文件326.4LPM随机存储器的设置和调用6.4.2LPM_RAM的设置和调用首先仍打开一个原理图编辑窗,存盘取名为RAMMD,将它创建成工程。进入本工程的原理图输入对话框,单击左下的MegaWizardPlug-InManager管理器按钮,进入图6-24所示的LPM模块编辑渊用窗。在这里的左栏选择MemoryCompiler项下的单口RAM模块,即RAM:1-PORT。文件取名为RAM1P,存在DALPMMD中。图6-24调用单口LPMRAM
336.4LPM随机存储器的设置和调用6.4.2LPM_RAM的设置和调用单击Next按钮后打开如图6-25所示的对话框。选择好数据位8,数据深度128,即7位地址线。对应CycloneIII,存储器构建方式选择M9K,以及选择双时钟方式。图6-25设定RAM参数346.4LPM随机存储器的设置和调用6.4.2LPM_RAM的设置和调用
在图6-25下单击Next按钮后,打开如图6-26所示的对话框。在这里消去选项“qoutputport”的勾,即选择时钟只控制锁存输入信号。
在图6-26下单击Next按钮后,打开如图6-27所示的对话框。这里的选项有三个:OldData、NewData和Don'tCare。即当允许同时读写时,是读出新写入的数据(NewData)还是写入前的数据(OldData),还是无所谓(Don'tCare),这里选择OldData。图6-26设定RAM仅输入时钟控制
图6-27设定在写入同时读出原数据356.4LPM随机存储器的设置和调用6.4.2LPM_RAM的设置和调用
在图6-27下单击Next按钮后,打开如图6-28所示的对话框。在图6-28中的Doyouwanttospecifytheinitialcontentofthememory栏中选中“Yes,usethisfileforthememorycontentdate”,并单击Browse按钮,选择指定路径上的初始化文件DATA7X8.mif(每次上电自动载MIF文件)。在下面选中“AllowIn-SystemMemory…”复选框,并在TheInstanceIDofthisRAMis文本框中输入MYRM(作ID名,用于区分多个嵌入的LPM_RAM)。这样,可允许QuartusII通过JTAG口对下载到FPGA中的RAM进行“在系统”测试和读写。图6-28设定初始化文件和允许在系统编辑
图6-26/27/28的设定操作366.4LPM随机存储器的设置和调用6.4.2LPM_RAM的设置和调用最后单击图6-28中的NEXT按钮,再单击Finish按钮后完成RAM定制。调入顶层原理图后连接好端口引脚,如图6-29所示。图6-29在原理图上连接好的RAM模块
376.4LPM随机存储器的设置和调用6.4.2LPM_RAM的设置和调用图6-29aCycloneII器件涉及LPM_RAM模块使用的设置(未设置,编译出错)
应注意的是,对于CycloneII器件,凡是涉及RAM的LPM模块(M4K)使用,都必须做如下设置(否则,无法通过编译):在菜单Assignments中选择setting项,在弹出图6-35a对话框中选中Analysis&SynthesisSettings下的DefaultParameters项。在此,在Name栏键入CYCLONEII_SAFE_WRITE;在Defaultsetting栏键入VERIFIED_SAFE,并分别按Add和下方OK按钮后关闭Settings窗口。386.4LPM随机存储器的设置和调用6.4.3对LPM_RAM仿真测试现在对图6-29所示的RAM模块进行测试,主要是了解其各信号线的功能和加载于其中的初始化文件数据是否成功。图6-30图6-29的RAM的仿真波形图6-30是此模块的仿真波形图。地址A是从0开始的,当WREN=0(读)和进入WREN=1(写)期间,可以读出初始化RAM中的数据;正好与图6-20和图6-23的数据相符;说明初始化数据能被正常调入。写后又读出新的内容。39
【例6-7】利用时钟的双边沿控制数据读写的VHDL存储器程序设计。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;--此程序包括含转换函数CONV_INTEGERlA)USEIEEE.STD_LOGIC_UNSIGNED.ALL;--此程序包包含算符重载函数
ENTITYRAM78ISPORT(CLK:INSTD_LOGIC;--定义时钟
WREN:INSTD_LOGIC;--定义写允许控制
A:INSTD_LOGIC_VECTOR(6DOWNTO0);--定义RAM的7位地址输入端口
DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);--定义RAM的8位数据输入端口
Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--定义RAM的8位数据输出端口
END;
接下页6.4LPM随机存储器的设置和调用6.4.4VHDL的存储器描述及相关属性
利用VHDL语言可以直接描述RAM/ROM等存储器。例6-7是以上RAM模块的纯VHDL描述,即在程序中没有调用或例化任何现成的实体模块。40
【例6-7】利用时钟的双边沿控制数据读写的VHDL存储器程序设计。
接上页
ARCHITECTUREbhvOFRAM78ISTYPEG_ARRAYISARRAY(0TO127)OFSTD_LOGIC_VECTOR(7DOWNTO0);SIGNALMEM:G_ARRAY;--定义信号MEM的数据类型为用户新定义的类型G_ARRAYBEGINPROCESS(CLK)BEGINIFRISING_EDGE(CLK)THENIFWREN='1'THEN--如果时钟有上升沿出现,且写使能为高电平,则
MEM(CONV_INTEGER(A))<=DIN;--RAM数据口的数据被写入指定地址的单元
ENDIF;ENDIF;IF(FALLING_EDGE(CLK))THEN--如果时钟有下降沿出现,则
Q<=MEM(CONV_INTEGER(A));--读出存储器中的数据
ENDIF;ENDPROCESS;ENDBHV;6.4.4VHDL的存储器描述及相关属性例6-7是一个利用时钟的双边沿控制数据读写的VHDL存储器描述程序。在时钟的上升沿(并且WREN=‘1’)将数据写入存储器;而在同一时钟的下降沿将存储器中的数据读出。两边沿不对同一信号进行赋值可综合。例6-7是利用用户自定义数据类型语句来实现存储器描述的,其中还用到了数据类型转换函数CONV_INTEGER(A)(将STD逻辑矢量转换成整数类型)。416.4LPM随机存储器的设置和调用
1.限定性数组型数据类型定义
TYPE数组名ISARRAY(数组范围)OF基本数据类型;
TYPEstbISARRAY(7DOWNTO0)ofSTD_LOGIC;TYPEMATRIXISARRAY(127DOWNTO0)ofSTD_LOGIC_VECTOR(7DOWNTO0);TYPEG_ARRAYISARRAY(0TO127)OFSTD_LOGIC_VECTOR(7DOWNTO0);SIGNALMEM:G_ARRAY;6.4.5数据类型定义语句由库程序包提供的标准数据类型有整数类型INTEGER、布尔类型BooLEAN、逻辑位类型STD_LOGIC等。此外,VHDL还允许用户自行定义新的数据类型。在标准数据类型的基础上,由用户定义的数据类型可有多种;如枚举类型(EnumerationTypes)、整数类型(IntegerWypes)、数组类型(ArrayTypes)、记录类型(RecordTypes)、时间类型(TtimeTypes)、实数类型(RealTypes)等。用户自定义数据类型是用类型定义语句TYPE和子类型定义语句SUBTYPE实现的。
TYPE语句最常用的用法有如下两种,第一种属于数组型数据类犁定义语句,第二种属于枚举型数据类型定义语句。数组类型又分限定性数组和非限定性数组类型。它们的区别是,限定性数组下标的取值范围在数组类型定义时就被确定了,而非限定性数组下标的取值范围在由数组类型定义数组时确定。数组类型属复合类型,是将一组具有相同数据类型的元素集合在一起,作为一个对象来处理的数据类型。
VHDL仿真器支持多维数组,VHDL综合器通常只支持一维和二维数组。数组的元素可以是任何一种数据类型;用以定义数组元素的下标范围的子句决定了数组中元素的个数;以及元素的排序方向,即下标数是由低到高,或是由高到低。如子句“0TO7”是由低到高排序的8个元素;“15DOWNTO0”是由高到低排序的16个元素。限定性数组定义语句格式:
“数组名”是新定义的限定性数组类型的名称是由设计者自定标识符;该标识符将作为定义的新数据类型之用。数组的数据类型即为数组元素相同的数据类型。
“数组范围”指出数组元素的定义数量和排序方式,并以整数来表示其数组的下标。
“基本数据类型”定义各元素的基本数据类型,一般都取标准的预定义数据类型;如BIT、STD_LOGIC或INTEGER等。示例:这个数组类型的名称是stb,它有8个元素,它的下标排序(仿真显示高位在左)是7、6、5、4、3、2、1、0。各元素的排序是stb(7)、stb(6)…stb(0);数组中的每一个元素的数据类型都是标准逻辑位STD_LOGIC类型(将STD_LOGIC改为STD_LOGIC_VECTOR便成为二维数组类型
)。示例:此TYPE语句实际上定义了128个乘8位的矩阵数组类型MATRIX,它包含元素8×16=128个,每个元素的数据类型都是STD_LOGIC。例6-7:第一句首先定义了一个二维的数据类型G_ARRAY,其元素是128个乘8位。
第二条语句定义了信号MEM数组对象,规定MEM的数据类是G_ARRAY。于是信号MEM有128个单元:MEM(0)、MEM(1)、…、MEM(127)。每一个单元有8个基本位元素,如MEM(0)(B7、B6、…、b0);其中每一个基本单元位,如MEM(0)(bi)的数据类型都是标准逻辑位STD_LOGIC。于是,MEM的取值范围是128×8(=1024个单元位)。这实际上就是一个存储器,其存储深度是128,对应地址口线宽度为7;每一单元的数据宽度是8,对应存储器的数据口线宽度是8。因此这两句语句是VHDL定义存储器的典型语句。426.4LPM随机存储器的设置和调用
2.非限定性数组型数据类型定义
TYPE数组名ISARRAY(数组下标名RANGE<>)OF数据类型
Typebitis(‘0’,‘1’);Typebit_vectorisarray(naturalrange<>)ofbit;SIGNALaaa:bit_vector(0to9);6.4.5数据类型定义语句在数组类型定义时,不说明所定义的数组下标的取值范围;而在定义某一数据对象时,再由该数组类型临时为定义的数组对象指定下标取值范围。这样就可以通过同一个数组类型定义各数组对象时,各数组对象的下标取值范围不同。非限定性数组定义语句格式:
“数组名”是定义的非限定性数组类型的取名。“数组下标名”是以整数类型设定的一个数组下标名称,其中符号“<>”是下标范围待定符号;在数组对象定义时,再填入具体的数值范围。“数据类型”是数组中每一元素的数据类型。示例:先定义一个bit基本位的枚举数据类型。
然后在bit_vector类型的定义中,naturalrange<>表示元素的个数未定。其中natural是基本预定义类型自然数类型(取值范围是自然数0,1,2,3,…),由bit_vector定义对象的每个元素的数据类型为“bit”。
最后由bit_vector定义10个元素的数组aaa。43
3.枚举型数据类型定义
TYPE数据类型名IS(数据类型定义表述);
TYPEweekIS(sun,mon,tue,wed,tha,fri,sat);TYPExis(low,high);TYPEdata_busISARRAY(0T07,x)0fBIT;
TYPEm_stateIS(st0,st1,st2,st3,st4,st5);SIGNALpresent_state,next_state:m_state;6.4.5数据类型定义语句6.4LPM随机存储器的设置和调用
VHDL的枚举数据类型是一种特殊的数据类型,它们是用文字符号来表示一组二进制数。实际上,在VHDL中许多常用的预定义数据类型,如位(BIT)、布尔量(BOOLEAN)、字符(CHARACTER)及STD_LOGIC等都是程序包中已定义的枚举型数据类型。枚举数据类型的一般定义格式:
“数据类型名”就是用户用标识符命名的枚举型数锯类型名,其用法同预定义数据类型相同;而“数据类型定义表述”就是具体列出所定义的类型的表述办法与形式,各项用“,”分开。示例:首先定义x为2元素的枚举数据类型,然后将data_bus定义为一个有9个元素的数组类型,其中每一元素的数据类型都是预定义类型BIT。示例:对于状态机,其每一状态在实际电路中是以一组触发器的当前二进制数位的组合来表示的。为了更利于阅读、往往将表征每一状态的二进制数组用文字符号来代表,即所谓状态符号化。
先定义名为m_state的6状态的枚举数据类型。然后由m_state定义present_state和next_state的枚举数据类型的信号对象。它们的取值范围,从st1~st5,共六种状态;而在综合后这六种状态代表六组唯一的二进制数值,编码默认值为:st0="000",st1="001”,st2=“010",st3="011",st4="100",st5="100"。
示例:定义名为week的枚举(含有7元素)数据类型名。综合时,根据元素数据顶该类型的位数。类型的元素由一组文字符号表示,而在综合后,其中的每一文字都代表一个具体的数值,如可令sun="1010"。444.枚举型子类型数据类型定义
SUBTYPE子类型名IS基本数据类型RANGE约束范围;
SUBTYPEdigitsISINTEGERRANGE0to9;6.4.5数据类型定义语句6.4LPM随机存储器的设置和调用
枚举类型的子类型定义语句SUBTYPE只是由语句TYPE所定义的原数据类型的一个子集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型。枚举子类型数据类型的一般定义格式:
“子类型名”是用户定义的标识符名,其用法同预定义数据类型相同;而“基本数据类型”是库程序包中提供的标准数据类型;“约束范围”限定了子类型元素的值是基本类型的子集。示例:定义INTEGER的子类型digits,digits的值只有0~9。
事实上,在程序包STANDARD中,已有两个预定义子类型,即自然数类犁(NaturalType)和正整数类型(PositiveType),它们的基本数据类犁都是INTEGER。
由于子类型与其基本数据类型属同一数据类型,因此属于子类型的和属于基本数据类型的,其数据对象间的赋值和被赋值可以直接进行,不必进行数据类型的转换。利用子类型定义数据对象的好处是,除了使程序提高可读性和易处理性外,其实质性的好处还在于有利于提高综合的优化效率。这是因为综合器可以根据子类型所设的约束范围,有效地推出参与综合的寄存器的最合适的数目等优化措施。456.4.6存储器配置文件属性定义和结构设置6.4LPM随机存储器的设置和调用图6-31例6-7的RAM78的RTL图
如果对例6-7不作任何约束,直接综合,尽管也能编译出相应的存储器RAM,其RTL图如图6-3l所示,与图6-29类似。但它将耗用大量的逻辑资源。
图6-32即为例6-7无约束条件下的综合报告。其中使用了1344个逻辑宏单元,这其中的1032个触发器被用于构建此RAM的时序电路,而且可以断定,其每一存储单元都使用了一个D触发器来构建。而FPGA中的嵌入式RAM位一个没用。466.4.6存储器配置文件属性定义和结构设置6.4LPM随机存储器的设置和调用图6-33例6-7优化后的编译报告
如果限定例6-7在综合中使用嵌入式RAM位,则资源利用率将大为改观。方法是首先进入图6-18的对话框,在Existingoptionsettings栏选择AutoRAMReplacement项为On。全程编译后的报告将如图6-33所示,其中逻辑宏单元和寄存器的耗用为0,而嵌入式RAM位的占用是1024,恰好等于例6-7的MEM的单元数。47【例6-8】利用时钟的双边沿控制数据读写的VHDL存储器程序设计(含初始化文件调入)。
………
ARCHITECTUREbhvOFRAM78ISTYPEG_ARRAYISARRAY(0TO127)OFSTD_LOGIC_VECTOR(7DOWNTO0);SIGNALMEM:G_ARRAY;--定义信号MEM的数据类型为用户新定义的类型G_ARRAY
attributeram_init_file:string;--定义字符串属性的标识符ram_init_file。
attributeram_init_fileofMEM:--定义标识符ram_init_file是MEM的属性,
SIGNALIS”data7x8.mif”;--并将字符串"data7x8.mif"初始化赋给ram_init_file。
BEGIN
………6.4.6存储器配置文件属性定义和结构设置6.4LPM随机存储器的设置和调用
在例6-7基础上增加使用存储器配置初始化文件的属性定义的编程,并将data7x8.mif放存当前工程文件夹中,可有效实现存储器初始化文件MIF调入的问题。具体使用方法如例6-8(对例6-7的修改)所示。其中加入了初始化文件的属性定义语句,请注意它们放置的位置。加入后的仿真结果与图6-30完全相同。
使用RAM模块比较实用的方法是调用LPM库中现成的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版二手吊车转让与维修保养技术支持合同3篇
- 申请转让合同范例
- 套房水电合同范例
- 医院服务外包合同范例
- 房内装修合同范例
- 2024年深圳商业综合体商品房买卖合同书2篇
- 2024卫生院乡村医生定期聘用合同示范文本3篇
- 回收行业合同范例
- 抚宁租房合同范例
- 玉米购买合同范例
- cin宫颈上皮内瘤变的护理
- 提高患者出院随访率课件
- 精神科疾病的精神科诊断与治疗
- 医疗健康合作协议
- 戏剧表演社管理制度
- 水囊引产护理查房
- 2024届高考语文 语言文字运用 复习课件
- 2023年CQE客诉工程师年度总结及下年规划
- 2023年秋季国家开放大学-02272-数据结构(本)期末考试题带答案
- 有限空间消防水箱应急预案
- 江西省三新协同教研共同体2023-2024学年高一上学期12月联考物理试卷(解析版)
评论
0/150
提交评论