1 / 12
文档名称:

实验报告基于fpga的2fsk调制器的实现.doc

格式:doc   大小:6,807KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实验报告基于fpga的2fsk调制器的实现.doc

上传人:wxnt86 2019/3/4 文件大小:6.65 MB

下载得到文件列表

实验报告基于fpga的2fsk调制器的实现.doc

文档介绍

文档介绍:设计原理2FSK调制原理2FSK信号是用载波频率的变化来表征被传信息的状态的,被调载波的频率随二进制序列0、1状态而变化,即载频为时代表传0,载频为时代表传1。显然,2FSK信号完全可以看成两个分别以和为载频、以和为被传二进制序列的两种2ASK信号的合成。2FSK信号的典型时域波形如图1所示,图12FSK信号的典型时域波形其一般时域数学表达式为 (10-1)式中,,,是的反码,即2、用FPGA实现2FSK调制器的方案采用键控法实现2FSK,功能模块设计如图2所示。图2用FPGA实现2FSK调制器方案通过不同的分频器,产生频率分别为f1和f2的基频。基带信号为“1”时,频率f1的信号通过;当基带信号为“0”时,频率f2的信号通过。f1和f2作为正弦表的地址发生器的时钟,正弦表输出正弦波的样点数据,经过D/A数模转换,得到连续的2FSK信号。程序设计原理本实验制作一个基于FPGA的2FSK调制器,其设计原理图如图2所示。程序整体由四个子模块构成:正弦波形模块,采用64个点作为一个波形的数据周期,即正弦波的一个周期的波形采样为64个点;100KHz分频模块,利用FPGA上50MHz的晶振分频得到,作为正弦波形的频率f1;400KHz分频模块,利用FPGA上50MHz的晶振分频得到,作为正弦波形信号的频率f2;1Hz分频模块,利用PGA上27MHz的晶振分频得到,作为频率f1或f2的选择信号。电路图如图3所示:图3电路原理图二、源程序代码//顶层模块moduleFSK(clk_50M,clk_27M,reset,sin_out);inputclk_50M,clk_27M,reset;output[7:0]sin_out;wireclk_100K,clk_400K,clk,flag;divider1U1(clk_100K,reset,clk_50M);divider2U2(clk_400K,reset,clk_50M);select_clkU3(clk,flag,reset,clk_27M,clk_100K,clk_400K);sinU4(clk,reset,sin_out);endmodule//分频器1f1(100KHz)moduledivider1(clk_100K,reset,clk_50M);outputclk_100K;inputreset,clk_50M;regclk_100K;reg[23:t;always@(posedgeclk_50M) begin if(reset) t<=0;//同步复位 clk_100K<=0; end t==249) t<=0; clk_100K<=~clk_100K; end t<=cnt+1;//计数 endendmodule//分屏器2f2(400kHz)moduledivider2(clk_400K,reset,clk_50M);outputclk_400K;inputreset,clk_50M;regclk_400K;reg[23:t;always@(posedgeclk_50M) begin if(reset) t<=0;//同步复位 clk_400K<=0; end t==42) t<=0; clk_400K<=~clk_400K; end t<=cnt+1;//计数 endendmodule//分屏器3(1Hz,用来选频)moduleselect_clk(clk,flag,reset,clk_27M,clk_100K,clk_400K);inputclk_100K,clk_400K,clk_27M,reset;outputclk,flag;regclk,flag;reg[23:t;always@(posedgeclk_27M) begin if(reset) t<=0;//同步复位 flag<=0; end t==13499999) t<=0; flag<=~flag; end t<=cnt+1;//计数 case(flag)0:clk<=clk_100K;//用来选择正弦信号的频率1:clk<=clk_400K;endcase endendmodule//正弦波形模块modulesin(clk,reset,sin_out);inputclk,reset;output[7:0]sin_out;reg[7:0]sin_out;reg[6:0]num;always@(posedgeclkorposedgereset)begin if(reset) sin_out<=0; elseif(num==63) num<=0; else num<=num+1; case(num) 0:sin_out<=255; 1:sin_out<=254; 2:sin_out<=252; 3:sin_ou