您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > 基于FPGA的典型开发系统设计实例--函数信号发生器
基于FPGA的典型开发系统设计实例--函数信号发生器落潇整理2013/11/26开篇:如果你还没有硬件平台,那么Quartus软件仿真也可以完成你的梦想。1.功能描述利用GW48-CK实验开发系统设计一个函数信号发生器,要求能够输出三角波、方波、梯形波、阶梯波等波形,可通过按键选择输出不同波形。2.设计思路函数信号发生器的原理框图如图1所示。FPGA芯片选用ACEX1K30TC144-3,D/A选用8位数模转换器DAC0832,滤波器采用有源滤波,GW48-CK实验开发系统选择模式5。图1多波形函数信号发生器原理框图3.系统程序设计首先采用VHDL语言分别编写锯齿波(斜降)、三角波、锯齿波(斜升)、阶梯波(上升)、正弦波、方波、梯形波、双阶梯波以及八选一数据选择器的程序,各程序如下:3.1锯齿波(斜降)程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;FPGA芯片D/A滤波器155ENTITYdcrsISPORT(clk,reset:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdcrs;ARCHITECTUREbehaveOFdcrsISBEGINPROCESS(clk,reset)VARIABLEtmp:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFreset='0'THENtmp:=11111111;ELSIFclk'EVENTANDclk='1'THENIFtmp=00000000THENTmp:=11111111;ELSEtmp:=tmp-1;ENDIF;ENDIF;q=tmp;ENDPROCESS;ENDbehave;3.2三角波程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdeltaISPORT(clk,reset:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdelta;ARCHITECTUREbehaveOFdeltaISBEGINPROCESS(clk,reset)VARIABLEtmp:STD_LOGIC_VECTOR(7DOWNTO0);VARIABLEa:STD_LOGIC;BEGINIFreset='0'THENtmp:=00000000;156ELSIFclk'EVENTANDclk='1'THENIFa='0'THENIFtmp=11111110THENtmp:=11111111;a:='1';ELSEtmp:=tmp+1;ENDIF;ELSEIFtmp=00000001THENtmp:=00000000;a:='0';ELSETmp:=tmp-1;ENDIF;ENDIF;ENDIF;q=tmp;ENDPROCESS;ENDbehave;3.3锯齿波(斜升)程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYicrsISPORT(clk,reset:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDicrs;ARCHITECTUREbehaveOFicrsISBEGINPROCESS(clk,reset)VARIABLEtmp:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFreset='0'THENtmp:=00000000;ELSIFclk'EVENTANDclk='1'THENIFtmp=11111111THEN157tmp:=00000000;ELSEtmp:=tmp+1;ENDIF;ENDIF;q=tmp;ENDPROCESS;ENDbehave;3.4阶梯波(上升)程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYladder_upISPORT(clk,reset:INSTD_LOGIC;q:OUTintegerRANGE0to255);--STD_LOGIC_VECTOR(7DOWNTO0));ENDladder_up;ARCHITECTUREbehaveOFladder_upISBEGINPROCESS(clk,reset)VARIABLEtmp,a:integer;--STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFreset='0'THENtmp:=0;a:=0;ELSIFclk'EVENTANDclk='1'THENifa=255thena:=0;elsea:=a+1;endif;caseaiswhen0to63=tmp:=0;when64to127=tmp:=85;when128to191=tmp:=170;when192to255=tmp:=255;whenothers=tmp:=0;endcase;ENDIF;q=tmp;158ENDPROCESS;ENDbehave;3.5正弦波程序LIBRARYIEEE;useieee.std_logic_arith.all;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSINISPORT(clk:INSTD_LOGIC;reset:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDSIN;ARCHITECTUREBEHAVOFSINISCOMPONENTSIN_ROMPORT(address:integerrange0to63;inclock:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;SIGNALQ1:integerrange0to63;BEGINPROCESS(clk)BEGINifreset='0'thenQ1=0;elsifCLK'EVENTANDCLK='1'THENQ1=Q1+1;ENDIF;ENDPROCESS;u1:SIN_ROMPORTMAP(inclock=clk,address=Q1,q=q);END;此正弦波形的产生方法是通过调用FPGA中的LPM兆功能块实现的。LPM是参数可设置模块,通过修改LPM模块的参数,可以获得不同的逻辑功能,而原理图并不改变,从而使复杂的电子设计变得简单化,设计的效率和可靠性也有了很大的提高。利用LPM产生正弦信号的原理是先把一个正弦波形按相位量化的幅值存储在ROM里,通过查找ROM,输出相应地址里的幅值,合成一个正弦波。正弦波形数据ROM由LPM_ROM模块构成。LPM_ROM中初始化数据文件的格式为.MIF格式,可以用C语言或MATLAB生成.MIF数据文件。采用MATLAB生成64点正弦波形数据的具体步骤如下:1591)创建正弦波形数据。在MATLAB命令窗口中输入如下命令:a=round(127*sin([0:2*pi/(2^6):2*pi])+127)'这样就可生成地址为64、最大幅值为255的正弦波形数据,数据内容为12713915216417618719820821722523323924424925225325425325224924423923322521720819818717616415213912711510290786756463729211510521012510152129374656677890102115。2)生成.MIF文件。在QUARTUSII中选择New→OtherFiles→MemoryInitializationFile,选择ROM的地址数Number为64,数据宽Wordsize取8位,即创建了一个.MIF的数据表格,将MATLAB中生成的64点正弦波数据复制到此表格中,保存并命名为SIN_ROM,则可以创建一个.MIF文件,该MIF文件内容如下:WIDTH=8;DEPTH=64;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENTBEGIN0:127;1:139;2:152;3:164;4:176;5:187;6:198;7:208;8:217;9:225;10:233;11:239;12:244;13:249;14:252;15:253;16:254;17:253;18:252;19:249;20:244;16021:239;22:233;23:225;24:217;25:208;26:198;27:187;28:176;29:164;30:152;31:139;32:127;33:115;34:102;35:90;36:78;37:67;38:56;39:46;40:37;41:29;42:21;43:15;44:10;45:5;46:2;47:1;48:0;49:1;50:2;51:5;52:10;53:15;54:21;55:29;56:37;57:46;58:56;59:67;16160:78;61:90;62:102;63:115;END;3)定制LPM_ROM模块。在QUARTUSII中选择Tools→MegaWizardPlug-InManager→Createanewcustommegafunctionvatiation定制一个新的模块,在左栏选择MemoryCompiler项下的ROM:1-PORT,再在右栏选择器件系列为ACEX1K,器件描述语言为VHDL,输入ROM文件存放的路径和文件名,然后单击Next;选择ROM数据位为8位,地址数为64,再次单击Next(这里要注意的是去掉输出数据时钟锁存信号前的勾);在Filename栏选择指定路径所保存的SIN_ROM.MIF文件,继续单击Next,再单击Finish后完成了SIN_ROM的定制,之后会自动生成一个用VHDL语言描述的SIN_ROM模块,以便在主程序中调用。3.6方波程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYsquareISPORT(clk,reset:INSTD_LOGIC;q:OUTINTEGERRANGE0TO255);ENDsquare;ARCHITECTUREbehaveOFsquareISSIGNALa:BIT;BEGINPROCESS(clk,reset)VARIABLEcnt:INTEGERRANGE0TO63;BEGINIFreset='0'THENA='0';ELSIFclk'EVENTANDclk='1'THENIFcnt63THENCnt:=cnt+1;ELSEcnt:=0;a=NOTa;ENDIF;ENDIF;162ENDPROCESS;Process(clk,a)BEGINIFclk'EVENTANDclk='1'THENIFa='1'THENQ=255;ELSEQ=0;ENDIF;ENDIF;ENDPROCESS;ENDbehave;3.7梯形波程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYtrapISPORT(clk,reset:INSTD_LOGIC;q:OUTintegerRANGE0to255);--STD_LOGIC_VECTOR(7DOWNTO0));ENDtrap;ARCHITECTUREbehaveOFtrapISBEGINPROCESS(clk,reset)VARIABLEtmp,a:integerRANGE0to255;--STD_LOGIC_VECT
本文标题:基于FPGA的典型开发系统设计实例--函数信号发生器
链接地址:https://www.777doc.com/doc-4517467 .html