正弦信号发生器设计信息工程与工程学院电子信息科学与技术091班姓名:李聪学号:3090748117指导老师:易金生一、设计目的:进一步熟悉QuartusII及其LPM_ROM与FPGA硬件资源的使用方法。培养动手能力以及合作能力。二、实验内容设计一正弦信号发生器,采用ROM进行一个周期数据存储,并通过地址发生器产生正弦信号。(ROM:6位地址8位数据;要求使用两种方法:VHDL编程和LPM)。在QUARTUSII上完成正弦波信号发生器的设计,包括仿真和资源利用情况了解(假设利用Cyclone器件)。最后在实验系统上实测,包括FPGA中ROM的在系统数据读写测试和利用示波器测试。信号输出的D/A使用实验系统上的ADC0832。三、实验原理1、图一所示的信号发生器结构图中,顶层文件sin.v在FPGA中实现。它包含两个部分:ROM的地址信号发生器,由6位计数器担任;一个正弦数据ROM,由LPM_ROM模块构成。LPM_ROM底层是FPGA中的EAB、ESB或M4K等模块。地址发生器的时钟clk的输入频率fo与每周期的波形数据点数(在此选择64点),以及D/A输出的频率f的关系是:f=fo/64图一2、图二所示是此正弦波发生器的RTL图。其中左边三个——加法器、多路选择器、寄存器构成六位计数器;其输出接右边ROM的地址输入端;输出可以接FPGA外的DAC,完成正弦波形输出。当然,也可以利用逻辑分析仪SignalTapⅡ对输出口Q[7:0]的数据采样,从计算机上实时了解输出波形的情况。图二3、在设计正弦波信号发生器前,必须首先完成存放波形数据ROM的设计。本实验采取的ROM的数据由康芯片生成器产生四、实验源代码1、顶层模块modulesin(RST,CLK,EN,Q,AR,WR_n);output[7:0]Q;output[5:0]AR;outputWR_n;inputEN,CLK,RST;wire[5:0]TMP;reg[5:0]Q1;wireWR_n;wireRST;//1Hz时钟divider_by_50Mu0(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].o_clk(clk_1_Hz),.rst_n(RST),.i_clk(CLOCK_50));always@(posedgeCLKornegedgeRST)if(!RST)Q1=7'B000000;elseif(EN)Q1=Q1+1;elseQ1=Q1;assignTMP=Q1;assignAR=TMP;assignWR_n=~EN;da_sinIC1(.address(TMP),.clock(CLK),.q(Q));endmodule2、分频模块/*divider_by_50M.v/Verilog*/moduledivider_by_50M(outputrego_clk,inputrst_n,inputi_clk);parameterN=1_0000;parameterM=4_999;//M=(N/2)-1\reg[15:0]cnt;always@(posedgei_clk,negedgerst_n)beginif(!rst_n)cnt=0;elsebeginif(cnt==N-1)cnt=0;elsecnt=cnt+16'b1;endendalways@(posedgei_clk,negedgerst_n)beginif(!rst_n)o_clk=0;elsebeginif(cnt=M)o_clk=1;elseo_clk=0;endendendmodule3、模块连接moduleda_sin(address,clock,q);input[4:0]address;inputclock;output[7:0]q;`ifndefALTERA_RESERVED_QIS//synopsystranslate_off`endiftri1clock;`ifndefALTERA_RESERVED_QIS//synopsystranslate_on`endifwire[7:0]sub_wire0;wire[7:0]q=sub_wire0[7:0];altsyncramaltsyncram_component(.clock0(clock),.address_a(address),.q_a(sub_wire0),.aclr0(1'b0),.aclr1(1'b0),.address_b(1'b1),.addressstall_a(1'b0),.addressstall_b(1'b0),.byteena_a(1'b1),.byteena_b(1'b1),.clock1(1'b1),.clocken0(1'b1),.clocken1(1'b1),.clocken2(1'b1),.clocken3(1'b1),.data_a({8{1'b1}}),.data_b(1'b1),.eccstatus(),.q_b(),.rden_a(1'b1),.rden_b(1'b1),.wren_a(1'b0),.wren_b(1'b0));defparamaltsyncram_component.clock_enable_input_a=BYPASS,altsyncram_component.clock_enable_output_a=BYPASS,altsyncram_component.init_file=sin.mif,altsyncram_component.intended_device_family=CycloneII,altsyncram_component.lpm_hint=ENABLE_RUNTIME_MOD=NO,altsyncram_component.lpm_type=altsyncram,altsyncram_component.numwords_a=32,altsyncram_component.operation_mode=ROM,altsyncram_component.outdata_aclr_a=NONE,altsyncram_component.outdata_reg_a=UNREGISTERED,altsyncram_component.widthad_a=5,altsyncram_component.width_a=8,altsyncram_component.width_byteena_a=1;endmodule五、实物仿真1、引脚分配2、程序编译3.程序下载4、利用SignalTapⅡ对波形进行仿真,结果如下:六、实习总结在这次EDA实验设计中,我完成的是一个正弦波信号发生器的设计,在这次设计中,让我了解到了ROM和RAM的设计方法,让我进一步掌握了Quartus‖的常见使用方法,编程下载以及基于LPM宏功能模块的设计,并掌握了正弦波信号发生器的设计原理,和对试验结果的SignalTapⅡ的波形仿真。对我来说,此次实验的收获在于数据存储器ROM的设计和一种新的设计方法—利用专用的波形生成器(康芯mif生成器),我相信这对于以后的实验将会有很大的帮助。此次的实验还算成功,从电路模块的设计到电路的仿真成功能自己自主设计完成,并且在遇到问题是能够找到同学和老师请教,使实习效率比预计的要高出很多。这是对我自己的一次很大的鼓励,我相信,以后的课程将会学的更好。