第一篇:电子设计大赛:DDS 信号发生器
DDS 信号发生器(1022)
产品应用: 模拟传感器信号 重现实际环境信号 电路功能测试 信号相位调试 科研与教育 最高输出频率 输出通道数 采样率 任意波长度
CH1 CH2MHz 2 100 MSa/s 2 pts – 4kpts 2pts – 1kpts 1 μHzmVpp ~ 10 Vpp(50 Ω),4 mV ~ 20 Vpp(高阻)mVpp ~ 3 Vpp(50 Ω),4 mV ~ 6 Vpp(高阻)14 bits 10 bits
USB Host & Device 无
台式函数/任意波形发生器 宽×高×深=232mm×108mm×288mm 2.7 kg
频率分辨率 幅度范围 垂直分辨率
CH1 CH2 CH1 CH2
标配接口 选配接口 产品类别 尺寸 重量 产品综述
函数/任意波形发生器采用直接数字频率合成(DDS)技术设计,能够产生精确、稳定、低失真的输出信号。产品特性
1.采用先进的DDS技术,双通道输出,内置频率计,25 MHz最高输出频率
2.LCD单色液晶显示屏
3.5种标准波形及48种预设任意波形输出,可编辑10组4 kpts任意波形
4.丰富的调制功能:AM、FM、PM、FSK,以及输出线性/对数扫描和脉冲串波形5.丰富的接口配置:标配USB Host,USB Device
第二篇:DDS函数信号发生器的设计
DDS函数信号发生器的设计、仿真及下载
一、实验设计
① 利用DDS(Direct DIgital Frequency Synthesis,即直接数字频率合成)技术产生稳定的正弦波,三角波和方波输出,输出频率为10~1000kHz且频率可调,步进为10Hz,1kHz,10kHz,100kHz。
② 用VerilogHDL进行建模和模拟仿真,再利用FPGA进行实现D/A转换。
③ 下载到DE0板上利用VGA端口的一个四位孔进行A/D转换显示在示波器上。
二、实验原理
一个直接数字频率合成器由相位累加器、波形ROM、D/A转换器和低通滤波器构成。DDS的原理框图如下所示:
图 1 直接数字频率合成器原理图
其中K为频率控制字,fc为时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。相位累加器在时钟 fc的控制下以步长K作为累加,输出N位二进制码作为波形ROM的地址,对波形ROM进行寻址,波形ROM输出的幅码S(n)经D/A转换器变成梯形波S(t),再经低通滤波器平滑后就可以得到合成的信号波形了。合成的信号波形形状取决于波形ROM中存放的幅码,因此用DDS可以产生任意波形。【来自百度】
本设计中直接利用DE0开发板通过D/A转换得到输出波形,省略了低通滤波器这一环节。
DDS工作流程示意图:
DDS的具体实现框图:
三、实验内容:
1、相位累加器和数据锁存器的设计
本设计采用模24的二进制累加器和寄存器,其中累加器和寄存器在一个模块中,只取锁存数据的高十位作为查表的地址值。//地址计数器模块;
module counter(clk,fre_word,address);input clk;
//声明系统时钟为clk
input [23:0] fre_word;
//声明24为频率控制字
output reg [9:0] address;
reg [23:0] phaseadder;always @(posedge clk)begin
phaseadder=phaseadder+fre_word;address=phaseadder[23:14];//地址取输出锁存后十位(对应波形为一个周期取1024点)
end endmodule2、波形存储器设计
本设计要求DDS系统能输出方波、三角波及正弦波三种波形。可以调用FPGA的LPM_ROM模块制作三张ROM表,地址计数器可以同时访问这三张表,再使用数据选择器输出指定波形。实际上,方波,三角波的实现算法比较简单,所以只把正弦波的算法用ROM实现。//方波产生模块
module squwave(clk,address,qsquare);
input clk;
//系统时钟;input [9:0] address;
//10位地址输入信号;
output reg [7:0] qsquare;//输出方波幅度信号8位宽送至DAC
always @(posedge clk)
if(address<=10'b01_1111_1111)qsquare[7:0]=8'b1111_1111;else qsquare[7:0]=8'b0000_0000;endmodule
//三角波产生模块
module triawave(clk,address,qtriangle);input clk;
input [9:0] address;output reg [7:0] qtriangle;always @(posedge clk)begin if(address<=10'b01_1111_1111)qtriangle[7:0]=address[8:1];else qtriangle[7:0]=~address[8:1];end endmodule
//正弦波形文件制作(C语言)#include
s=128+sin(atan(1.0)*8/1024*i)*127;
fprintf(fp,“%xt:t%x;n”);} fprintf(fp,“END;n”);fclose(fp);} 生成mif格式文件,然后可以调用LPM_ROM模块实现正弦波产生模块。
3、波形的综合输出
DDS系统中产生了三种波形,但是在每种情况下只输出一种波形,因此要设计一个多路选择器完成这种功能。输出何种波形由外部开关控制。//boxing.v module boxing(clk,address,wavemode,wavevalue);
input clk;
input [1:0] wavemode;
//波形模式信号
input [9:0] address;
//十位地址输入信号
output [7:0] wavevalue;
//对应不同的波形输出
reg [7:0] wavevalue;wire [7:0] q,qsquare,qtriangle;sinwave a(address,clk,q);
//调用正弦波产生模块
squwave b(clk,address,qsquare);//调用方波产生模块
triawave c(clk,address,qtriangle);//调用三角波产生模块 always @(posedge clk)case(wavemode)2'b01:wavevalue=q;//01代表正弦波
2'b10:wavevalue=qsquare;
//10代表方波
2'b11:wavevalue=qtriangle;
//11代表三角波
endcase endmodule
4、工作模式控制模块的设计
本设计包括了开关模块和工作状态转换模块。先将开关调好状态,每按一次键程序根据所选状态进行工作。(由于DE0板上时钟为50MHz则变化较快,所以增加一个控制键,工程模式状态由此键控制。)//控制模块
module control(clk1,keyin,wavemode,length,single_state,single_frc);
input [3:0] keyin;
//四位状态信号输入
input clk1;
//按键控制状态的输入
input [1:0]single_state;
//输入的波形模式信号
input [1:0]single_frc;
//频率及步进控制信号
output reg [1:0] wavemode;
//波形模式输出信号
output reg [23:0] length;
//输出波形控制字
reg [3:0] key;
always @(posedge clk1)
begin
key=keyin;case(key)4'b0001: begin wavemode=2'b01;length=24'd3;end
4'b0010: begin case(single_state)
2'b01:wavemode=2'b01;
2'b10:wavemode=2'b10;
2'b11:wavemode=2'b11;
default: begin wavemode=2'b01;end
endcase
end
4'b0100: begin case(single_frc)
1:length=24'd3;
//10~10kHz
2:length=24'd3355;//10kHz~100kHz
3:length=24'd33554;//100kHz~2000kHz
default: begin length=24'd671088;end //大于2000kHz
endcase
end
4'b1000: begin case(single_frc)
0:length=length+24'd33554;
//步进为100kHz
1:length=length+24'd3;
//
10Hz
2:length=length+24'd336;
//
1kHz
3:length=length+24'd3355;//
10kHz
endcase
end
endcase
end
endmodule
5、DDS函数信号发生器顶层设计
顶层文件是将上述几个模块联系在一起就可以得到DDS核心实现模块。//顶层文件
module dds(clk,clk1,keyin,wavevalue,single_state,single_frc);input clk,clk1;
//系统时钟和控制按键
input [3:0] keyin;
//四位状态输入信号
input [1:0]single_frc;
//频率及步进输入模式信号
input [1:0]single_state;
//波形选择开关
output [7:0] wavevalue;
//输出波形信号
wire [9:0] address;
wire [1:0] wavemode;wire [23:0] length;control u1(clk1,keyin,wavemode,length,single_state,single_frc);//调用其他三个模块
counter u2(clk,length,address);boxing u3(clk,address,wavemode,wavevalue);endmodule
五、实验操作
操作软件QuartusII9.1及Modelsim,这两种软件的用法在此不再细谈。下载后示波器显示如下:
六、实验总结:
做完这次实验,我感觉DDS对于我们这些初学者来说一时很难接受,但是我们需要通过自己以及他人的见解来不断消化知识,一点一点去理解。最后做出来波形的时候确实很高兴,这是对我们这几天的学习的肯定,以后还要不断的去学习去理解FPGA以及VerilogHDL,坚持不懈,不管它有多难。
第三篇:电子设计大赛信号发生器心得总结(共)
电子设计大赛信号发生器心得总结
电子设计大赛结束了半个月了,也就是我们的培训过去半个多月了。回头想想还是记忆犹新。这一个多月是那么短暂,却又是那么的充实,空前的充实,比奋战高考是还要紧张。归根结底是我们学到了很多知识,特别是实际的动手能力。这是我们平时学不到的,或者说是能学
到但条件是很有限的。
我先从几方面谈谈我的收获。
(1)和老师之间:
和老师难得有这么亲近的机会,指导我们的几个老师只是平时见过,有的教过我们课,只是授课与听课的关系。而这次大赛是我们师生之间有个更深的一层含义—朋友,合作者。每个老师都是给我们掏心窝子的交流,督促我们学习,真的是想让我们学到点东西。老师一再强调要我们和他们交流,有时甚至是老师主动找我们学生交流的。最后做项目的几个晚上大部分老师是陪我们一起通宵的。实际上即便是我们充实的学了一个月,以我们的能力完成电子设计大赛的题可以说是不可能的。所以老师一再强调要和他们交流。最后完成项目还是靠老师的帮助,关键是我们必须参与进去,过程一定要有。完成项目的过程中会遇到种种问题,和老师一起解决问题的过程,是最有价值的。
(2)和同学之间
我是计算机班的,最后参赛的共有18人,其中15人是医电班的,三人是我班的。参赛的都是相对比较优秀的同学。有的以前甚至没见过。现在在一起上课,讨论问题,吃饭。象一个大家庭。有问题先和别的同学讨论,解决不了再去找老师。大家共同分享解决问题的方法经验。自己相处来的好方法和同学一起分享一下,一来别人会说我聪明,二来别人想出来好方法也会和我分享的,这样就形成了良性循环的过程。这次大赛是和理工大学的本科生一起上课的。我们是大二-大三,他们是大三-大四,水平也相对比我们高,我有问题还是经常请教他们的。还好他们都挺热心的。我和一个叫张书平的挺熟的,他很聪明,学东西上手很快,和他一起学习也刺激的我反应变快了。
(3)和组员之间
电子设计大赛我是和我班的曲世静刘友平一组的。和他们相对熟一点。现在想想感觉挺亲的。三个人合作一个项目首先要团结,其次才是分工。我们三人就是一个团队,一个整体。一个项目需要一个团队来完成。也就是人们常说的teamwork.。这是我们第一次团队合作的经历,以前只是概念层的teamwork,有了这次经历,就可以说是实践层的teamwork了。再次强调一个团队就是一个整体,首先要团结一致,再是合理分工。团结不只是心理上团结更重要的是向一个方向共同努力。合理分工真谛是同一时间每个人并行的工作。有时却不得不串行工作。既是下一步工作是在上一部工作必须完成的基础上才能开始着手的,因为完成一个项目往往有时间限制的。所以每一步都必须抓紧时间来完成,否则会耽误下一步的工作的。通宵也是常理之中的。这是其他组员在适当的情况下先休息,说不定下一个晚上你就要熬夜甚至
通宵了。
这次培训我是数电组的。我们主要学的是可编程逻辑器件FPGA(field programmable gate array)的应用。FPGA是一种集成度很高的PLD(编程逻辑器)。在一块FPGA芯片上可以实现各种数字电FPGA的功能往往不局限与数字电路上,它的强大功能主要用于设计数字电子系统,来优化算法。当然能实现常见的组合辑电路,时序逻辑电路。所有工作是在QUARTUS 软件开发平台上完成的。实现过程可以通过软件编程或者图形输入法完成软件系统,然后进
行编译,仿真正确后下载到FPGA芯片上,该芯片就能实现所要的逻辑功能。
刚接触FPGA是李丕丁博士给我们介绍VHDL(V-hard description language)硬件描述语言开始的。几乎所有的电子系统都可以用VHDL编出来。当天晚上李老师给我们留的作业是编出一个象五分频,占空比2:3的分频计数器出来。因为是刚接触一天做起来还是有难度的。自己先试着编了一下,结果没能实现,就和本科的同学交流讨论了一下,取了点经验,自己也就做出来了。第二天李老师给我们画了四个D触发器,连接起来是一个移位寄存器,让我们用VHDL来实现,一开始真的是一头雾气水,不知道如何下手。其他同学也是这样的反映。见到这种情况,老师们商量了一下,再把基础的给我们讲一下是必要的。所以我们就用VHDL从与,或,非门等基础的开始一一练习,再到编码器,译码器,选择器计数器。一直练习到这些基本的逻辑都能自己独立编出来。这样才对自己有了信心,更进一步了解了VHDL。平时练习的很多还给自己出题目做,例如完成一个并入串出的移位寄存器等等。
因为FPGA的输入输出,以及处理的全是数字量,既是逻辑高低电平0,1。所以单独一块FPGA芯片是不能完成项目的。要完成的项目都会有模拟量的,比如再示波器上看到的某个波形就是一般都是模拟量。这就用到A D,DA转换,必须也要把这个掌握起来,第一周的后三天就和单片机组的一起听莫老师讲的相关的内容。是张老师给我们讲的有关下载的知识,下载的应用让我们见识到了它的功能。下载就是把从软件编好的程序下载到FPGA芯片上,下载线
一端接到电脑的并行IO口上,另一端接到FPGA芯片上。操做软件就能实现下载。
卜老师给我们讲了quartus的图形输入法,这种方法很好用,就是在软件平台上搭建数字电路。Quartus 自带的元件库是相当丰富的,常用的,不常用的,有尽有。从元件库中调出需用的元件,然后连接,这种方法比在面板上方便多了。电路连接好后,编译调试,仿真成功
后下载到FPGA上就能实现所要的功能。
印象最深的的是DDS原理的应用。DDS是直接数字频率合成技术,通过这种技术能得到任意频率的各种波型。基本原理是频率初始字输入到一累加器,累加器做循环累加,累加器的高N位作为读取ROM的地址。ROM的M个存储单元中存放波型的采样点。读取采样值然后输出。通过改变频率初始字的改变,就能实现输出频率的改变。我们练习国05年电子设计大赛的A题-正弦信号发生器,要求产生100Hz-100MHz的正弦信号频率步进为100Hz。这道题就
是DDS的原理。
电子设计大赛我组是单单数,是六组唯一没有模电学生的。拿到题目后针对我组的情况我们选择了信号发生器这道题目,要去产生方波,正弦波,三角波,频率范围为10hz-10mhz,低频段10hz-khz,高频段1khz-10mhz,步进为1khz,波形发生系统正好我们练习过,和05年正弦信号发生器类似,但也有不同,要求产生3种波形,又要分高低频段,这些在软件上实现难度不大,用选择器高低频段,内涵在于用累加器的选择作为地址信号的选择,波形控制是把3种波形的采样点存到3个rom中,用选择信号来选择波形,难点在于控制字的输入,累加器要接收23位数据。方案1采取23根数据位,与单片机的io口连接,但单片机资源有限,所以不能采取此方案。方案2采取分高低中3位接收数据在fpga内部配置3个8位锁存器,每个锁存器的时钟信号通过单片机做为握手信号来提供,3个8为锁存器的输出再接到一个锁存器上,锁存器的24为输出就能得到需要的频率控制字。
在fpg内部握手信号为hold,波形控制信号为s2(1,0),高低频段控制信号为s1,这几个信号分别由单片机提供。在调试过程中遇到了种种困难,其中第一个为数据不能读入,最后找出来是hold信号没有起作用,又来又发现高频段波形能出来,但低频段不能出来,这个问题让人头痛,高频段都出来了,低频段不可能出不来,因为原理是一样的,这种情况最可能的原因还是频率控制字的错误,经反复检验,发现问题出在单片机额po口的分时复用上,po口除了发送数据还要进行键盘扫描,fpga把po对键盘扫描的信号也接收了过来,肯定会出错的。因为fpga反应很快,采取措施是修改汇编程序,延长po口对键盘的扫描到1妙,最后得到正确结果,下一步工作是输出的波形信号接到da上,因为输出最大频率要10mhz,考虑采用高速adv7120,数据输入为r(7…0)b(7…0),g(7…0),这块芯片主要用于视频转换,能满足高速要求,但是控制信号太多,再焊到pcb板上很容易出错,最后放弃使用adv7120,采样我们熟悉的da0832,fpga的8为波形信号作为da的输入wr信号由fpga提供,其他信号由单片机提供。Fpga每输出8为波形信号一次,wr信号就接收延时1ms的低电平,就能完成一次转换,输出一位的模拟信号pcb焊接好后,进行统调,可喜的是方波指标全能达到,三角波正弦波的频率能完全符合要求,但波形明显失真,原因出在pcb上电
路连接不理想,但当时已经没有时间在修改了,有间的话肯定能做好。
现在已经结束了,收获的结果并不重要,收获的整个过程才是有价值的,我们从这个过程锻炼了很多能力,有的极其深远的意义。这个过程使我对我的将来有了一个新的认识一个新的定位,也为我指明了方向。因为我对这方面感兴趣,我有兴趣继续研究,有斗志跻身于电子
这个行业。
最后感谢老师。首先,感谢老师给我的这次机会,我很珍惜。
再感谢各位老师的辛勤栽培,在这里祝愿每个老师有个好身体,每天都有好运气。
第四篇:EDA课程设计——基于DDS的正弦信号发生器设计(模版)
顶层文件 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DDS IS
PORT(K:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
EN:IN STD_LOGIC;
RESET:IN STD_LOGIC;
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(8 DOWNTO 0));END ENTITY DDS;ARCHITECTURE BEHAVE OF DDS IS
COMPONENT SUM99 IS
PORT(K:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
EN:IN STD_LOGIC;
RESET:IN STD_LOGIC;
CLK:IN STD_LOGIC;
OUT1:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END COMPONENT SUM99;
COMPONENT REG1 IS
PORT(D:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END COMPONENT REG1;
COMPONENT ROM IS
PORT(CLK:IN STD_LOGIC;
ADDR:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
OUTP:OUT STD_LOGIC_VECTOR(8 DOWNTO 0));
END COMPONENT ROM;
COMPONENT REG2 IS
PORT(D:IN STD_LOGIC_VECTOR(8 DOWNTO 0);
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(8 DOWNTO 0));
END COMPONENT REG2;
SIGNAL S1:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL S2:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL S3:STD_LOGIC_VECTOR(8 DOWNTO 0);
BEGIN
U0:SUM99
PORT MAP(K=>K,EN=>EN,RESET=>RESET,CLK=>CLK,OUT1=>S1);
U1:REG1 PORT MAP(D=>S1,CLK=>CLK,Q=>S1);
U2:ROM PORT MAP(ADDR=>S2,CLK=>CLK,OUTP=>S3);
U3:REG2 PORT MAP(D=>S3,CLK=>CLK,Q=>Q);END ARCHITECTURE BEHAVE;
正弦查找表 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ROM IS PORT(ADDR:IN STD_LOGIC_VECTOR(6 DOWNTO 0);CLK:IN STD_LOGIC;OUTP:OUT SIGNED(7 DOWNTO 0));END ENTITY ROM;ARCHITECTURE ART OF ROM IS BEGIN PROCESS(CLK)IS BEGIN IF(CLK'EVENT AND CLK='1')THEN CASE ADDR IS WHEN “0000000”=>OUTP<=“00000000”;WHEN “0000001”=>OUTP<=“00000010”;WHEN “0000010”=>OUTP<=“00000011”;WHEN “0000011”=>OUTP<=“00000101”;WHEN “0000100”=>OUTP<=“00000110”;
WHEN “0000101”=>OUTP<=“00001000”;WHEN “0000110”=>OUTP<=“00001001”;WHEN “0000111”=>OUTP<=“00001011”;WHEN “0001000”=>OUTP<=”00001101“;WHEN ”0001001“=>OUTP<=”00001110“;WHEN ”0001010“=>OUTP<=”00010000“;WHEN ”0001011“=>OUTP<=”00010001“;WHEN ”0001100“=>OUTP<=”00010011“;WHEN ”0001101“=>OUTP<=”00010100“;WHEN ”0001110“=>OUTP<=”00010110“;WHEN ”0001111“=>OUTP<=”00010111“;WHEN ”0010000“=>OUTP<=”00011001“;WHEN ”0010001“=>OUTP<=”00011011“;
WHEN ”0010010“=>OUTP<=”00011100“;WHEN ”0010011“=>OUTP<=”00011110“;WHEN ”0010100“=>OUTP<=”00011111“;WHEN ”0010101“=>OUTP<=”00100001“;WHEN ”0010110“=>OUTP<=”00100010“;WHEN ”0010111“=>OUTP<=”00100100“;WHEN ”0011000“=>OUTP<=”00100101“;WHEN ”0011001“=>OUTP<=”00100111“;
WHEN ”0011010“=>OUTP<=”00101001“;WHEN ”0011011“=>OUTP<=”00101010“;WHEN ”0011100“=>OUTP<=”00101100“;WHEN ”0011101“=>OUTP<=”00101101“;WHEN ”0011110“=>OUTP<=”00101111“;WHEN ”0011111“=>OUTP<=”00110000“;WHEN ”0100000“=>OUTP<=”00110010“;WHEN ”0100001“=>OUTP<=”00110011“;WHEN ”0100010“=>OUTP<=”00110101“;WHEN ”0100011“=>OUTP<=”00110110“;WHEN ”0100100“=>OUTP<=”00111000“;WHEN ”0100101“=>OUTP<=”00111001“;WHEN ”0100110“=>OUTP<=”00111011“;WHEN ”0100111“=>OUTP<=”00111100“;WHEN ”0101000“=>OUTP<=”00111110“;WHEN ”0101001“=>OUTP<=”00111111“;WHEN ”0101010“=>OUTP<=”01000001“;WHEN ”0101011“=>OUTP<=”01000011“;WHEN ”0101100“=>OUTP<=”01000100“;WHEN ”0101101“=>OUTP<=”01000110“;WHEN ”0101110“=>OUTP<=”01000111“;WHEN ”0101111“=>OUTP<=”01001001“;
WHEN ”0110000“=>OUTP<=”01001010“;WHEN ”0110001“=>OUTP<=”01001100“;WHEN ”0110010“=>OUTP<=”01001101“;WHEN ”0110011“=>OUTP<=”01001111“;WHEN ”0110100“=>OUTP<=”01010000“;WHEN ”0110101“=>OUTP<=”01010001“;WHEN ”0110110“=>OUTP<=”01010011“;WHEN ”0110111“=>OUTP<=”01010100“;WHEN ”0111000“=>OUTP<=”01010110“;WHEN ”0111001“=>OUTP<=”01010111“;WHEN ”0111010“=>OUTP<=”01011001“;WHEN ”0111011“=>OUTP<=”01011010“;WHEN ”0111100“=>OUTP<=”01011100“;WHEN ”0111101“=>OUTP<=”01011101“;WHEN ”0111110“=>OUTP<=”01011111“;WHEN ”0111111“=>OUTP<=”01100000“;WHEN ”1000000“=>OUTP<=”01100010“;WHEN ”1000001“=>OUTP<=”01100011“;WHEN ”1000010“=>OUTP<=”01100100“;WHEN ”1000011“=>OUTP<=”01100110“;WHEN ”1000100“=>OUTP<=”01100111“;WHEN ”1000101“=>OUTP<=”01101001“;
WHEN ”1000110“=>OUTP<=”01101010“;WHEN ”1000111“=>OUTP<=”01101100“;WHEN ”1001000“=>OUTP<=”01101101“;WHEN ”1001001“=>OUTP<=”01101110“;WHEN ”1001010“=>OUTP<=”01110000“;WHEN ”1001011“=>OUTP<=”01110001“;WHEN ”1001100“=>OUTP<=”01110011“;WHEN ”1001101“=>OUTP<=”01110100“;WHEN ”1001110“=>OUTP<=”01110101“;WHEN ”1001111“=>OUTP<=”01110111“;WHEN ”1010000“=>OUTP<=”01111000“;WHEN ”1010001“=>OUTP<=”01111010“;WHEN ”1010010“=>OUTP<=”01111011“;WHEN ”1010011“=>OUTP<=”01111100“;WHEN ”1010100“=>OUTP<=”01111110“;WHEN ”1010101“=>OUTP<=”01111111“;WHEN ”1010110“=>OUTP<=”10000000”;WHEN “1010111”=>OUTP<=“10000010”;WHEN “1011000”=>OUTP<=“10000011”;WHEN “1011001”=>OUTP<=“10000100”;WHEN “1011010”=>OUTP<=“10000110”;WHEN “1011011”=>OUTP<=“10000111”;
WHEN “1011100”=>OUTP<=“10001000”;WHEN “1011101”=>OUTP<=“10001010”;WHEN “1011110”=>OUTP<=“10001011”;WHEN “1011111”=>OUTP<=“10001100”;WHEN “1100000”=>OUTP<=“10001110”;WHEN “1100001”=>OUTP<=“10001111”;WHEN “1100010”=>OUTP<=“10010000”;WHEN “1100011”=>OUTP<=“10010010”;WHEN “1100100”=>OUTP<=“10010011”;WHEN “1100101”=>OUTP<=“10010100”;WHEN “00001100110”=>OUTP<=“10010101”;WHEN “1100111”=>OUTP<=“10010111”;WHEN “1101000”=>OUTP<=“10011000”;WHEN “1101001”=>OUTP<=“10011001”;WHEN “1101010”=>OUTP<=“10011010”;WHEN “1101011”=>OUTP<=“10011100”;WHEN “1101100”=>OUTP<=“10011101”;WHEN “1101101”=>OUTP<=“10011110”;WHEN “1101110”=>OUTP<=“10011111”;WHEN “1101111”=>OUTP<=“10100001”;WHEN “1110000”=>OUTP<=“10100010” WHEN “1110001”=>OUTP<=“10100011”;
WHEN “1110010”=>OUTP<=“10100100”;WHEN “1110011”=>OUTP<=“10100101”;WHEN “1110100”=>OUTP<=“10100111”;WHEN “1110101”=>OUTP<=“10101000”;WHEN “1110110”=>OUTP<=“10101001”;WHEN “1110111”=>OUTP<=“10101010”;WHEN “1111000”=>OUTP<=“10101011”;WHEN “1111001”=>OUTP<=“10101100”;WHEN “1111010”=>OUTP<=“10101110”;WHEN “1111011”=>OUTP<=“10101111”;WHEN “1111100”=>OUTP<=“10110000”;WHEN “1111101”=>OUTP<=“10110001”;WHEN “1111110”=>OUTP<=“10110010”;WHEN “1111111”=>OUTP<=“10110011”;WHEN OTHERS=>OUTP<=“ 00000000”;
END CASE;
END IF;END PROCESS;END ARCHITECTURE ART;
DAC 0832的VHDL程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY DAC0832 IS PORT(CLK:IN STD_LOGIC;
RST:IN STD_LOGIC;
ILE:OUT STD_LOGIC;
CONT:OUT STD_LOGIC;DATA_OUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ENTITY;ARCHITECTURE BEHAVE OF DAC0832 IS SIGNAL Q:INTEGER RANGE 0 TO 63;SIGNAL DATA:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN
PROCESS(CLK)
BEGIN
IF RST='1'THEN Q<=0;ELSIF CLK'EVENT AND CLK='1'THEN
IF DATA=“11111111”THEN DATA<=“00000000”;
ELSE DATA<=DATA+1;
END IF;
ELSE Q<=Q+1;
END IF;
END PROCESS;ILE<='1';CONT<='0';DATA_OUT<=DATA;END ARCHITECTURE BEHAVE;
频率控制字 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY REG0 IS
PORT(CLK:IN STD_LOGIC;
LOCK:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));END ENTITY REG0;ARCHITECTURE ART OF REG0 IS BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF LOCK='1'THEN
Q<=“0000011111”;
END IF;
END IF;
END PROCESS;END ARCHITECTURE ART;
相位寄存器 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG1 IS
PORT(D:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));END ENTITY REG1;ARCHITECTURE BEHAVE OF REG1 IS BEGIN
PROCESS(CLK)IS
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
Q<=D;
END IF;
END PROCESS;END ARCHITECTURE BEHAVE;
输出数据寄存器 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG2 IS PORT(D:IN STD_LOGIC_VECTOR(8 DOWNTO 0);
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(8 DOWNTO 0));END ENTITY REG2;ARCHITECTURE BEHAVE OF REG2 IS BEGIN
PROCESS(CLK)IS
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
Q<=D;
END IF;
END PROCESS;END ARCHITECTURE BEHAVE;
相位累加器 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SUM99 IS
PORT(K:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
CLK:IN STD_LOGIC;
EN:IN STD_LOGIC;
RESET:IN STD_LOGIC:
OUT1:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));END ENTITY SUM99;ARCHITECTURE BEHAVE OF SUM99 IS
SIGNAL TEMP:STD_LOGIC_VECTOR(9 DOWNTO 0);BEGIN
PROCESS(CLK,EN,RESET)IS
BEGIN
IF RESET='1'THEN
TEMP<=“0000000000”;
ELSE
IF CLK'EVENT AND CLK='1'THEN
IF EN='1'THEN
TEMP<=TEMP+K;
END IF;
END IF;
END IF;
OUT1<=TEMP;
END PROCESS;END ARCHITECTURE BEHAVE;
图1.顶层电路原理图
图2.dds波形仿真图
图3.rom波形仿真图
图4.相位寄存器reg1仿真波形图
图5.寄存器reg2的波形仿真
图6.相位累加器仿真波形图
图7.优化过程及对比波形(A——H)
图A
图B
图C
图D
图E 23
图F
图G
图H
第五篇:函数信号发生器设计
函数信号发生器设计设计任务与要求
⑴ 设计并制作能产生正弦波、矩形波(方波)和三角波(锯齿波)的函数发生器,本信号发生器可以考虑用专用集成芯片(如5G8038等)为核心实现。⑵ 信号频率范围: 1Hz∽100kHz;
⑶ 频率控制方式:
① 手控通过改变RC参数实现;
② 键控通过改变控制电压实现;
③ 为能方便地实现频率调节,建议将频率分档;
⑷ 输出波形要求
① 方波上升沿和下降沿时间不得超过200nS,占空比在48%∽50%之间;② 非线性误差≤2%;
③ 正弦波谐波失真度≤2%;
⑸ 输出信号幅度范围:0∽20V;
⑹ 信号源输出阻抗:≤1Ω;
⑺ 应具有输出过载保护功能;
⑻ 具有数字显示输出信号频率和电压幅值功能。