在FPGA中实现一个简单的混频器电路,模拟仿真两个625khz正弦信号相乘输出,其中625kHz的本振信号有FPGA内部的数字控制振荡器产生,625kHz输入正弦信号通过读取外部文件获得。外部文件由MATLAB产生,电路还需将混频后的信号滤除直流分量,并将滤除直流分量的1.25MHz的正弦信号输出。
MATLAB代码用于产生FPGA程序中需要使用到的正弦波采样数据。
%SimSigProduce.m
%设置系统参数
fi = 625000; %
fc = 625000; %
Fs = 5000000; %
L = 1024; %
N = 10; %
%产生信号
t = 0:1/Fs:(1/Fs)*(L-1); %
theta = rand()*2*pi; %
si = sin(2*pi*fi*t+theta); %
si = round(si*(2^(N-1)-1)); %
%产生本振信号
sc = sin(2*pi*fc*t); %
sc = round(sc*(2^(N-1)-1));
%仿真混频输出 画图
so = si.*sc; %
sof = so - mean(so); %
fso = abs(fft(so,L)); %
%归一化处理
sc = sc/max(abs(sc));
si = si/max(abs(si));
so = so/max(abs(so));
sof = sof/max(abs(sof));
fso = fso/max(fso);
%转换成相对于原点对称的信号
fso = [fso(L/2+1:L),fso(1:L/2)]; %
m = [-L/2:1:(L/2-1)]*Fs/L*(10^(-6)); %
t = t*(10^6); %
subplot(221);plot(t(1:32),si(1:32));
title('10bit量化后的输入信号(a)','fontsize',8);
subplot(222);plot(t(1:32),so(1:32));
title('10bit量化后的混频输出信号(b)','fontsize',8);
subplot(223);plot(t(1:32),sof(1:32));
title('滤除直流分量后的混频输出信号(c)','fontsize',8);
subplot(224);plot(m,fso);
title('混频输出信号的幅频响应(d)','fontsize',8);
%将生成的输入正弦信号数据,写入外部文本文件中
f_s = si/max(abs(si)); %
Q_s = round(f_s*(2*(N-1)-1));
fid = fopen('D:\matlab_project\txt_pro\SinIn.txt','w');
for k=1:length(Q_s)
B_s = dec2bin(Q_s(k)+(Q_s(k)<0)*2^N,N);
for j=1:N
if B_s(j) == '1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'\r\n');
end
fprintf(fid,';');
fclose(fid);
程序运行结果如下图,同时还会在程序指定的目录'D:\matlab_project\txt_pro\SinIn.txt’下生成txt文件,公FPGA使用。由于输入信号的相位与本振信号有相位差,因此直接混频输出的信号有直流分量;经过直流滤波后的信号没有直流分量。