Verilog实现2FSK调制

2FSK数字调制实现

FSK原理

FSK(Frequency Shift-Keying)频移键控分为非连续相位FSK和连续相位FSK,区别在于转换处是否连续。
在这里插入图片描述

  • Matlab生成输入的两种不同频率的载波
f1 = 5000;%波形频率
f2 = 4000;
fs = 20000; %采样频率
N = 12; % 量化位数
len = 2000;%长度

t = 0:1/fs:(len - 1)/fs;
s1 = sin(2*pi*f1*t);
s2 = sin(2*pi*f2*t);
s = s1;
%对仿真产生的合成单频信号进行量化处理
s=s/max(abs(s));         %归一化处理
Q_s=round(s*(2^(N-1)-1));%12比特量化

%将生成的数据以二进制数据格式写入txt文件中
fid=fopen('E:\Work\IC\Modem\code\FSK\testdata.txt','w');
for i=1:length(Q_s)
    B_noise=dec2bin(Q_s(i)+(Q_s(i)<0)*2^N,N);
    for j=1:N
       if B_noise(j)=='1'
           tb=1;
       else
           tb=0;
       end
       fprintf(fid,'%d',tb);  
    end
    fprintf(fid,'\r\n');
end
fclose(fid);
  • Verilog顶层文件,利用M序列发生器生成基波,用分频实现不同频率载波读入
//clock frequency 50MHz
//carrier frequency 1 and 2 = 1MHz and 5MHz
//baseband frequency 0.1MHz

module fsk(
  input clk,
  input rst,
  input [11:0] sin0,  
  input [11:0] sin1, 
  output  [11 :0] Mod_out
);

reg[11 :0] Mod_out1,Mod_out0;
wire clk_M,clk_1M,clk_5M;
reg M_reg;
//clk_1M
clk_div #(
  .Max (50)
)
u1 (
  .clk(clk),
  .rst(rst),
  .clk_div(clk_1M)
);

//clk_5M
clk_div #(
  .Max (10)
)
u2 (
  .clk(clk),
  .rst(rst),
  .clk_div(clk_5M)
);

//clk_M
clk_div #(
  .Max (500)
)
u3 (
  .clk(clk),
  .rst(rst),
  .clk_div(clk_M)
);

//M squencer generator
M_gen #(
  .width (8)
)
u4 (
  .clk(clk_M),
  .rst(rst),
  .M_out(M_out)
);
//载波选择
always@(posedge clk_1M or negedge rst) begin
  if (!rst)  
    Mod_out0 <= 0;
  else 
    Mod_out0 <= sin0;
end

always@(posedge clk_5M or negedge rst) begin
  if (!rst)  
    Mod_out1 <= 0;
  else 
    Mod_out1 <= sin1;
end

assign Mod_out = (M_out == 1'b0)?Mod_out0:Mod_out1;
endmodule
  • M序列发生器
//clock frequency 50MHz
//carrier frequency 1 and 2 = 10MHz and 5MHz
//baseband frequency 1MHz

//M squencer generator
module M_gen #(
  parameter width = 4
)
(
  input clk,
  input rst,
  output  M_out
);

reg[width -1: 0] shift; 
always@(posedge clk or negedge rst) begin
  if (!rst) 
    shift <= 1;
  else 
   shift <= {shift[0]^shift[3],shift[7:1]}; //f = x^3 + x + 1
   //shift <= {shift[0]^shift[3],shift[width -1-:width-1]}; //f = x^3 + x + 1
 end

assign M_out = shift[0];

endmodule
  • 分频
module clk_div #(
  parameter Max = 8
)
(
  input clk,
  input rst,
  output reg  clk_div
);

reg[8:0] cnt;
always@(posedge clk or negedge rst) begin
  if (!rst) 
      cnt <= 0;
  else if (cnt == Max/2 -1)
      cnt <= 0;
  else 
      cnt <= cnt + 1'b1;
end

always@(posedge clk or negedge rst) begin
  if (!rst) 
      clk_div <= 1'b0;
  else if (cnt == Max/2 -1)
      clk_div <= ~clk_div;
end
endmodule
  • 测试
`timescale 1ns/1ps
module test();
reg clk;
reg rst;
reg [11: 0] sin0;
reg [11: 0] sin1;
wire[11: 0] Mod_out;

fsk  u1
    ( .clk(clk),
      .rst(rst),
      .sin0(sin0),
      .sin1(sin1),
      .Mod_out(Mod_out)
    );

//rst
initial begin
  rst = 1'b1;
  #10 rst = 1'b0;
  #20 rst = 1'b1;
  #4000000 $finish;
end

//clk
initial begin
  clk = 1'b1;
  forever #10 clk = ~clk;
end

reg [11: 0] mem0 [0:1999];
reg [11: 0] mem1 [0:1999];
integer i,j;

initial begin

  $readmemb("/home/IC/Mylearn/FSK/testdata1.txt", mem0);
  i = 0;
  repeat(1999) begin
    i = i + 1;
    sin0 = mem0[i];
    #1000;
  end
end
initial begin

  $readmemb("/home/IC/Mylearn/FSK/testdata2.txt", mem1);
  j = 0;
  repeat(1999) begin
    j = j + 1;
    sin1 = mem1[j];
    #400;
  end
end

initial begin
  $fsdbDumpfile("fsk.fsdb");
  $fsdbDumpvars;
  end
endmodule
  • verdi仿真结果,第一二列为载波,第三列为基波,最后一列为调制后信号
    在这里插入图片描述
  • vivado仿真结果
    在这里插入图片描述
  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Verilog是一种硬件描述语言,用于设计和开发数字电路。FSK调制解调器是一种调制解调器,用于将数字信号转换成频率间隔调制的信号以进行数据传输。 在Quartus平台上实现FSK调制解调器,可以按照以下步骤进行: 1. 首先,我们需要使用Verilog语言编写FSK调制解调器的代码。可以编写一个模块,其中包含FSK调制器和解调器的子模块。FSK调制器将数字信号转换为频率间隔调制的信号,而解调器将接收到的频率间隔调制的信号转换为数字信号。 2. 接下来,我们可以使用Quartus平台创建一个新的项目。选择适当的FPGA设备,并将项目命名为“FSK调制解调器”。 3. 将编写的Verilog代码添加到Quartus项目中。 4. 运行编译和综合步骤,以生成网表文件和约束文件。 5. 在设计中打开RTL Viewer,以查看生成的电路结构。确保所有模块正确连接,并且没有错误。 6. 在编译完成后,生成一个烧录文件(例如.POF或.SOF文件),以便将设计烧录到目标FPGA设备中。 7. 在Quartus平台中,我们可以使用SignalTap进行仿真和调试。SignalTap允许我们监视和分析FPGA上的信号。 8. 最后,我们可以将设计下载到目标FPGA设备上,并进行验证和测试。 上述步骤旨在简单介绍如何使用Quartus平台实现FSK调制解调器。具体的实施细节和步骤可能因项目需求和具体Verilog代码而异。因此,您可能需要进一步查阅Quartus和Verilog的相关文档和教程,以确保正确实现和调试FSK调制解调器的设计。 ### 回答2: Verilog是一种硬件描述语言,可以用来描述数字电路。FSK(频移键控)调制和解调是一种在通信系统中常用的数字调制技术。Quartus是一个FPGA设计和开发的软件平台,CSND是一个技术社区网站。 要在Quartus平台上实现FSK调制解调,可以使用Verilog语言来编写所需的电路描述。首先,我们需要定义输入和输出端口以及其他需要的变量和寄存器。 在调制部分,可以使用一个计数器来生成载波频率,并使用Verilog中的时钟信号来控制调制信号的变化。根据输入数据的逻辑值,选择频率高或低的载波信号,并输出到调制器的输出端口。 在解调部分,输入信号通过一个滤波器来除去噪声和干扰,并通过一个比较器来判断输入信号高低电平的变化。根据这些变化,可以确定原始数据的逻辑值,并输出到解调器的输出端口。 在Quartus中,可以使用内置的仿真工具对Verilog代码进行仿真和调试,以验证电路的功能。通过连接FPGA开发板并加载生成的比特流,可以在实际硬件中测试和验证FSK调制解调电路。 在CSND等技术社区网站上,可以找到许多关于Verilog语言、FSK调制解调和Quartus平台的教程和资源,以帮助学习和开发这些电路。同时,你也可以与其他开发者和技术专家交流和分享经验,获取更多的帮助和支持。 ### 回答3: Verilog是一种硬件描述语言,可用于数字电路的设计和调试。FSK调制解调是一种常见的数字调制解调技术,用于在数字通信中将数字信号转换为模拟信号。 在Quartus平台上,我们可以使用Verilog语言来实现FSK调制解调。首先,我们需要设计一个调制器模块,用于将数字信号转换为FSK调制信号。调制器模块可以根据输入的数字信号和调制频率生成FSK调制信号。我们可以使用Verilog的always块来实现模块的行为。 调制器模块的输入是数字信号和调制频率,输出是FSK调制信号。我们可以将数字信号转换为FSK调制信号的基本方法是根据数字信号的值选择不同的调制频率来生成模拟信号。我们可以使用Verilog的if-else语句来实现这个逻辑。 调制器模块的实现可能类似于以下代码片段: module modulator( input wire digital_signal, input wire modulation_freq, output wire fsk_modulated_signal ); always @(digital_signal or modulation_freq) begin if(digital_signal == 0) // 如果数字信号为0,选择低频调制频率 fsk_modulated_signal = sin(2*pi*modulation_freq_low*time); else // 如果数字信号为1,选择高频调制频率 fsk_modulated_signal = sin(2*pi*modulation_freq_high*time); end endmodule 接下来,我们需要实现一个解调器模块,用于将FSK调制信号转换回数字信号。解调器模块可以通过比较输入的FSK调制信号的幅值来判断数字信号的值。我们可以使用Verilog的比较操作符来实现这个逻辑。 解调器模块的输入是FSK调制信号,输出是解调后的数字信号。我们可以比较输入信号的幅值与两个阈值,根据幅值的大小来判断数字信号的值。解调器模块的实现可能类似于以下代码片段: module demodulator( input wire fsk_modulated_signal, output reg digital_signal ); always @(fsk_modulated_signal) begin if(fsk_modulated_signal > threshold_high) digital_signal = 1; //如果信号幅值大于阈值高,数字信号为1 else if(fsk_modulated_signal < threshold_low) digital_signal = 0; //如果信号幅值小于阈值低,数字信号为0 end endmodule 以上是在Verilog语言中使用Quartus平台实现FSK调制解调的简单示例。实际的实现可能需要更复杂的电路和算法,具体取决于应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值