1、一、方案设计与论证1、方案方案一:基于单片机的方式。以单片机为控制中心,通过专门的DDS芯片如AD9852编程,产生所需的正弦波信号,然后用硬件电路搭建产生其他各种调制波信号,该方案简单,易于实现。方案二:数字锁相环频率合成技术,利用锁相环把压控振荡器的输出频率锁定在所需的频率上,可以很好的选择所需的频率信号,抑制杂散分量,可以采用集成芯片,但这种锁相环倍频电路中,要减小频率间隙,就必须减小频率fi,导致频率转换时间增加,而减小输出间隙与减小频率转换时间是矛盾的,且输出频率在很大范围变化时,N也要随之变化,环路增益也要增大幅度变化,从而使环路的动态性急剧变化。方案三:采用基于以FPGA为平台的
2、DDS直接数字频率合成技术,以单片机和FPGA相结合的方式完成,用单片机完成人机交互;系统控制部分,用FPGA完成波形发生以及各种调制功能,本方案利用了单片机在软件控制设计方面的通用性和FPGA在逻辑设计上的优势,可以很好的完成系统设计。2、方案确定综合考虑以上三种方案的优缺点以及题目的基本要求和发挥要求,以及成本问题,我们选择了第三种方案,即基于FPGA和单片机结合的设计方案,利用新技术、新的解决方案来实现本题目的各项功能。FPGA选择cyclone II系列的EP2C5T144C8。单片机采用STM32芯片来实现,显示部分采用性价比较高的NOKIA5110液晶显示器。控制键盘采用4X4的矩
3、阵键盘。二、系统设计和理论分析1.DDS的基本原理是利用采样定理,通过查表的方法产生波形。DDS的结构有很多种,其中基本的电路原理图可以用下图表示:采用FPGA实现DDS,可以将要输出的波形数据预先存放在RAM中,然后在系统标准时钟频率下,按照一定的顺序从RAM单元中读出数据,再进行DA转换和低通滤波,就可以得到一定频率的输出波形。上述过程可使用HDL硬件描述语言对FPGA编程实现。2.全数字实现各种波形(1)基本波形:正弦波,方波,三角波。直接采用DDS技术,在三个不同的RAM中存放三种不同的波形数据,然后经过描述语言对其输出数据和数据的选择做适当的处理,即得到三种不同的波形。QUARTUS
4、 II 综合RTL图如下图所示:(2)幅度调制信号(AM)采用AM信号的基本公式结合Verilog HDL语言中对有符号数的计算,来实现AM信号的产生,QUARTUS II 综合RTL图:Count模块是复杂的信号处理模块(3)模拟频率调制信号(FM)基于FM的原理,根据调平信号变化的规律采用数字方式控制DDS信号发生的频率控制字,直接作用于输出波形的频率值,即实现了对信号源的频率的调节,该方式下,DDS调制信号输出的波形频率与调制信号频率控制字成正比,而载波信号的频率控制字又随调制信号成正比例变化,本系统采用调制信号,固定为1KHZ,而改变载波频率控制字的方式来实现的。流程图:(4)键控法产
5、生ASK信号通过HDL语言在FPGA里实现时,数字电路内的0,1数字及代码作为选择开关信号对应于键控信号,DDS波形发生器对于载波发生器,如下图:其中用分频时钟作为0,1基带码产生的数据流(5)键控法产生PSK信号和ASK信号类似,同样用时钟模拟0,1基带码的基带流来模拟开关选择,具体实现用到HDL语言和原理图结合的方法,RTL图如下:三、系统组成本系统包括FPGA,模拟以及外设三部分。由于基本波形以及各种调制信号发生的功能都是通过DDS方式在FPGA内实现的,因此模拟部分仅包含高速DA,滤波电路,带宽运放部分,控制部分和显示控制部分,采用32位的STM32 单片机实现。电路图见附录。四、硬件
6、设计1.数字部分即用DDS原理在FPGA里构建一个能产生正弦,方波,三角波,还有AM,FM,ASK,PSK信号的系统,并且能够受控制和选择输出想要的波形和频率等信息。QUARTUS II RTL图具体在附件:2.模拟部分(1)部分采用十二位高速DA转换器DAC902,作为本系统的,然后通过opa690差分输出。电路截图如下:五、测试方法与数据(1)正弦,方波,三角波信号设定频率测试频率相对误差峰峰值/v100HZ6.4500HZ1000HZ2000HZ3KHZ4KHZ5KHZ6KHZ7KHZ8KHZ9KHZ1MZ5.15MZ4.810MZ4.2(2)AM信号示波器观察在载波频率增大时AM频率也
7、加大的,而调制度从10%到100%调节时信号的幅度越来越小。(3)FM信号示波器观察在载波频率加大时FM频率也在加大,但频偏不随之改变,当改变最大频偏时,测得的最大频偏也随之改变。(4)ASK和PSKASK100khzPSK200khz以上都符合调制规则,说明准确完成了题目要求。六、测试结论(1)输出频率范围为100HZ到10MHZ以上,步进100HZ,稳定度优于10-4;(2)AM信号可以在10%到100%程控调节,步进10%;(3)FM信号最大频偏为10KHZ,且可二级程控调节载波信号频率;(4)实现,信号;(5)扩展实现方波跟三角波的发生。附录:STM32部分程序void key_con
8、(void) if(key00) Delay(100); state=1; while(key00); if(state) if(key01) num+; if(num=65536)num=1; while(key01); if(key02) num-; if(num=0)num=65535; while(key02); if(key11) if(key11) if(num=65280)num=1; else num=(num-(num%256)+256;=65536)num=1; while(key11); if(key12) if(num256)num=num; else num=(num
9、-(num%256)-256;=1)num=65535; while(key12); if(key03) state=0; while(key03); if(key20) bo+; if(bo=8)bo=1; while(key20); if(key21&AM=1) ma+; if(ma=1024)ma=1; LCD_WriteString_En(10,130,chengkong(AM),RED,0xffff); LCD_WriteNumber(150,130,ma ,0x0000,0xffff); if(key22& ma-; if(ma=0)ma=1023; if(key23& ma=ma
10、*10; if(key33) ff+; if(ff%2=0&FM=1) GPIO_SetBits(GPIOB , GPIO_Pin_8); LCD_WriteString_En(10,110,PPG 50%(5KHZ) else if(ff%2=1&FM=1) GPIO_ResetBits(GPIOB , GPIO_Pin_8);PPG 100%(10KHZ) while(key33); if(bo!=0) switch(bo) case 1: GPIO_SetBits(GPIOB , GPIO_Pin_2); FM=0; AM=0; /正弦波 GPIO_ResetBits(GPIOB , G
11、PIO_Pin_3); GPIO_ResetBits(GPIOB , GPIO_Pin_4); / Pant(0xffff); LCD_WriteString_En(20,85,SIN /显示正弦标志 break; case 2: GPIO_ResetBits(GPIOB , GPIO_Pin_2);/方波 GPIO_SetBits(GPIOB , GPIO_Pin_3); LCD_WriteString_En(20,85,FANG case 3:AM=0;/三角波 GPIO_SetBits(GPIOB , GPIO_Pin_3);SAN case 4:FM=1;/FM GPIO_SetBit
12、s(GPIOB , GPIO_Pin_4);FM case 5:AM=1; /AM GPIO_ResetBits(GPIOB , GPIO_Pin_3);AM case 6: /ASK GPIO_ResetBits(GPIOB , GPIO_Pin_2);FM=0;ASK case 7: /PSKPSK / /把控制字转换为频率值显示在液晶上 / / /频率控制字是32位的,现在我们只取其中的/ /16位用单片机输入,这里去L位地位的位值/ /H位高位的位值,以方便做计算。/ u32 num_to_data(u16 num) u32 data; data=SYS_CLK*(N2(L)*num+
13、(N2(L)-1)/N2(Z); return data; uint64_t N2(u8 X) uint64_t S=1; u16 i; for(i=0;iX;i+) S=S*2; return S;FPGA部分程序和原理图module xinhao(clk,rst_n,in_data,en_1,en_2,en_3, datar_out );input clk;input en_1,en_2,en_3;input rst_n;input 15:0in_data;output 9:0 datar_out;wire 9:0data_out_1;0data_out_2;0data_out_3;wir
14、e 15:0 in_data_1;0 data_out_r;wire rst_n;/wire clk_system;assign in_data_1=in_data;reg 9:wire clk;/assign rst_n_r=rst_n;/assign en_1_r=en_1,en_2_r=en_2,en_3_r=en_3;add_dff32 add_dff32_inst( .data(in_data_1) , / .rst_n(rst_n) , / input rst_n_sig .clk(clk) , / input clk_sig .data_out(data_out_r) / out
15、put data_out_sig);rom_zheng rom_zheng_inst ( .address ( data_out_r), .clken ( en_1 ), .clock ( clk ), .q ( data_out_1)rom_fang rom_fang_inst ( .clken ( en_2), .clock ( clk), .q ( data_out_2)ron_san ron_san_inst ( .address (data_out_r), .clken ( en_3), .q (data_out_3)always (posedge clk or negedge rs
16、t_n) begin if(!rst_n) datar_out=10d0; else if(en_1) datar_out=data_out_1; else if(en_2) datar_out=data_out_2; else if(en_3) datar_out=data_out_3; else datar_outend endmodulemodule count( mul1,mul2,pm,out_data );input signed 9:0 mul1,mul2;input 9:0pm;output unsigned 9:0out_data;0 ph=10d512;wire unsig
17、ned9:wire signed 9:0data_1;0data_2;wire signed 19:0out_data_1;0out_data_2;0out_data_3;0out_data_4;assign data_1=mul1-ph;assign data_2=mul2-ph;assign out_data_1=data_29?-(ph-data_28:0)*pm):data_28:0*pm;assign out_data_2=out_data_119:10;assign out_data_3=(out_data_29=1&data_19=1)?(ph-out_data_28:0)*(ph-data_18:0): (out_data_29=0&-(out_data_28:0*(ph-data_18:0): (out_data_29=1&data_19=0)?-(ph-out_data_28:0)*data_18: out_data_2*data_1:out_data_2*data_1;assign out_data_4=out_data_319:assign out_data =out_data_49?out_data_48:0:(out_data_48:0+ph);顶层文件截图部分RTL模块图波形选择输出块:AM实现块:AM程控数据控制块:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1