基于FPGA的2FSK调制
- 前言
- 一、2FSK储备知识
- 二、代码分析
- 1.模块分析
- 2.波形分析
- 总结
前言
设计实现连续相位 2FSK 调制器,2FSK 的两个频率为:fI=15KHz,f2=3KHz,波特率为 1500 bps,比特0映射为f 载波,比特1映射为 载波。
1)接收到被发送的数据帧后,按下面格式生成突发帧:帧头(1111111101111110,16比特)+数据帧长度字节(高位在前)+数据帧(来自UART接口的数据字节,每个字节高位在前)+XOR校验字节(长度字节、数据的XOR结果)+结尾8比特(0000000)
2)通过 DAC 模块输出已调信号波形
一、2FSK储备知识
2FSK(双频移键控)调制是数字调制技术的一种,常用于无线通信、数据传输等领域。2FSK属于频移键控(FSK)调制方式的一种特例,其中“2”表示使用两个不同的频率来表示二进制数据0和1。
- 输入数据比特流:发送端输入二进制数据流(0和1)。
- 选择频率:比特0对应f0,比特1对应f1
- 频率调制:在发送端,根据信号的0和1的不同,调节载波信号的频率。每个数据比特对应一个特定的频率周期。
- 信号传输:调制后的信号通过传输媒介(如无线电波、电缆等)发送到接收端。
二、代码分析
1.模块分析
代码如下(示例):
//产生载波0
module DDS_Mod1(
input clk,
input rst_n,
output wire [11:0] addr_I,
output wire signed [7:0] sin //调制信号
);
parameter Freq = 34'd687026; //题目要求2KHz/3Khz 设置频率控制字 0.04096 * 2的22次方 =171966 257530
//parameter Freq = 32'd4278; //题目要求2KHz/3Khz 设置频率控制字 0.04096 * 2的22次方 =171966 257530
reg [31:0] Freq_1;
reg [33:0] cnt_I = 0; //32位=10+22
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_I <= 0;
end
else begin
cnt_I <= cnt_I + Freq;
end
end
assign addr_I = cnt_I[33:22]; //右移12位,相当于除以2的12次方
ROM b2v_inst2( //调用ROM,将右移后的值送入ROM的地址端
.clka(clk),
.addra(addr_I),
.douta(sin));
endmodule
//产生载波1
module DDS_Mod(
input clk,
input rst_n,
output wire [11:0] addr_I,
output wire signed [7:0] sin //调制信号
);
//0对应2k 1对应3k
parameter Freq = 34'd343932; //题目要求2KHz/3Khz 设置频率控制字 0.04096 * 2的22次方 =171966 257530
//parameter Freq = 32'd4278; //题目要求2KHz/3Khz 设置频率控制字 0.04096 * 2的22次方 =171966 257530
reg [31:0] Freq_1;
reg [31:0] Freq_2;
reg [33:0] cnt_I = 0; //32位=10+22
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_I <= 0;
end
else begin
cnt_I <= cnt_I + Freq;
end
end
assign addr_I = cnt_I[33:22]; //右移12位,相当于除以2的12次方
ROM b2v_inst2( //调用ROM,将右移后的值送入ROM的地址端
.clka(clk),
.addra(addr_I),
.douta(sin));
endmodule
其他模块就是围绕功能进行编写
其他模块就是围绕功能进行编写
其他模块就是围绕功能进行编写
关注三连后台获取
2.波形分析
串口接收到88、55数据后存在fifo里面
按照通信协议进行实现,将比特0和1映射为对应的频率。
总结
软件:vivado 2023 modelsim
工程文件完善,修改比较方便,方便大家进行课程知识点的学习与设计,加深对于FSK的理解。