基于FPGA的数字正交下变频器设计.docx
- 文档编号:6442611
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:13
- 大小:482.04KB
基于FPGA的数字正交下变频器设计.docx
《基于FPGA的数字正交下变频器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字正交下变频器设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于FPGA的数字正交下变频器设计
综合课设报告:
基于FPGA的数字正交
下变频器设计
班级:
XXXXXXX
学号:
XXXXXXXX
XXXXXXXX
姓名:
XXX
XXX
指导老师:
XXX
xxxx年x月
一.课设任务
通过综合应用所学专业知识,能够利用FPGA器件设计一个基于多相滤波结构的数字正交下变频器。
掌握组合、时序逻辑电路的综合设计应用。
熟悉数字接收机中的下变频原理,以FPGA芯片为硬件平台,利用VHDL硬件描述语言,对电路进行设计描述、功能仿真、时序仿真,并能将设计结果在硬件平台上演示。
熟悉QuartusII软件、DE2硬件平台和FPGA硬件开发流程,掌握软硬件联合设计的新型电子设计方法。
提高动手能力,培养工程实践素养。
本次综合课设分两大部分:
第一部分通过两个基础实验完成对FPGA设计应用基础知识的掌握,包括对VHDL语言的掌握、DE2实验板的掌握、设计中需要用到的基础模块的设计掌握。
第二部分为综合设计,要求学生在掌握第一部分基础设计知识的前提下,通过综合运用理论分析和设计实践,利用DE2硬件开发平台,完成数字通信、信号处理领域常用的、基于多相滤波结构的数字正交下变频器设计。
二.课设设备
硬件平台:
DE2实验板
软件平台:
QuartusII仿真软件、Matlab软件
三.基础设计
(一)ROM的设计
ROM即只读存储器,主要用作存储固定的数据。
在设计ROM时,可采用数组或WHEN-ELSE语句。
我们选择采用比较直观的WHEN-ELSE语句,VHDL语言如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityromis
port(
add:
instd_logic_vector(3downto0);
cs:
instd_logic;
data:
outstd_logic_vector(7downto0)
);
endrom;
architecturebehavofromis
begin
data<="00000110"whenadd="0000"andcs='0'else
"00010101"whenadd="0001"andcs='0'else
"00010100"whenadd="0010"andcs='0'else
"00010011"whenadd="0011"andcs='0'else
"00010010"whenadd="0100"andcs='0'else
"00010001"whenadd="0101"andcs='0'else
"00010000"whenadd="0110"andcs='0'else
"00001001"whenadd="0111"andcs='0'else
"00001000"whenadd="1000"andcs='0'else
"00000111"whenadd="1001"andcs='0'else
"00000110"whenadd="1010"andcs='0'else
"00000101"whenadd="1011"andcs='0'else
"00000100"whenadd="1100"andcs='0'else
"00000011"whenadd="1101"andcs='0'else
"00000010"whenadd="1110"andcs='0'else
"00000001"whenadd="1111"andcs='0'else
"00000000";
endbehav;
当片选信号CS有效,则可根据地址信号add[3…0]读取单元内容,在输出端DATA[7…0]输出数据。
当CS无效,输出总为低电平“00000000”。
仿真波形图如下:
图1.116x8的ROM仿真波形
对源代码进行了修改,即增加了两个数码管的译码程序。
其中输入地址与输出数据对应关系如下:
地址
输出
地址
输出
地址
输出
地址
输出
00
16
04
12
08
08
0C
04
01
15
05
11
09
07
0D
03
02
14
06
10
0A
06
0E
02
03
13
07
09
0B
05
0F
01
表1.116x8的ROM内容
源代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityromis
port(
add:
instd_logic_vector(3downto0);
cs:
instd_logic;
data:
bufferstd_logic_vector(7downto0);
datah:
bufferstd_logic_vector(3downto0);
datal:
bufferstd_logic_vector(3downto0);
data_outh:
outstd_logic_vector(6downto0);
data_outl:
outstd_logic_vector(6downto0));
endrom;
architecturebehavofromis
begin
data<="00000110"whenadd="0000"andcs='0'else
"00010101"whenadd="0001"andcs='0'else
"00010100"whenadd="0010"andcs='0'else
"00010011"whenadd="0011"andcs='0'else
"00010010"whenadd="0100"andcs='0'else
"00010001"whenadd="0101"andcs='0'else
"00010000"whenadd="0110"andcs='0'else
"00001001"whenadd="0111"andcs='0'else
"00001000"whenadd="1000"andcs='0'else
"00000111"whenadd="1001"andcs='0'else
"00000110"whenadd="1010"andcs='0'else
"00000101"whenadd="1011"andcs='0'else
"00000100"whenadd="1100"andcs='0'else
"00000011"whenadd="1101"andcs='0'else
"00000010"whenadd="1110"andcs='0'else
"00000001"whenadd="1111"andcs='0'else
"00000000";
process(data)
begin
datah<=data(7downto4);
datal<=data(3downto0);
casedatahis
when"0000"=>data_outh<="1000000";--0
when"0001"=>data_outh<="1111001";--1
when"0010"=>data_outh<="0100100";--2
when"0011"=>data_outh<="0110000";--3
when"0100"=>data_outh<="0011001";--4
when"0101"=>data_outh<="0010010";--5
when"0110"=>data_outh<="0000011";--6
when"0111"=>data_outh<="1111000";--7
when"1000"=>data_outh<="0000000";--8
when"1001"=>data_outh<="0011000";--9
when"1010"=>data_outh<="0001000";--A
when"1011"=>data_outh<="0000011";--B
when"1100"=>data_outh<="0100111";--C
when"1101"=>data_outh<="0100001";--D
when"1110"=>data_outh<="0000110";--E
when"1111"=>data_outh<="0001110";--F
whenothers=>NULL;
endcase;
casedatalis
when"0000"=>data_outl<="1000000";--0
when"0001"=>data_outl<="1111001";--1
when"0010"=>data_outl<="0100100";--2
when"0011"=>data_outl<="0110000";--3
when"0100"=>data_outl<="0011001";--4
when"0101"=>data_outl<="0010010";--5
when"0110"=>data_outl<="0000011";--6
when"0111"=>data_outl<="1111000";--7
when"1000"=>data_outl<="0000000";--8
when"1001"=>data_outl<="0011000";--9
when"1010"=>data_outl<="0001000";--A
when"1011"=>data_outl<="0000011";--B
when"1100"=>data_outl<="0100111";--C
when"1101"=>data_outl<="0100001";--D
when"1110"=>data_outl<="0000110";--E
when"1111"=>data_outl<="0001110";--F
whenothers=>NULL;
endcase;
endprocess;
endbehav;
编译、仿真,锁定管脚并下载到DE2板子上的目标芯片内。
其中SW4作为片选信号CS(低平有效),SW0-SW3作为地址输入add[3…0],数码管HEX0-HEX1显示输出数据。
实验现象:
图1.2Whenadd="0001"andCS='0'
(二)基于DDS的多功能信号发生器
DDS的原理框图如图2.1所示。
图中相位累加器可在每一个时钟周期来临时将频率控制字(TUNINGWORD)所决定的相位增量M累加一次,如果记数大于
,则自动溢出,而只保留后面的N位数字于累加器中。
正弦查询表ROM用于实现从相位累加器输出的相位值到正弦幅度值的转换,然后送到DAC中将正弦幅度值的数字量转变为模拟量,最后通过滤波器输出所需正弦波信号。
图2.1DDS原理框图
由于相位累加器是N比特的模2加法器,正弦查询表ROM中存储一个周期的正弦波幅度量化数据,频率控制字是M时,每
个时钟周期输出一个周期的正弦波。
所以此时有:
式中
为输出信号的频率,
为时钟频率,
为累加器的位数。
根据前面介绍的相位累加原理,应用图形化输入,进行设计,得到FPGA实现的DDS,其顶层模块如下图所示:
图2.2用HDL设计的DDS顶层模块图
其中相位累加器累加步长为24位,用累加器输出的高8位作为ROM的地址,ROM中加载Mif文件,实现正弦输出。
Mif文件由Matlab软件编译生成,M文件如下:
clc;
clear;
myfid=fopen('dds.mif','w');
x=[0:
0.0246:
2*pi];
y=fix(127*sin(x));
leny=length(y);
fori=1:
leny
ify(i)<0
y(i)=y(i)+256;
end;
fprintf(myfid,'%d:
%d\n',i-1,y(i));
end;
fclose(myfid);
实验现象:
图2.3相位累加步长为0x010000时的DDS输出波形
图2.4相位累加步长为0x100000时的DDS输出波形
图2.5相位累加步长为0x400000时的DDS输出波形
由图可知,当M从0x100000变为0x400000时,其值增加4倍,则DDS输出信号频率也增加了4倍;M值越小,采样点数就越多,输出波形失真就越小;M值越大,采样点数越少,输出波形变得粗糙。
四.综合设计
基于多相滤波结构的数字正交下变频器设计
对于模拟正交变换进行数字化改造,即将ADC提前,将混频和滤波在数字域进行。
考虑对滤波后的数据要进行2抽1,为进一步减少运算冗余,根据多速率数字信号处理理论,可将抽取运算放在滤波之前,同时NCO的输出也要做相应变化,且这时的LPF变成了奇偶分离的多相结构。
经过上述一系列变换后的正交变换模型如图所示。
图3.1多相滤波结构数字正交变换
首先进行低通滤波器的设计,在QuartusII软件中应用tools选项中的MegaWizardPlug-InManager设计一个64阶的低通滤波器,其参数设置如下:
InputBitWidth:
8位
FullResolutionBitWidth:
24位
FilterType:
LowPass
WindowType:
Blackman
Coefficients:
64
SampleRate:
1.2*10^8
CutoffFreq:
2.5*10^7
源代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_signed.all;
entitych_iqis
port(
din:
instd_logic_vector(7downto0);
clk:
instd_logic;
dinlpfeven:
outstd_logic_vector(7downto0);
dinlpfodd:
outstd_logic_vector(7downto0);
clko:
outstd_logic
);
endch_iq;
architecturertlofch_iqis
signalclkd2:
std_logic:
='0';
signaltcnt:
std_logic:
='0';
signaldineven,dinodd:
std_logic_vector(7downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
clkd2<=notclkd2;
if(clkd2='0')then
dineven<=din;
else
dinodd<=din;
endif;
endif;
endprocess;
process(clkd2)
begin
if(clkd2'eventandclkd2='1')then
tcnt<=nottcnt;
if(tcnt='0')then
dinlpfeven<=dineven;
dinlpfodd<=-dinodd;
else
dinlpfeven<=-dineven;
dinlpfodd<=dinodd;
endif;
endif;
endprocess;
clko<=clkd2;
endrtl;
编译成功后生成相应的模块文件,将基础设计中的DDS正弦信号发生器模块加载进来,作为整个系统的输入信号,再将两路32阶低通滤波器加载进来。
得到整个系统的模块图如下:
图3.2数字正交下变频器系统模块图
实验现象:
图3.3datain=0x400000
图3.4datain=0x410000
时钟周期选择为20ns,采样率fs=50M,则fs/4=12.5M。
datain=0x400000,DDS信号频率为12.5M,经过低通滤波后,两路输出稳定后为直流,如图3.3所示;datain=0x410000,DDS信号频率为12.6MHz,经过低通滤波后,得到两路低频正交正弦信号,如图3.4所示。
将信号添加到ALTERA提供的嵌入式逻辑分析仪(SignalTap)中,获取系统实时运行情况。
结果如下图:
图3.5datain=48003Fh时的SignalTap输出信号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 数字 正交 变频器 设计