目录
1.算法描述
2.仿真效果预览
3.verilog核心程序
4.完整FPGA
整个数字下变频的基本结构如下所示
NCO使用CORDIC算法,CIC采用h结构的CIC滤波器,HBF采用复用结构的半带滤波器,而FIR则采用DA算法结构。
这里,我们首先假设不考虑中频信号输入的载波频偏问题,即发送的中频频率和本地的载波频率是一致的。
为了验证系统的正确性,我们首先需要设计一个发送源,由于你要求的信号带宽为20M,
所以整个系统我们设计的系统参数为,中频为80M,A/D采样为60M。本地接收端的载波频率为20M。
即发送端通过80M的中频调制之后,信号的频谱会搬移到80M附近,然后接收端通过AD60M采样后,会将频谱搬移到20M附近,且不会发生混叠现象。
那么系统测试方案可以简化为,一个中心频率在20M附近的中频输入测试信号进行测试。
首先设计一个发送测试信号。
信号的基本结构如下所示:
我们首先在FPGA中设计这么一个结构得到中频测试信号,然后使用这个测试信号进行下变频测试。
整个系统的原理框图如下所示:
RTL图:
综合资源占用:
quartusii10.0,ModelSim-Altera 6.6d Starter Edition
module tops2(
reset,
clk,
clk0,
rst0,
clk1,
rst1,
I0,
phase0,
phase1,
Q0,
cosr,
I_cic,
I_d,
I_hb,
I_out,
Q_d,
Q_out,
R,
sinr
);
input wire reset;
input wire clk;
input wire clk0;
input wire rst0;
input wire clk1;
input wire rst1;
input wire [7:0] I0;
input wire [7:0] phase0;
input wire [7:0] phase1;
input wire [7:0] Q0;
output wire [7:0] cosr;
output wire [47:0] I_cic;
output wire [13:0] I_d;
output wire [31:0] I_hb;
output wire [15:0] I_out;
output wire [13:0] Q_d;
output wire [15:0] Q_out;
output wire [13:0] R;
output wire [7:0] sinr;
wire [47:0] I_cic_ALTERA_SYNTHESIZED;
wire [31:0] I_hb_ALTERA_SYNTHESIZED;
wire [47:0] Q_cic;
wire [31:0] Q_hb;
wire [13:0] SYNTHESIZED_WIRE_0;
wire [13:0] SYNTHESIZED_WIRE_1;
wire [13:0] SYNTHESIZED_WIRE_2;
wire SYNTHESIZED_WIRE_3;
wire SYNTHESIZED_WIRE_4;
wire SYNTHESIZED_WIRE_5;
wire SYNTHESIZED_WIRE_6;
assign I_d = SYNTHESIZED_WIRE_0;
assign Q_d = SYNTHESIZED_WIRE_1;
assign R = SYNTHESIZED_WIRE_2;
cic_top b2v_inst(
.i_clk(clk),
.i_rst(reset),
.i_din(SYNTHESIZED_WIRE_0),
.o_clk16(SYNTHESIZED_WIRE_3),
.o_dout(I_cic_ALTERA_SYNTHESIZED));
defparam b2v_inst.WIDTH = 48;
cic_top b2v_inst1(
.i_clk(clk),
.i_rst(reset),
.i_din(SYNTHESIZED_WIRE_1),
.o_clk16(SYNTHESIZED_WIRE_4),
.o_dout(Q_cic));
defparam b2v_inst1.WIDTH = 48;
Rec b2v_inst12(
.clk(clk1),
.rst(rst1),
.phase(phase1),
.recs(SYNTHESIZED_WIRE_2),
.Iss(SYNTHESIZED_WIRE_0),
.Qss(SYNTHESIZED_WIRE_1));
hb_filter_02 b2v_inst2(
.i_clk(SYNTHESIZED_WIRE_3),
.i_rst(reset),
.i_din(I_cic_ALTERA_SYNTHESIZED[34:19]),
.o_clk2(SYNTHESIZED_WIRE_5),
.o_dout(I_hb_ALTERA_SYNTHESIZED));
defparam b2v_inst2.h0 = 27316;
defparam b2v_inst2.h1 = 20073;
defparam b2v_inst2.h11 = 1238;
defparam b2v_inst2.h13 = -1175;
defparam b2v_inst2.h15 = -624;
defparam b2v_inst2.h3 = -4745;
defparam b2v_inst2.h5 = 965;
defparam b2v_inst2.h7 = 667;
defparam b2v_inst2.h9 = -1238;
hb_filter_02 b2v_inst3(
.i_clk(SYNTHESIZED_WIRE_4),
.i_rst(reset),
.i_din(Q_cic[34:19]),
.o_clk2(SYNTHESIZED_WIRE_6),
.o_dout(Q_hb));
defparam b2v_inst3.h0 = 27316;
defparam b2v_inst3.h1 = 20073;
defparam b2v_inst3.h11 = 1238;
defparam b2v_inst3.h13 = -1175;
defparam b2v_inst3.h15 = -624;
defparam b2v_inst3.h3 = -4745;
defparam b2v_inst3.h5 = 965;
defparam b2v_inst3.h7 = 667;
defparam b2v_inst3.h9 = -1238;
firfilter_da b2v_inst4(
.CLK(SYNTHESIZED_WIRE_5),
.Reset(reset),
.DIN(I_hb_ALTERA_SYNTHESIZED[30:23]),
.Dout(I_out));
firfilter_da b2v_inst5(
.CLK(SYNTHESIZED_WIRE_6),
.Reset(reset),
.DIN(Q_hb[30:23]),
.Dout(Q_out));
Trans b2v_inst6(
.clock(clk0),
.reset(rst0),
.I(I0),
.phase(phase0),
.Q(Q0),
.cosr(cosr),
.r(SYNTHESIZED_WIRE_2),
.sinr(sinr));
assign I_cic = I_cic_ALTERA_SYNTHESIZED;
assign I_hb = I_hb_ALTERA_SYNTHESIZED;
endmodule
01-115m
V