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)
其中fclk指clk频率对于2π能够了解为“满”相位,为了对Δθ进行数字量化,
把2π切割成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-1为DDS基础组成
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位寄存器模块
DFF32和ADDER32组成一个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);
--定义中间变量tmp、a
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接口电路设计
(1)FPGA_IO1-8向DAC0832数据输入口(DI0-DI7)输送数据。
(2)FPGA_IO9提供DAC0832数据锁存许可控制信号ILE,高电平有效。
(3)FPGA_IO10提供DAC0832控制信号(CS:片选信号;XFER:
( 4) IOUT2、数据传输控制信号;WR1、WR2:DAC寄存器写选通信号),低电平有效;
图6-1FPGA和DAC0832接口电路原理图
6.2DAC0832 接口程序设计
依据图6-2DAC0832 输出控制时序,利用接口电路图,
经过改变输出数据设计一个锯齿波发生器。DAC0832是8位D/A转换器,
转换周期为1μs。锯齿波形数据能够由256个点组成,每个点数据长度为8位。
又因为FPGA系统时钟为50MHz,必需对其进行分频处理,这里进行64分频,
得到锯齿波频率为762.9Hz。
图6-2 DAC0832输出控制时序图
七、软硬件调试
7.1软件下载
调 试 、 仿 真 成 功 后 进 行 硬 件 调 试 阶 段 ,
在“Assignment”菜单下选择“Device”项进行器件选择Cyclone中EP2C5T144C
8器件, 在“Assignment”菜单下选择”pins”项, 进行管脚锁定。
引脚锁定图7-1所表示。
管 | 脚 | 锁 | 定 | 后 | 再 | 次 | 进 | 行 | 编 | 译 | , |
成功后选择“tools”菜单下“programmer”项进行下载。
7.2硬件调试
将FPGA和D/A转换模块连好,接示波器进行观察调试。
| | 输 | | | 率 | | | | | f | | | f | clk | | FTWORD | | | | | ||||
波 | 形 | 出 | 频 | 应 | 满 | 足 | 种 | | out | | | 10 | 。 | 果 | ; | 图 | 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 | , 求得输出频率为390.625Hz四种波形频率和理论值基础一致, |
但每个波形全部有一定误差。
八、心得体会
两周课程设计结束了,在这次课程设计中不仅检验了我所学习知识,
也培养了我怎样去把握一件事情,怎样去做一件事情,又怎样完成一件事情。
在设计过程中,和同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了了解,也学会了做人和处世。
课程设计是我们专业课程知识综合应用实践训练,着是我们迈向社会,从事职业工作前一个必不少过程.”千里之行始于足下”,经过这次课程设计,我深深体会到这句千古名言真正含义.我今天认真进行课程设计,
学会脚扎实地迈开这一步, 就是为明天能稳健地在社会大潮中奔跑打下坚实基础. |
在这次设计过程中,表现出自己单独设计能力和综合利用知识能力,体会了学以致用、突出自己劳动结果喜悦心情,从中发觉自己平时学习不足和微弱步骤,从而加以填补。
在此感谢我们老师.,老师严谨细致、一丝不苟作风一直是我工作、学习中楷模;老师循循善诱教导和不拘一格思绪给我无尽启迪;这次设计每个试验细节和每个数据,全部离不开老师您细心指导。同时感谢对我帮助过同学们,谢谢你们对我帮助和支持,让我感受到同学友谊。
因为本人设计能力有限,在设计过程中难免出现错误,
恳请老师们多多指教,我十分愿意接收你们批评和指正,本人将万分感谢。
九、参考文件
[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实物图