当前位置:   article > 正文

基于FPGA的2FSK调制解调系统_基于fpga的2fsk调制信号的解调

基于fpga的2fsk调制信号的解调

一、前言

        FSK作为数字通信中不可或缺的一种调制方式,其具有抗干扰能力强,不受信道参数的影响的优点,为此,设计合适的FSK调制解调系统便具有重要意义。

二、主要步骤

  该系统产生主要分为三个步骤:

 1、通过matlab产生两个不同频率的正弦载波

        产生方式:通过matlab软件编程生成一个.mif文件,存放正弦波一个周期的编码值,采样点数为1024,辐值为0-1024。再调用一个12bit数据宽度,深度为1024的ROM,生成两个例化ROM文件,在基准时钟下通过计数器累加不断送入新地址,以两种不同的方法来取地址(本设计采用的是一个地址加一,另一个加二)。 这样即可生成两个不同频率的载波。

        .mif文件生成参考代码为:

  1. clc;
  2. clear;
  3. depth =1024; %存储器的深度
  4. widths = 12; %数据宽度为12
  5. N = 0 :1023; %把一个周期的正弦信号分为256
  6. s =sin(2*pi *N/256); %计算0 ~2*pi之间的sin值
  7. qqq = fopen('sine.mif','wt') %使用fopen函数生成sine.mif
  8. fprintf(qqq, 'depth = %d;\n',depth); %使用fprintf打印depth = 1027;
  9. fprintf(qqq, 'width = %d;\n',widths); %使用fprintf打印width = 12;
  10. fprintf(qqq, 'address_radix = UNS;\n'); %使用fprintf打印address_radix = UNS; 表示无符号显示数据
  11. fprintf(qqq,'data_radix = UNS;\n'); %使用fprintf打印data_radix = UNS; 表示无符号显示数据
  12. fprintf(qqq,'content begin\n'); %使用fprintf打印content begin
  13. for(x = 1 : depth) %产生正弦数据
  14. fprintf(qqq,'%d:%d;\n',x-1,round(128*sin(2*pi*(x-1)/256)+128));
  15. end
  16. fprintf(qqq, 'end;'); %使用fprintf打印end;
  17. fclose(qqq);

        生成的.mif文件内容如下: 

         对应的调数据代码为:

  1. module fangwen(clk,dout1,dout2);
  2. input clk;
  3. output dout1,dout2;
  4. wire [10:0] dout1,dout2;
  5. reg [9:0] addr1 =0,addr2 =0;
  6. rom rom1(
  7. .clock(clk),
  8. .address(addr1),
  9. .q(dout1)
  10. );
  11. rom rom2(
  12. .clock(clk),
  13. .address(addr2),
  14. .q(dout2)
  15. );
  16. always @(negedge clk)
  17. begin
  18. addr1<=addr1+1;
  19. end
  20. always @(negedge clk)
  21. begin
  22. addr2<=addr2+2;
  23. end
  24. endmodule

        产生的载波效果如下: 

  2、通过产生m序列的方式模拟数字信源

        信源部分代码为:

  1. module DDS(clk,enable,code,dt);
  2. input clk,enable;
  3. output code,dt;
  4. reg code=0;
  5. reg [7:0] dt = 8'b1010_1010,cnt=0; //设置信源的初始状态
  6. integer i=8;
  7. always @(negedge clk)
  8. begin
  9. if(enable)
  10. begin
  11. if(i!=1)
  12. begin
  13. code<=dt[i-1];
  14. i=i-1;
  15. end
  16. else
  17. begin
  18. code<= dt[0];
  19. dt <= dt<<1;
  20. dt[0]<=((dt[7]^dt[3])^dt[2])^dt[1];
  21. i<=8;
  22. cnt<=cnt+1'b1;
  23. end
  24. end
  25. else
  26. begin
  27. code<=code;
  28. i<=8;
  29. end
  30. end
  31. endmodule

        波形如下:

 

  3、将数字信息加载在载波上

        调制部分代码为:

  1. module tiaozhi(clk,enable,shuchu,clk1);//顶层
  2. input clk,enable;
  3. output shuchu,clk1;
  4. wire [7:0] dt;
  5. reg clk1=0;
  6. wire [10:0] dout1,dout2;
  7. wire code;
  8. wire [10:0] shuchu;
  9. reg [9:0] sum1=0;
  10. always @(negedge clk)
  11. begin
  12. sum1<=sum1+1; //计数,看什么时候下一个周期,用来控制下一个码元的出现
  13. if(sum1==10'd1023)
  14. clk1=~clk1;
  15. end
  16. fangwen u1(.clk(clk),.dout1(dout1),.dout2(dout2));
  17. DDS u2(.clk(clk1),.enable(enable),.code(code),.dt(dt));
  18. switch u3(.clk(clk),.code1(code),.dataout(shuchu),.d1(dout1),.d2(dout2));
  19. endmodule
  20. module switch(clk,code,dataout,d1,d2);
  21. input clk;
  22. input code;
  23. input d1,d2;
  24. wire [10:0] d1,d2;
  25. output dataout;
  26. reg [10:0]dataout;
  27. always @(negedge clk)
  28. begin
  29. case(code)
  30. 1'b1:dataout<=d1;
  31. 1'b0:dataout<=d2;
  32. endcase
  33. end
  34. endmodule

  4、通过解调的方式将数字信息恢复出来

        解调部分采用过零检测的方法,即数一个码元周期内零点的个数,个数多的是高频对应原数字信息1,反之则对应0。

        具体功能模块代码为:

  1. module jietiao(clk,enable,count,cnt,dout,shuchu,code);
  2. input clk,enable;
  3. wire code;
  4. output dout;
  5. output count,cnt,shuchu;//count512(相当于记零点)的个数,cnt记脉冲的个数,shuchu是引的调制的输出
  6. output code;
  7. reg [10:0] buffer;
  8. wire[10:0]shuchu;
  9. reg [10:0] cnt=0;
  10. reg dout=0; //输出的为原基带信号 0 1
  11. integer count=0;
  12. //实例化部分
  13. wire clk1;
  14. always @(negedge clk)
  15. begin
  16. buffer<=shuchu;
  17. cnt<=cnt+1;
  18. if(buffer==11'b01000000000)
  19. count<=count+1;
  20. if(cnt==2047)
  21. begin
  22. if(count<=6)
  23. dout<=1;
  24. else
  25. dout<=0;
  26. count<=0;
  27. end
  28. end
  29. tiaozhi u1(.clk(clk),.enable(enable),.shuchu(shuchu),.clk1(clk1),.code(code));
  30. endmodule

        测试模块代码为:

  1. module jietiao_tb;
  2. reg clk=0;
  3. wire dout;
  4. wire [10:0] cnt;
  5. wire [10:0]shuchu;
  6. reg enable=1;
  7. wire code;
  8. always #2 clk=~clk;
  9. jietiao u1(.clk(clk),.enable(enable),.cnt(cnt),.dout(dout),.shuchu(shuchu),.code(code));
  10. endmodule

三、仿真结果

        可以发现,这样便实现了2FSK调制解调器的功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/482368
推荐阅读
相关标签
  

闽ICP备14008679号