基于FPGA的DDS信号发生器的设计.doc_第1页
基于FPGA的DDS信号发生器的设计.doc_第2页
基于FPGA的DDS信号发生器的设计.doc_第3页
基于FPGA的DDS信号发生器的设计.doc_第4页
基于FPGA的DDS信号发生器的设计.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖北师范学院电工电子实验教学示范中心eda技术基础实验电工电子实验报告课程名称eda技术基础实验名称综合实验总结选题性质基于fpga的dds信号发生器的设计第2页,共3页基于fpga的dds信号发生器的设计1 dds的基本原理dds技术是一种把一系列数字量形式的信号通过dac转换成模拟量形式的信号的合成技术,它是将输出波形的一个完整的周期、幅度值都顺序地存放在波形存储器中,通过控制相位增量产生频率、相位可控制的波形。dds电路一般包括基准时钟、相位增量寄存器、相位累加器、波形存储器、d/a转换器和低通滤波器(lpf)等模块,如图1.1所示。相位增量寄存器寄存频率控制数据,相位累加器完成相位累加的功能,波形存储器存储波形数据的单周期幅值数据,d/a转换器将数字量形式的波形幅值数据转化为所要求合成频率的模拟量形式信号,低通滤波器滤除谐波分量。整个系统在统一的时钟下工作,从而保证所合成信号的精确。每来一个时钟脉冲,相位增量寄存器频率控制数据与累加寄存器的累加相位数据相加,把相加后的结果送至累加寄存器的数据输出端。这样,相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是dds合成信号的一个频率周期,累加器的溢出频率就是dds输出的信号频率。相位累加器输出的数据的高位地址作为波形存储器的地址,从而进行相位到幅值的转换,即可在给定的时间上确定输出的波形幅值。图1-1:dds原理图 波形存储器产生的所需波形的幅值的数字数据通过d/a转换器转换成模拟信号,经过低通滤波器滤除不需要的分量以便输出频谱纯净的所需信号。信号发生器的输出频率fo可表示为: ( 1.1) 式中为系统时钟,为系统分辨率,n为相位累加器位数,m为相位累加器的增量。参数确定及误差分析.2 参数确定首先确定系统的分辨率,最高频率,及最高频率下的最少采样点数根据需要产生的最高频率以及该频率下的最少采样点数,由公式 (1.2)确定系统时钟的下限值。同时又要满足分辨率计算公式 (1.3)综合考虑决定的值。选定了的值后,则由公式(1.3)可得,据此可确定相位累加器位数n。然后由最高输出频率 (1.4)推出m,得出相位增量寄存器为s位。确定波形存储器的地址位数w,本系统中决定寄存个数据值,因此ram地址为z位。一般选用fpga/cpld器件作为dds的实现器件,对于d/a转换器的选择,首先要考虑到d/a转换器的转换速率。要实现所需的频率,d/a的转换速度要大于,然后根据d/a转换器字长所带来的误差,决定d/a的位数。由此选择d/a转换器的型号。3 dds的fpga实现设计本设计要求dds实现的性能指标为:当系统时钟频率为24mhz时,分辨率为1.43hz,当相位增量寄存器为19位时,最高输出频率是749731hz。(理论上完全可以达到,甚至更高,但是由于受到da器件及运算放大器的影响,实际中的频率不可能达到)。根据上面所列公式可以得出:累加器位数n= 24;相位增量寄存器为19位。如图3.1所示,dds系统包括相位增量寄存器、相位累加器、地址寄存器、波形存储器、时钟倍频器及地址发生部分等几个模块。内部所有模块均用verilog语言编写或调用maxplus2中的已有的lpm库文件,其顶层设计用原理图的方式进行模块间的连接。图3.1 dds系统框图下面就上面向个模块的结构进行论述:3.1 相位累加器 相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是dds合成信号的一个频率周期,累加器的溢出频率就是dds输出的信号频率。相位增量分段寄存器的端口如图3.1.1所示。根据前面的计算可知,相位增量寄存器需要24位。图3.1.1 相位增量寄存器图3.1.2是相位增量分段寄存器仿真图,从图中可以看出,在时钟的激励下,累加器的仿真结果是正确的.图 3.1.2累加器的仿真结果3.2 波形存储器波形存储器实际上就是一个rom,波形存储器存储的是所生成波形一周期采样256点的数据值,通过地址的改变,所输出的值就会变化,因为,地址不一定是连续变化的,所以所输出的值也不是连续的,在同样的时钟周期下,地址间隔的变化也就造成了生成波形的频率的变化。地址值每溢出一次,便完成了一个周期的输出。当改变波形存储器中波形数据时,也就改变了输出波形。图3.2.1 rom模块rom的设计直接调用lpm中的库生成,端口分别为:时钟输入端clock,输出数据总线daout(7:0),输入数据总线result23:16.地址总线address(7:0)是相位累加器输出高8位的数据.输出数据总线douta(7:0)连接输出缓冲通过fpga的i/o口输出,作为d/a转换器的输入。3.3相位增量寄存器及显示模块.这个模块的功能是接收从单片中传来的数据.从单片机中传递过来的数据为分两部分,第一是频率控制字,即给相位增量寄存器的控制字.第二是将当前的输出频率显示在数码管上.这个模块的底层文件是基于verilog语言描述的,在顶层上生成相就的功能模块.其生成的原理图如图3.3.1所示:图3.3.1相位增量寄存器及显示模块上面的顶层模块简要描述如下:clock是系统输入时钟,led_seg7.0是8段数码管的段选,led_wei2.0是8个数码管的位选。(这里联接是38译码器的输入端)。其源程序如下:module led_print( clock, /输入时钟 led_seg, /数码管段选 led_wei, /数码管位选 code, data_clk, write_data, );input data_clk;input clock ; /时钟输入 input 7:0 code;output 23:0 write_data;output 2:0 led_wei; /132,133,135output 7:0 led_seg; /131,130,128,122,121,120,119,118 /*/wire clock,rst;reg2:0 led_wei;reg7:0 led_seg;reg23:0 count; /计数器单元reg3:0 ledbuff; reg23:0 times; /时分秒要分配的单元 reg3:0 seg_count;reg3:0 seg_flag;reg write_flag;reg23:0 write_data;always ( posedge data_clk )/送给fpga的数据改变时.begin seg_count = code 3:0; /数据位 seg_flag = code 7:4;/标志位 case(seg_flag)/在数码管中显示的数字 4b0000: times3:0 = seg_count; 4b0001: times7:4 = seg_count; 4b0010: times11:8 = seg_count; 4b0011: times15:12 = seg_count; 4b0100: times19:16 = seg_count; 4b0101: times23:20 = seg_count;/给控制寄存器中的数据 4b0110: write_data3:0 = seg_count; 4b0111: write_data7:4 = seg_count; 4b1000: write_data11:8 = seg_count; 4b1001: write_data15:12 = seg_count; 4b1010: write_data19:16 = seg_count; 4b1011: write_data23:20 = seg_count; default: begin times = times; write_data = write_data; end endcase endalways(posedge clock ) begin if (count = 24d1200000)/ begin count = 0; end else begin count = count +1; / write_data = 24d699; end end/*数码管扫描程序*/always (count12:10) begin case(count12:10) 3h0: led_wei = 3b000; 3h1: led_wei = 3b001; 3h2: led_wei = 3b010; 3h3: led_wei = 3b011; 3h4: led_wei = 3b100; 3h5: led_wei = 3b101; 3h6: led_wei = 3b110; 3h7: led_wei = 3b111; default :led_wei = 3bzzz; endcase case(count12:10) 3h0: ledbuff = 4ha; 3h1: ledbuff = 4hb; 3h2: ledbuff = times3:0; 3h3: ledbuff = times7:4; 3h4: ledbuff = times11:8; 3h5: ledbuff = times15:12; 3h6: ledbuff = times19:16; 3h7: ledbuff = times23:20; default :ledbuff = 3bzzz; endcase end always ( ledbuff) begin case( ledbuff ) 4h0: led_seg = 8h3f;/0 4h1: led_seg = 8h06;/1 4h2: led_seg = 8h5b;/2 4h3: led_seg = 8h4f;/3 4h4: led_seg = 8h66;/4 4h5: led_seg = 8h6d;/5 4h6: led_seg = 8h7d;/6 4h7: led_seg = 8h07;/7 4h8: led_seg = 8h7f;/8 4h9: led_seg = 8h6f;/9 4hb: led_seg = 8h76;/h 4ha: led_seg = 8h5b;/z 4hc: led_seg = 8b00; default :led_seg = 8hzz; endcase end endmodule 3.4 fpga与单片机通信接口设计单片机在读得矩阵键盘的控制字后,必须把相应的数据传递给fpga。本实验中单片机所传递的数据有两大部分。第一是传递给相位增量寄存器的相位增量字。第二是数码管要显示当前在频率控制字下面的频率输出值。因为fpga只负责扫描8个数码管,故其显示的频率值必须是单片机计算好后再将其值传递给fpga显示。如图3.4.1所示:图 3.4.1 fpga与单片机通信接口设计 单片机与fpga接口总共用了9根线,一根时钟线外加8根数据线。如图3.4.1所示。每一个时钟下降沿时,单片机传送一个8位的数据到fpga中。其中8位宽度的数据线中高四位的值表示的是fpga内各寄存器内约定好的地址,低四位表示的数要传递过来的数据。在fpga内部有下面一段代码:always ( posedge data_clk )/送给fpga的数据改变时.begin seg_count = code 3:0; /数据位 seg_flag = code 7:4;/标志位 case(seg_flag)/在数码管中显示的数字 4b0000: times3:0 = seg_count; 4b0001: times7:4 = seg_count; 4b0010: times11:8 = seg_count; 4b0011: times15:12 = seg_count; 4b0100: times19:16 = seg_count; 4b0101: times23:20 = seg_count;/给控制寄存器中的数据 4b0110: write_data3:0 = seg_count; 4b0111: write_data7:4 = seg_count; 4b1000: write_data11:8 = seg_count; 4b1001: write_data15:12 = seg_count; 4b1010: write_data19:16 = seg_count; 4b1011: write_data23:20 = seg_count; default: begin times = times; write_data = write_data; end endcase end在单片机每产生一个有下降的时钟信号时,会执行上面一块代码程序。 每次传送8位数据后,进行分离如下: seg_count = code 3:0; /数据位 seg_flag = code 7:4;/标志位再根据各个标志位的不同,传递给fpga各个寄存器中不同的数据。高四位作为标志位,最多可表示16种不同的情况,而本实验最多只用到其中的12种,因此是满足要求的。34 顶层框图图 3.4.1生成的顶层框图4 实验总结通过本次基于fpga的设计实验,不仅使我

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论