本篇内容:
1.cpfsk解调方法。
2.如何生成滤波器系数?
3.如何调用fir核?
1.cpfsk解调方法。
本设计采用非相干解调的方式,解调思路如下:
2.如何生成滤波器系数?
想要生成滤波器系数,可以在 命令行窗口 输入 filterDesigner 并回车,在右侧界面中进行自定义设计,
下图是我随意设计了一个滤出8.75kHz信号的带通滤波器,设置好参数后,点击下方设计滤波器,点击上方 幅值响应 小图标,查看设计效果,
选择 文件 - 导出,
然后会生成下图这样一个文件,我会把这些系数(分子)存到txt文件中(根据quartus13.1版本的要求,一行一个;根据quartus新版本fir2的要求要用逗号隔开),到时候就可以直接用了。
可以看到滤波器长度很长,用到fpga上肯定会消耗很多资源,可以通过增加过渡带、减少位宽等等方式来解决,可以多尝试。
另外,滤波器的系数还可以通过编程生成,这里我参考了杜勇老师的代码,更改了基本参数、阶数为60阶、系数位宽为12位。输出三个文本文件和幅频响应图。
3.如何调用fir核?
点击Tools-megawizard plug in manager ,选择create a new,点击next。
搜索fir,选中fir,选择语言,选择保存位置(默认工程文件夹下,应该也可以建立一个子文件夹)输入名字bpf01(自己随便起),点击next,稍稍等一会。
点击step1,点击上方edit coefficient set,点击imported coefficient set,选择刚刚生成的滤波器系数文件,点击OK。
选择量化系数位宽为12位,输入数据位宽为10位,输出数据位宽自动给出为27位。
考虑到资源消耗问题,这里我选了全串行滤波器(并行滤波器消耗乘法器较多,分布式滤波器消耗逻辑单元较多);中间表格可以查看消耗的逻辑单元、乘法器等的数量;根据右侧提示,我将滤波器时钟频率设置为采样频率(160kHz)的12倍。
点击step2:
点击step3生成。
打开bpf01.qip下的bpf01.v,将这段话复制并粘贴到解调程序中。
//声明滤波器输入接口信号
wire signed[9:0] din;
wire ast_sink_valid,ast_source_ready,reset_n;
wire [1:0] ast_sink_error;
//设置滤波器输入接口信号的值
assign ast_source_ready=1'b1;
assign ast_sink_valid=1'b1;
assign ast_sink_error=2'd0;
assign reset_n = !rst;
//声明bpf1滤波器输出接口信号
wire sink_ready_bpf1,source_valid_bpf1;
wire [1:0] source_error_bpf1;
wire signed [26:0] data_bpf1;
//实例化bpf1滤波器核
bpf01 u1(
.clk(firclk),
.reset_n(reset_n),
.ast_sink_data(din),//输入信号
.ast_sink_valid(ast_sink_valid),
.ast_source_ready(ast_source_ready),
.ast_sink_error(ast_sink_error),
.ast_source_data(data_bpf1),//输出信号
.ast_sink_ready(sink_ready_bpf1),
.ast_source_valid(source_valid_bpf1),
.ast_source_error(source_error_bpf1));
至此,滤波器就搭建好了。