1《EDA》课程设计报告——正弦波信号发生器的设计2一、设计目的:进一步熟悉QuartusII及其LPM_ROM与FPGA硬件资源的使用方法。培养动手能力以及合作能力。二、设计要求:1、clk为12MHz。2、通过DAC0832输出正弦波电压信号,电压范围0~-5V。3、通过示波器观察波形。三、设计内容:在QUARTUSII上完成正弦波信号发生器的设计,包括仿真和资源利用情况了解(假设利用Cyclone器件)。最后在实验系统上实测,包括FPGA中ROM的在系统数据读写测试和利用示波器测试。信号输出的D/A使用实验系统上的ADC0832。四、设计原理:图1所示的正弦波信号发生器的结构由四部分组成:1、计数器或地址发生器(这里选择10位)。32、正弦信号数据ROM(10位地址线,8位数据线),含有1024个8位数据(一个周期)。3、VHDL顶层设计。4、8位D/A(实验中可用ADC0832代替)。图1所示的信号发生器结构图中,顶层文件singt.vhd在FPGA中实现,包含两个部分:ROM的地址信号发生器,由10位计数器担任;一个正弦数据ROM,由LPM_ROM模块构成。LPM_ROM底层是FPGA中的EAB、ESB或M4K等模块。地址发生器的时钟clk的输入频率fo与每周期的波形数据点数(在此选择1024点),以及D/A输出的频率f的关系是:f=fo/1024图1正弦信号发生器结构框图VHDL顶层设计singt.vhd10位计数器(地址发生器)正弦波数据存储ROM8位D/A4FPGADAC08328clk运放Vo按键图2正弦波信号发生器的设计图五、设计步骤:1、建立.mif格式文件首先,mif文件可用C语言程序生成,产生正弦波数值的C程序如下:#includestdio.h#includemath.hmain(){inti;floats;for(i=0;i1024;i++){5s=sin(atan(1)*8*i/256);printf(%d:%d;\n,i,(int)((s+1)*255/2))}}其次,把上述程序编译后,在DOS命令行下执行命令:romgensdata.mif;将生成的sdata.mif文件,再加上.mif文件的头部说明即可。.mif文件的头部说明如下所示:WIDTH=8;DEPTH=1024;ADDRESS_RADIX=DEC;DATA_RADIX=DEC;CONTENTBEGIN0:127;1:130;2:133;3:136;64:139;5:143;6:146;……(数据略去)1016:102;1017:105;1018:108;1019:111;1020:115;1021:118;1022:121;1023:124;END;2、在设计正弦波信号发生器前,必须首先完成存放波形数据ROM的设计。利用MegaWizardPlug-Inmanager定制正弦信号数据ROM宏功能块,并将以上的波形数据加载于此ROM中。设计步骤如下:1)打开MegaWizardPlug-Inmanager初始对话7框。在Tools菜单中选择MegaWizardPlug-Inmanager产生一个对话框,选择Createanewcustom...项,即定制一个新的模块。单击Next按钮后,在所产生的对话框的左栏选择Storage项下的LPM_ROM,再选择CycloneⅡ器件和VHDL语言方式;最后输入ROM文件存放的路径和文件名:e:\,单击Next按钮。2)选择ROM控制线、地址线和数据线。在弹出的对话框中选择地址线位宽和ROM中数据数分别为10和1024;选择地址锁存控制信号clock。3)单击Next按钮在对话框的“WhatshouldtheRAM…”栏选择默认的Auto。在栏选择“Doyouwantto…Yes,usethisfileformemorycontentdata”项,并按Browse钮,选择指定路径上的文件rom_1024.mif。在“AllowIn-SystemMemory…”栏选择打勾,并在“TheInstanceIDofthisROM”栏输入ROM1,作为ROM的ID名称。最后单击Next按钮,再单击Finish按钮后完成ROM定制。84)打开此文件可以看到其中调用初始化数据文件的语句为:init_file=sdata.mif。最后生成的ROM元件文件如源代码1所示,其中的init_file指向已做了修改。修改后用于例化的波形数据ROM文件rom_1024.vhd如下。六、源代码:1)、源代码1如下所示:LIBRARYieee;USEieee.std_logic_1164.all;LIBRARYaltera_mf;USEaltera_mf.altera_mf_components.all;ENTITYrom_1024ISPORT(address:INSTD_LOGIC_VECTOR(9DOWNTO0);clock:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));9ENDrom_1024;ARCHITECTURESYNOFrom_1024ISSIGNALsub_wire0:STD_LOGIC_VECTOR(7DOWNTO0);COMPONENTaltsyncram--例化altsyncram元件,调用了LPM模块altsyncramGENERIC(--参数传递语句--类属参量数据类型定义intended_device_family:STRING;width_a:NATURAL;widthad_a:NATURAL;numwords_a:NATURAL;operation_mode:STRING;outdata_reg_a:STRING;address_aclr_a:STRING;outdata_aclr_a:STRING;width_byteena_a:NATURAL;init_file:STRING;10lpm_hint:STRING;lpm_type:STRING);PORT(--altsyncram元件接口声明clock0:INSTD_LOGIC;address_a:INSTD_LOGIC_VECTOR(9DOWNTO0);q_a:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;BEGINq=sub_wire0(7DOWNTO0);altsyncram_component:altsyncramGENERICMAP(intended_device_family=Cyclone,--参数传递映射width_a=8,--数据线宽度8widthad_a=10,--地址线宽度1011numwords_a=1024,--数据数量1024operation_mode=ROM,--LPM模式ROMoutdata_reg_a=CLOCK0,--输出锁存CLOCK0address_aclr_a=NONE,--无异步地址清0outdata_aclr_a=NONE,--无输出锁存异步清0width_byteena_a=1,--byteena_a输出口宽度1init_file=sdata.mif,--ROM初始化数据文件lpm_hint=ENABLE_RUNTIME_MOD=NO,lpm_type=altsyncram--LPM类型)PORTMAP(clock0=clock,address_a=address,q_a=sub_wire0);ENDSYN;2)、顶层设计代码:libraryieee;12useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysingtisport(clk:instd_logic;--信号源时钟dout:outstd_logic_vector(7downto0));--8位波形数据输出endsingt;architecturedaccofsingtiscomponentrom_1024--调用波形数据存储器LPM_ROM,文件:rom_1024.vhd声明port(address:instd_logic_vector(9downto0);--10位地址信号clock:instd_logic;--地址锁存时钟q:outstd_logic_vector(7downto0));endcomponent;signalq1:std_logic_vector(9downto0);--设内部节点作为地址计数器13beginprocess(clk)--LPM_ROM地址发生进程beginifclk'eventandclk='1'thenq1=q1+1;--Q1作为地址发生器计数器endif;endprocess;u1:rom_1024portmap(address=q1,q=dout,clock=clk);--例化enddacc;3)为此顶层设计创建一项工程,工程名和实体名都是singt。4)全程编译一次后进入时序仿真测试。由波形可见,随着每一个时钟上升沿的到来,输出端口将正弦波数据依次输出。5)硬件测试。选择电路模式5,则时钟CLK接实验箱的clock0。将dout(0)…dout(7)分别锁定于实验系14统上与DAC0832相接的I/O口:PIO24、PIO25、PIO26、PIO27、PIO28、PIO29、PIO30、PIO31。编译下载singt.sof后,打开电压开关,将CLK的时钟通过实验箱上clock0的跳线选择频率为12MHZ,再将示波器接于实验箱的两个挂钩上就能观察波形的输出情况了。七、仿真波形图:15八、仿真电路图:10'h001--rom_1024:u1clockaddress[9..0]q[7..0]add~0CINA[9..0]B[9..0]OUT[9..0]ADDER0q1[9..0]DQPREENACLRclkdout[7..0]九、引脚锁定:16十、设计结果:Clock0=12MHZ,输出频率为:f=47KHZ,周期为:T=21us十一、设计体会:在本次设计的过程中,我在编译过程中出现问题,第一个问题出在建立.mif格式文件中,没有将生成的sdata.mif文件加上.mif文件的头部说明。.mif文件的头部说明如下所示:WIDTH=8;DEPTH=1024;ADDRESS_RADIX=DEC;DATA_RADIX=DEC;CONTENTBEGIN0:127;171:130;……(数据略去)1023:124;END;由于没有加.mif文件的头部说明,导致用于例化的波形数据ROM文件rom_1024.vhd编译失败。最后在老师的指导帮助下,正确的把.mif文件的头部说明加在了生成的sdata.mif文件中,这样rom_1024.vhd文件编译成功。第二个问题出现在完成存放波形数据ROM的设计过程中,没有正确的选择指定路径文件名sdata.mif导致用于例化的波形数据ROM文件rom_1024.vhd编译失败,经过我的思考和分析后,我正确的选择指定路径文件名sdata.mif,这样编译正确通过。最后,正确的设计正弦波信号发生器的顶层文件sight.vhd,使设计顺利的通过编译。在编译下载singt.sof后,当改变实验箱上clock0的跳线频率时,相应的波形输出情况也发生相应的变化。18在这次设计中,我也深深地体会到“细节决定成败”这句话的真正含义,也许就因为一个小的细节就会导致设计的失败。这次设计也启发了我在以后的学习中一定要耐心、细心、认真,不可粗枝大叶。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityabcisport(clk:instd_logic;dout:outintegerrange255downto0;a:instd