本文以Altera公司生产的Cyclone IV系列的EP4CE15F17C8为主芯片的CRD500开发板作为项目的硬件实现平台,并以Quarter 18.1和ModelSim为开发工具和仿真工具。
目录
一、项目要求
项目名称:MLS测角信号的FPGA实现
项目要求:采用FPGA+D/A的方式,产生MLS的测角信号。具体要求为:测角信号由往、返扫描脉冲与噪声组成,信噪比为+3dB,往、返扫描脉冲为宽度是200us的钟形脉冲(用频率为5KHz的余弦波形表示),两个脉冲间的间隔为1800us,采用matlab生成信号源数据时,采样频率为6.25MHz。
二、设计实现步骤
采用matlab辅助设计模拟信号源
1、在matlab下产生模拟信号源的数据
2、对模拟信号源数据进行量化
3、利用量化后的、满足单口ROM格式要求的数据(必须是无符号二进制数据)生成.mif文件
4、基于.mif文件与单口ROM IP核,在quartus下产生时钟、地址等信号,实时读取数据,送到D/A转换器
5、在时钟作用下完成D/A转换,得到模拟信号
三、实现
1、matlab下模拟信号源数据的产生
Matlab
% MLS_signal.m
clc;clear;close all;
N=12; % 数据量化位数
fs=6.25*10^6; % 采样率
delta=0.16*10^-6; % 采样间隔
for n=1:1000
s(n)=0;
end
for n=1001:2251
s(n)=cos(2*pi*(n-1001)*5*10^3*delta+pi)+1;
end
for n=2252:12251
s(n)=0;
end
for n=12252:13502
s(n)=cos(2*pi*(n-12252)*5*10^3*delta+pi)+1;
end
for n=13503:14503
s(n)=0;
end
snr=3; % 信噪比
randn('state',sum(100*clock));
noise=randn(size(s));
noise=noise-mean(noise);
signal_power=1/length(s)*sum(s.*s); % 计算信号平均功率
noise_variance=signal_power/(10^(snr/10)); % 计算噪声方差(功率)
noise=sqrt(noise_variance)/std(noise)*noise; % 计算噪声幅度
x=s+noise;
long=0.16*10^-6:(0.16*10^-6):(14503*0.16*10^-6);
plot(long,s);
xlabel('时间/s');ylabel('幅度/v');
figure;
plot(long,x);
xlabel('时间/s');ylabel('幅度/v');
2、matlab下模拟信号源数据的量化
Matlab
% Q_MLS_signal.m
% 对产生的信号进行量化,量化结果存入.mif文件,以用于生成信号源
x1 = (x/max(abs(x))+1)/2; % 归一化正数(0~1)
Q_x = round(x1*(2^N-1)); % 12位量化
figure;
plot(long,Q_x);
xlabel('时间/s');ylabel('幅度/v');
fid=fopen('D:\Verilog\txhFPGA\signal_produce(iir)\signal_rom.mif','w');
fprintf(fid,'WIDTH=12;\r\n');
fprintf(fid,'DEPTH=14503;\r\n\r\n');
fprintf(fid,'ADDRESS_RADIX=UNS;\r\n');
fprintf(fid,'DATA_RADIX=UNS;\r\n');
fprintf(fid,'CONTENT BEGIN\r\n');
for nn=0:length(Q_x)-1
fprintf(fid,'%d:%d;\r\n',nn,Q_x(nn+1));
end
fprintf(fid,'END;\r\n');
fclose(fid);
量化后生成的12位无符号二进制数据存储在signal_rom.mif文件中
matlab产生的模拟信号源波形和经量化后的波形分别如下所示
3、信号源的FPGA实现
(1)IP核参数设置
在IP Catalog中输入 ROM ,再双击"ROM:1-PORT",进入创建IP核界面
上图中的"signal_rom.mif"文件是用matlab产生的
单击"Finish"按钮,完成IP核的设计
在设置的文件夹中可查看生成的IP核,打开"signal_produce_IP.v",可查看该IP核的输入、输出端口信号等详细信息。
(2)时钟信号
Matlab
// clk_produce.v 程序
// 功能:产生6.25MHz的时钟频率,作为单口ROM读取数据的时钟以及D/A转换(D/A时钟与A/D时钟应一致)
module clk_produce(rst,gclk,clk);
input rst; // 复位信号,高电平有效
input gclk; // 板载信号,50MHz
output clk; // 8分频时钟
wire rst,gclk;
reg clk=1'b0;
reg[2:0] count = 3'b000;
always @(posedge gclk)
begin
count=count+3'd1;
if(count==3'd4)
begin
clk=~clk;
count=3'd0;
end
end
endmodule
(3)信号源
Matlab
// 信号源signal_produce.v 程序
// 功能:产生循环读取单口ROM数据的地址,并将数据的高八位送到外部D/A转换器(存储的数据为12位无符号二进制数,外部D/A转换器要求输入数据位8位无符号二进制数)
module signal_produce(rst,gclk2,clk2,da2_data);
input rst;
input gclk2; // 板载时钟为50MHz
output clk2; // 8分频时钟,6.25MHz
output [7:0] da2_data; // 送给DA2的8位无符号二进制整数
wire unsigned[11:0] signal;
reg[13:0] address = 14'b00000000000000;
always @(posedge clk2) // 循环产生ROM存储单元的地址
begin
address=address+14'b00000000000001;
if(address==14'b11100000000000)
begin
address=14'b00000000000000;
end
end
clk_produce u1(.rst(rst),.gclk(gclk2),.clk(clk2));
signal_produce_IP u2(.address(address),.clock(clk2),.q(signal));
assign da2_data=signal[11:4]; // 高8位数据作为外部D/A转换器的输入
endmodule
(4)编译下载
将 signal_produce.v 作为顶层设计,创建项目,开始编译
编译无误后,绑定引脚(根据FPGA器件上D/A转换器引脚对应关系绑定)
引脚绑定后,再次编译,将编译后生成的.sof程序下载到FPGA中运行,采用示波器观测的D/A转换器输出波形。
该图片与matlab生成的模拟信号源波形一致,验证项目成功