电子设计大赛:DDS 信号发生器

第一篇:电子设计大赛: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 #include void main(){ int s;int i;FILE* fp;fp=fopen(“1024.mif”,“w ”);fprintf(fp,“--MAX plusII-generated Memory Initialization Filen”);fprintf(fp,“--By 00022809nnnnn”);fprintf(fp,“WIDTH=8;nn”);fprintf(fp,“DEPTH=1024;nn”);fprintf(fp,“ADDRESS_RADIX=HEX;nn”);fprintf(fp,“DATA_RADIX=HEX;nn”);fprintf(fp,“CONTENT BEGINn”);for(i=0;i<1024;i ){

       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

第五篇:信号发生器设计(推荐)

       模拟课程设计题

       信号发生器设计

       设计一个能够输出正弦波、三角波和矩形波的信号源电路,电路形式自行选择。输出信号的频率可通过开关进行设定,具体要求如下:

       (1)输出信号的频率范围为100~800Hz,步进为100Hz。(60分)

       (2)要求输出信号无明显失真,特别是正弦波信号。(30分)

       评分标准:

       (1)范围满足设计要求得满分,否则酌情扣分。

       (2)输出信号无明显失真可满分,有明显失真酌情扣分。

       发挥部分(附加10分):

       进一步扩大输出信号范围和减小步进频率。