您的当前位置:首页2021年度基于FPGA的直接数字频率合成器设计

2021年度基于FPGA的直接数字频率合成器设计

来源:小侦探旅游网



JIANGSU UNIVERSITY OF TECHNOLOGY

FPGA技术试验汇报

基于FPGA直接数字频率合成器设计

学院: 电气信息工程学院
专业: 测控技术和仪器
班级: 11测控2
姓名:
学号:
指导老师:

时间: 12





目 录
一、功效要求和整体设计------------------------------
3
1.1功效要求-----------------------------------------
3
1.2整体设计-----------------------------------------
3
二、 DDS技术基础原理-----------------------------3
三、 基础DDS设计-----------------------------------
5
3.1频率预置和调整电路-------------------------------
5

5
3.3波形存放器--------------------------------------6
3.4D/A转换器---------------------------------------6
3.5低通滤波器--------------------------------------6
四、 基于DDS正弦信号发生器设计实现---------------6 4.132位加法器ADDER32设计---------------------------6



4.2 32位寄存器REG32B设计----------------------------
7
4.3正弦波ROM设计-----------------------------------
8
五、程序设计----------------------------------------
9
5.1正弦波产生程序设计--------------------------------
9
5.2三角波产生程序设计------------------------------
11
5.3方波产生程序设计--------------------------------
12

14
5.5顶层仿真---------------------------------------16
六、DAC0832接口电路及程序设计--------------------17
6.1DAC0832接口电路设计-----------------------------17
6.2DAC0832 接口程序设计---------------------------- 18



七、 软硬件调试------------------------------------
18
7.1软件下载----------------------------------------
18
7.2硬件调试----------------------------------------
19
八、心得体会---------------------------------------
22
九、参考文件----------------------------------------
22
十、附录-------------------------------------------
23

23
附录2实物图------------------------------------27





一、功效要求和整体设计

1.1功效要求
设计一个多功效波形发生器。该波形发生器能产生正弦波、方波、三角波和由用户编辑特定形状波形。具体要求以下:

2)用键盘输入编辑生成上述4种波形(同周期)线性组合波形。
1)含有产生正弦波、方波、三角波、锯齿波4种周期性波形功效。

5)含有显示输出波形类型、反复频率(周期)和幅度功效。

1.2整体设计
多功效波形发生器系统由输入部分、FPGA部分、DAC、显示部分四部分组成。 其系统框图图1-1所表示





1-1系统框图

二、DDS技术基础原理

对于正弦信号发生器,它输出能够用下式来描述:

上式表述对于时间t是连续,为了用数字逻辑实现该表示式,

必需进行离散化处理,用基按时钟clk进行抽样,令正弦信号相位θ

2

f

outt

2

在一个clk周期Tclk,相位θ改变量为

3

其中fclkclk频率对于能够了解为“满”相位,为了对Δθ进行数字量化,

切割成2N,用词每个clk周期相位增量Δθ用量化值BΔθ来描述:

BΔθ=Δθ·2N/2π,BΔθ为整数和上式联立可得:



4

显然,信号发生器能够描述

5

其中θk-1指前一个clk周期相位值,一样得出

6

由以上推倒能够得出,只要对相位量化值进行简单累加运算,

够得 正弦 信号 ,

直接数字合成器DDS就是依据以上原理而设计数控频率合成器,2-

1为其基础DDS结构,关键有相位累加器、相位调制器、

正弦ROM查找表组成图中相位累加器、相位调制器、

正弦ROM查找表是DDS结构中数字部分。

2-1 基础DDS结构




三、 基础DDS设计

DDS基础组成图3-1所表示。

3-1DDS基础组成

3.1频率预置和调整电路

此部分关键实现频率控制量输入和调整,不变量K被称为相位增量,

3.2 累加器 也叫频率控制字,经过调整频率控制字能够改变信号输出频率。


3-2相位累加器组成框图

时钟 , ,

当相位累加器累加满量时就会产生一次溢出,完成一个周期性动作。

3.3 波形存放器



能够进行波形相位—幅值转换。ROMN位地址:0—

360度正弦角度离散成含有2N个样值序列;ROMD位数据位:

2N个样值幅值量化为D位二进制数据。

3.4D/A转换器

D/A转换器能够把已经合成波形数字量转换成模拟量。

3.5低通滤波器

滤除生成阶梯形正弦波中高频成份,将其变成光滑波形。

基于DDS正弦信号发生器设计实现

依据设计原理框图分别设计出加法器、寄存器、 正弦波等ROM

4.132位加法器ADDER32设计

在原理图文件下在空白处双击,单击“MegaWizardPlug-In

Manager”选择第一项, 4-1所表示。


4-1原理图设置

选择器 cyclone, 言方 VerilogHDL

在算数项Arithmetic中选择计数器LPM_ADD_SUB.存于所建工程文件夹下命名为A

DDER32.




单击NEXT,进入以后对话框后选择32位加法器工作模式选择有一位加法进位输出,选择有符号加法方法,选择2级流水线工作模式,此时该加法器变为有时序电路模块,最终至finish按钮,编辑完成,32位加法器模块图4-2所表示。

4-232位加法器模块

4.2 32位寄存器REG32B设计

4-3 32位寄存器模块

DFF32ADDER32组成一个32位累加器其高十位A[31..22]为波形数据ROM地址。



十位加法器和寄存器和32位方法相同。

4.3正弦波ROM设计

a.首先经过mif文件来产生正弦波

注意:在生成正弦波时候要注意和sin_rom中数据一致。即位DEPTH=

1024;WIDTH= 10;这么才能确保在最终输出中能够有完整正弦波图形输出。存盘并命名为sin_rom.mif

b.LPM_ROM

:

ADDER32

LMP_ROM,

Memory

Complier”

ROM:1-

PORT”,依次设定地址线和数据线位宽均为十位,最终产生LMP_ROM,4-4所表示。



4-4正弦波模块
其它波形ROM和正弦波类似。

五、程序设计

5.1正弦波产生程序设计

经过循环不停地从RAM中依次读取正弦波一个周期在时域上64个采样点波形数据送入波形DAC,从而产生正弦波。 正弦波频率取决于读取数据速度。

程序以下:



LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYaltera_mf;
USEaltera_mf.all;
ENTITYsin_rom IS
PORT

(

address

: IN STD_LOGIC_VECTOR (9 DOWNTO 0);

inclock

: IN STD_LOGIC ;

q: OUT STD_LOGIC_VECTOR (9 DOWNTO 0));
END sin_rom;
ARCHITECTURE SYN OF sin_rom IS
SIGNAL sub_wire0 :STD_LOGIC_VECTOR (9 DOWNTO 0);
COMPONENT altsyncram GENERIC(
init_file : STRING;
intended_device_family :STRING;
lpm_hint : STRING;
lpm_type
: STRING;numwords_a : NATURAL;
operation_mode : STRING;
outdata_aclr_a : STRING;
outdata_reg_a
:STRING; ram_block_type : STRING;
widthad_a : NATURAL;

width_a : NATURAL;



width_byteena_a : NATURAL);
PORT (
clock0 : INSTD_LOGIC ;
address_a : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
q_a
: OUT STD_LOGIC_VECTOR (9 DOWNTO 0)); ENDCOMPONENT;
BEGIN
q <= sub_wire0(9 DOWNTO 0);
altsyncram_component : altsyncram
GENERIC MAP (
clock_enable_input_a => "BYPASS",
clock_enable_output_a => "BYPASS",
init_file=> "myrom.mif", intended_device_family => "CycloneII",
numwords_a => 1024,
operation_mode =>"ROM",
outdata_aclr_a => "NONE",
outdata_reg_a => "CLOCK0",
ram_block_type =>"M4K",
widthad_a => 10,
width_a => 10,
width_byteena_a => 1)

PORT MAP (
clock0 => inclock,



address_a => address,



q_a=> sub_wire0);
ENDSYN;

5.2三角波产生程序设计

三角波波形是对称,每边呈线形改变,所以能够依据地址数据做简单运算,就能够得到三角波。

程序以下:
library ieee;
use ieee.std_logic_1164.all;
useieee.std_logic_unsigned.all; --程序包
--定义三角波实体entitytriangle is
port(clk,reset:in std_logic;
q:outstd_logic_vector(7 downto 0));
end triangle;
variabletmp:std_logic_vector(7 downto 0);
--定义中间变量tmpa
variable a:std_logic;
begin
ifreset='0'then --复位信号设置
tmp:="00000000";
elsif rising_edge(clk) then --捕捉时钟信号上升沿
--if a='0'then

a=0时依次输出三角波上升沿 if tmp="11111110"then





tmp:="11111111";
a:='1';
else
tmp:=tmp+1;
end if;
else --
a=1时依次输出三角波下降沿
iftmp="00000001"then
tmp:="00000000";
a:='0';
else
tmp:=tmp-1;
end if; end if;
end process;
end behav;

5.3方波产生程序设计

64

,

64个采样点数据只有“低电平” 和“ 高电平” 2种状态。更改“低电平”和“高电平”出现百分比,能够达成调整占空比目标。

程序以下:
libraryieee;

use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;





entity square is
port(clk,reset: in std_logic;
q:outstd_logic_vector(7 downto 0));
end square;
architecturebehav of square is
signal a:std_logic;
begin
process(clk,reset)
variable tmp:std_logic_vector(7downto 0);
begin
if reset='0'then
a<='0';
elsif rising_edge(clk) then if tmp="11111111"then
end if;
if tmp<="10000000"then
a<='1';
else
a<='0';
end if;
end if;
end process;

process(clk,a)
begin



if rising_edge(clk)then



ifa='1' then
q<="11111111";
else
q<="00000000";
endif;
endif;
endprocess;
endbehav;

5.4锯齿波产生程序设计

产生单调性锯齿波,所以把地址数据进行左移2,结果送波形DAC就可。

程序以下:
LIBRARYieee;
USE ieee.std_logic_1164.all;
PORT
: INSTD_LOGIC_VECTOR (9 DOWNTO 0); (address
clock : INSTD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0));
ENDjuxing;
ARCHITECTURE SYN OF juxing IS
:STD_LOGIC_VECTOR (9 DOWNTO 0); SIGNAL sub_wire0
COMPONENTaltsyncram

GENERIC (clock_enable_input_a clock_enable_output_a

: STRING;

:STRING;




init_file : STRING;
intended_device_family : STRING;
lpm_hint : STRING;
lpm_type : STRING;
numwords_a : NATURAL;
operation_mode: STRING;
outdata_aclr_a: STRING;
outdata_reg_a : STRING;
ram_block_type : STRING;
widthad_a : NATURAL;
width_a : NATURAL;
width_byteena_a : NATURAL );
PORT (clock0 address_a : IN STD_LOGIC ;: INSTD_LOGIC_VECTOR (9 DOWNTO 0);
BEGIN
q <=sub_wire0(9 DOWNTO 0);
altsyncram_component : altsyncram
GENERIC MAP (
clock_enable_input_a => "BYPASS",
clock_enable_output_a => "BYPASS",
init_file => "juxing.mif",
intended_device_family => "Cyclone II",

lpm_hint => "ENABLE_RUNTIME_MOD=NO", lpm_type => "altsyncram",
numwords_a => 1024,




operation_mode=> "ROM",
outdata_aclr_a=> "NONE",
outdata_reg_a=> "CLOCK0",
ram_block_type=> "M4K",
widthad_a=> 10,
width_a=> 10,
width_byteena_a=> 1 )
PORTMAP (
clock0=> clock,
address_a=> address,
q_a=> sub_wire0);
END SYN;

5.5 顶层仿真

频率控制字为2仿真波形

频率控制字为12仿真波形





频率控制字为13仿真波形
5-1波形仿真结果

六、DAC0832接口电路及程序设计

6.1DAC0832接口电路设计

1FPGA_IO1-8DAC0832数据输入口(DI0-DI7)输送数据。

2FPGA_IO9提供DAC0832数据锁存许可控制信号ILE,高电平有效。

3FPGA_IO10提供DAC0832控制信号(CS:片选信号;XFER:

4 IOUT2、数据传输控制信号;WR1WR2:DAC寄存器写选通信号),低电平有效;






6-1FPGADAC0832接口电路原理图

6.2DAC0832 接口程序设计

依据图6-2DAC0832 输出控制时序,利用接口电路图,

经过改变输出数据设计一个锯齿波发生器。DAC08328D/A转换器,

转换周期为1μs。锯齿波形数据能够由256个点组成,每个点数据长度为8位。

又因为FPGA系统时钟为50MHz,必需对其进行分频处理,这里进行64分频,

得到锯齿波频率为762.9Hz



6-2 DAC0832输出控制时序图

七、软硬件调试

7.1软件下载

仿 ,

在“Assignment”菜单下选择“Device”项进行器件选择CycloneEP2C5T144C

8器件, 在“Assignment”菜单下选择”pins”, 进行管脚锁定。

引脚锁定图7-1所表示。






,

成功后选择“tools”菜单下“programmer”项进行下载。

7.2硬件调试
FPGAD/A转换模块连好,接示波器进行观察调试。









f


f

clk

FTWORD






out



10
2

;

7-

2

0CH

7-

3

1CH

;

7-



4所表示为频率控制字是3CH四种波形调试结果。





7-2 控制字为08H四种波形

f

out

f

clk

195.31Hz,






7-3控制字为0CH四种波形

f

out

f

clk


292.968Hz,


7-4控制字为0DH四种波形


f


f

clk

FTWORD


依据公式


out





10
2

, 求得输出频率为390.625Hz四种波形频率和理论值基础一致,




但每个波形全部有一定误差。

八、心得体会

两周课程设计结束了,在这次课程设计中不仅检验了我所学习知识,
也培养了我怎样去把握一件事情,怎样去做一件事情,又怎样完成一件事情。

在设计过程中,和同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了了解,也学会了做人和处世。

课程设计是我们专业课程知识综合应用实践训练,着是我们迈向社会,从事职业工作前一个必不少过程.千里之行始于足下,经过这次课程设计,我深深体会到这句千古名言真正含义.我今天认真进行课程设计,

学会脚扎实地迈开这一步, 就是为明天能稳健地在社会大潮中奔跑打下坚实基础.
综合利用本专业所学课程理论和知识进行设计工作实际训练从而培养和提升学生独立工作
经过这次FPGA课程设计, 本人在多方面全部有所提升。经过这次设计,

在这次设计过程中,表现出自己单独设计能力和综合利用知识能力,体会了学以致用、突出自己劳动结果喜悦心情,从中发觉自己平时学习不足和微弱步骤,从而加以填补。

在此感谢我们老师.,老师严谨细致、一丝不苟作风一直是我工作、学习中楷模;老师循循善诱教导和不拘一格思绪给我无尽启迪;这次设计每个试验细节和每个数据,全部离不开老师您细心指导。同时感谢对我帮助过同学们,谢谢你们对我帮助和支持,让我感受到同学友谊。

因为本人设计能力有限,在设计过程中难免出现错误,
恳请老师们多多指教,我十分愿意接收你们批评和指正,本人将万分感谢。





九、参考文件

[1]朱小斌.《电子测量仪器》北京:电子工业出版社,1996
[2]Michael LauterbachArtpin.《任意波形发生器在通讯测试中应用》电子产品世界,1997
[3]史海明.《个人仪器多功效任意波形发生器研制》仪表技术,1988
[4]林青.《DDS在数字调制中应用.无线电工程》,
[5]张开增,张迎新,王尚忠.《高分辨率高稳度宽带函数发生器研制》华北工学院学报
[6]华清远见嵌入式培训中心.《FPGA应用开发入门和经典实例》北京:人民邮电出版社,


十、 附录 附录1源程序清单

LIBRARY IEEE; --DDS顶层设计
USEIEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DDS_VHDL IS
PORT ( CLK : IN STD_LOGIC;
selz: in std_logic_vector(1 downto 0);
FWORD : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --频率控制字 PWORD : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --相位控制字 FOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );



END;
ARCHITECTURE one OF DDS_VHDL IS
component freis
port( clk1:in std_logic;
outclk:outstd_logic);
end component;
component juxing IS
PORT
(address : IN STD_LOGIC_VECTOR (9 DOWNTO0);
clock : IN STD_LOGIC ;
q : OUTSTD_LOGIC_VECTOR (9 DOWNTO 0));
END component;
COMPONENT sanjiao IS
PORT clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0));
ENDCOMPONENT;
COMPONENT fangbo IS
PORT
(address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
clock : INSTD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0));

END COMPONENT;
COMPONENT mux41 is



port(sel:in std_logic_vector(1 downto 0);--定义输入端口sel



d1,d2,d3,d4:in std_logic_vector(9 downto 0);--
定义输入端口d1,d2,d3,d4
q:out std_logic_vector(9 downto 0));--定义输出端口 end COMPONENT;
COMPONENT mux411 is
port(sel:in std_logic_vector(1 downto 0);--定义输入端口sel d1,d2,d3,d4:out std_logic_vector(9 downto 0);--
定义输入端口d1,d2,d3,d4
q:in std_logic_vector(9 downto 0));--定义输出端口 end COMPONENT;
COMPONENT REG32B
PORT ( LOAD : IN STD_LOGIC;

DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) ); DIN : INSTD_LOGIC_VECTOR(31 DOWNTO 0);
PORT ( LOAD : INSTD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
COMPONENT ADDER32B
PORT ( A : IN STD_LOGIC_VECTOR(31 DOWNTO0);
B : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
S : OUTSTD_LOGIC_VECTOR(31 DOWNTO 0) );

END COMPONENT;
COMPONENT ADDER10B



PORT ( A : IN STD_LOGIC_VECTOR(9 DOWNTO 0);



B : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END COMPONENT;
COMPONENT SIN_ROM

PORT

( address

: IN STD_LOGIC_VECTOR(9 DOWNTO 0);

);

inclock

: IN STD_LOGIC ;

q

: OUT STD_LOGIC_VECTOR(9 DOWNTO 0)

END COMPONENT;
signal clk2 : std_logic;
SIGNALF32B : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL D32B : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL DIN32B : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL P10B : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL LIN10B : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL FANG10B : STD_LOGIC_VECTOR( 9 DOWNTO0);
SIGNAL juxing10B : STD_LOGIC_VECTOR( 9 DOWNTO 0);
signal d11,d22,d33,d44: std_logic_vector(9 downto 0);
signal MOUT: std_logic_vector(9 downto 0);
BEGIN
F32B(27 DOWNTO 20)<=FWORD ; F32B(31 DOWNTO 28)<="0000";
P10B( 1 DOWNTO 0)<="00" ;
F32B(19 DOWNTO0)<="00000000" ; P10B( 9 DOWNTO 2)<=PWORD ;
u1: fre port map( clk1=>clk,outclk=>clk2);
u2 :ADDER32B PORT MAP( A=>F32B,B=>D32B, S=>DIN32B );

u3 : REG32B PORT MAP( DOUT=>D32B,DIN=> DIN32B, LOAD=>CLK2);



u4 : SIN_ROM PORT MAP( address=>SIN10B, q=>d11,inclock=>CLK2 );
u5 : SANJIAO PORT MAP(address=>SANJIAO10B, q=>d22, clock=>CLK2 );
u6 : FANGBO PORT MAP( address=>FANG10B, q=>d33, clock=>CLK2 );
u7 : juxing PORT MAP( address=>juxing10B, q=>d44,clock=>CLK2 );
u8 : ADDER10B PORT MAP( A=>P10B,B=>D32B(31DOWNTO 22),S=>LIN10B );
u9 : mux411 port
map(sel=>selz,d1=>SIN10B,d2=>SANJIAO10B,d3=>FANG10B,d4=>juxing10b,q=>
MOUT);
u10 : REG10B PORT MAP( DOUT=>MOUT,DIN=>LIN10B,LOAD=>CLK2 );
u11 : mux41 port
map(sel=>selz,d1=>d11,d2=>d22,d3=>d33,d4=>d44,q=>FOUT);
END;


附录2实物图









显示全文