任意波形产生电路设计.docx
《任意波形产生电路设计.docx》由会员分享,可在线阅读,更多相关《任意波形产生电路设计.docx(25页珍藏版)》请在冰豆网上搜索。
任意波形产生电路设计
第一章绪论
1.1EDA技术的概述
EDA是电子设计自动化(ElectronicDesignAutomation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。
EDA技术是以计算机为工具,根据硬件描述语言HDL(HardwareDescriptionlanguage)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。
1.1.1EDA的软件介绍
EDA工具层出不穷,目前进入我国并具有广泛影响的EDA软件有:
multiSIM7(原EWB的最新版本)、PSPICE、OrCAD、PCAD、Protel、Viewlogic、Mentor、Graphics、Synopsys、LSIIogic、Cadence、MicroSim等等。
这些工具都有较强的功能,一般可用于几个方面,例如很多软件都可以进行电路设计与仿真,同进还可以进行PCB自动布局布线,可输出多种网表文件与第三方软件接口。
1.1.2EDA技术的基本特征
EDA代表了当今电子设计技术的最新发展方向。
它的基本特征是:
设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分。
系统的关键电路用一片或几片专用集成电(ASICApplicationSpecificIntegratedCircnit)实现,然后采用硬件描述语言(HDlHardwareDescriptionLanguage)完成系统行为级设计,最后通过综合器和适配器生成最终的目标器件,这样的设计方法被称为高层次的电子设计方法。
1.1.3EDA的应用
EDA在教学、科研、产品设计与制造等各方面都发挥着巨大的作用。
在教学方面,几乎所有理工科(特别是电子信息)类的高校都开设了EDA课程。
主要是让学生了解EDA的基本概念和基本原理、掌握用HDL语言编写规范、掌握逻辑综合的理论和算法、使用EDA工具进行电子电路课程的实验验证并从事简单系统的设计。
一般学习电路仿真工具(如multiSIM、PSPICE)和PLD开发工具(如Altera/Xilinx的器件结构及开发系统),为今后工作打下基础。
从应用领域来看,EDA技术已经渗透到各行各业,如上文所说,包括在机械、电子、通信、航空航航天、化工、矿产、生物、医学、军事等各个领域,都有EDA应用。
另外,EDA软件的功能日益强大,原来功能比较单一的软件,现在增加了很多新用途。
如AutoCAD软件可用于机械及建筑设计,也扩展到建筑装璜及各类效果图、汽车和飞机的模型、电影特技等领域。
1.2EDA技术的基本设计方法
EDA技术的每一次进步、都引起了设计层次上的一个飞跃,可以用图1说明。
物理级设计主要指IC版图设计,一般由半导体厂家完成,对电手工程师并没有太大的意义,因此本文重点介绍电路级设计和系统级设计。
1.2.1数字系统的设计模型
数字系统指的是交互式的、以离散形式表示的具有存储、传输、信息处理能力的逻辑子系统的集合。
用于描述数字系统的模型有多种,各种模型描述数字系统的侧重点不同。
下面介绍一种普遍采用的模型。
这种模型根据数字系统的定义,将整个系统划分为两个模块或两个子系统:
数据处理子系统和控制子系统,如图2所示
数据处理子系统主要完成数据的采集、存储、运算和传输。
数据处理子系统主要由存储器、运算器、数据选择器等功能电路组成。
数据处理子系统与外界进
图2
行数据交换,在控制子系统(或称控制器)发出的控制信号作用下,数据处理子系统将进行数据的存储和运算等操作。
数据处理子系统将接收由控制器发出的控制信号,同时将自己的操作进程或操作结果作为条件信号传送给控制器。
应当根据数字系统实现的功能或算法设计数据处理子系统。
控制子系统是执行数字系统算法的核心,具有记忆功能,因此控制子系统是时序系统。
控制子系统由组合逻辑电路和触发器组成,与数据处理子系统共用时钟。
控制子系统的输入信号是外部控制信号和由数据处理子系统送来的条件信号,按照数字系统设计方案要求的算法流程,在时钟信号的控制下进行状态的转换,同时产生与状态和条件信号相对应的输出信号,该输出信号将控制数据处理子系统的具体操作。
应当根据数字系统功能及数据处理子系统的需求设计控制子系统。
把数字系统划分成数据处理子系统和控制子系统进行设计,这只是一种手段,不是目的。
它用来帮助设计者有层次地理解和处理问题,进而获得清晰、完整正确的电路图。
因此,数字系统的划分应当遵循自然、易于理解的原则。
1.2.2数字系统的设计步骤
1.系统任务分析
数字系统设计中的第一步是明确系统的任务。
在设计任务书中,可用各种方式提出对整个数字系统的逻辑要求,常用的方式有自然语言、逻辑流程图、时序图或几种方法的结合。
当系统较大或逻辑关系较复杂时,系统任务(逻辑要求)逻辑的表述和理解都不是一件容易的工作。
所以,分析系统的任务必须细致、全面,不能有理解上的偏差和疏漏。
2.确定逻辑算法
实现系统逻辑运算的方法称为逻辑算法,也简称为算法。
一个数字系统的逻辑运算往往有多种算法,设计者的任务不但是要找出各种算法,还必须比较优劣,取长补短,从中确定最合理的一种。
数字系统的算法是逻辑设计的基础,算法不同,则系统的结构也不同,算法的合理与否直接影响系统结构的合理性。
确定算法是数字系统设计中最具创造性的一环,也是最难的一步。
3.建立系统及子系统模型
当算法明确后,应根据算法构造系统的硬件框架(也称为系统框图),将系统划分为若干个部分,各部分分别承担算法中不同的逻辑操作功能。
如果某一部分的规模仍嫌大,则需进一步划分。
划分后的各个部分应逻辑功能清楚,规模大小合适,便于进行电路级的设计
4.系统(或模块)逻辑描述
当系统中各个子系统(指最低层子系统)和模块的逻辑功能和结构确定后,则需采用比较规范的形式来描述系统的逻辑功能。
设计方案的描述方法可以有多种,常用的有方框图、流程图和描述语言等。
对系统的逻辑描述可先采用较粗略的逻辑流程图,再将逻辑流程图逐步细化为详细逻辑流程图,最后将详细逻辑流程图表示成与硬件有对应关系的形式,为下一步的电路级设计提供依据。
5.逻辑电路级设计及系统仿真
电路级设计是指选择合理的器件和连接关系以实现系统逻辑要求。
电路级设计的结果常采用两种方式来表达:
电路图方式和硬件描述语言方式。
EDA软件允许以这两种方式输入,以便作后续的处理。
当电路设计完成后必须验证设计是否正确。
在早期,只能通过搭试硬件电路才能得到设计的结果。
目前,数字电路设计的EDA软件都具有仿真功能,先通过系统仿真,当系统仿真结果正确后再进行实际电路的测试。
由EDA软件的验证结果十分接近实际结果,因此,可极大地提高电路设计的效率。
6.系统的物理实现
物理实现是指用实际的器件实现数字系统的设计,用仪表测量设计的电路是否符合设计要求。
现在的数字系统往往采用大规模和超大规模集成电路,由于器件集成度高、导线密集,故一般在电路设计完成后即设计印刷电路板,在印刷电路板上组装电路进行测试。
需要注意的是,印刷电路板本身的物理特性也会影响电路的逻辑关系。
第二章设计要求
2.1课程设计要求
电路要求可以产生正弦波、方波、三角波、特殊波任意波形发生器,波形的频率可调,通过k1、k2、k3、k4共四个开关控制产生的波形,并通过控制按键控制设计信号的频率,改变频率的方法可以采用分频和DDS的原理进行控制信号频率。
并进行D/A转换电路与滤波电路的设计,通过采用施密特触发器对波形进行整形,设计一频率测量电路对所产生的频率进行测量,通过数码管显示出来,并在数码管上显示当前的波形代码。
2.2原理图
如图3
图3
第三章系统的设计
3.1设计思路
采用由底向上的设计方法,根据系统对硬件的要求,画出系统控制流程图,仔细分析系统要求到达各个功能,将系统的功能进行细化,合理的划分功能模块,并画出系统的功能框图;进行各功能模块计数,运用VHDL语言设计出各个功能模块;在软件环境下导出各个功能框图,再将各个模块按系统要求到达功能连起来,做出系统的原理图;编译、调试完成后,在下载到硬件结构,进行硬件调试。
3.2设计步骤
1、在具体设计之前,详细分析设计要求、确定系统输入/输出信号是必要的,只有在明确设计,要求的基础上,才能使系统设计有序地进行。
2.确定整体设计方案
对于一个具体的设计可能有多种不同的方案,确定方案时,应对不同方案的性能、成本、可靠性等方面进行综合考虑,最终确定设计方案。
3.自顶向下(top-down)的模块化设计方法数字系统的设计通常有两种设计方法,一种是自底向上的设计方法,一种是自顶向下的设计方法。
自底向上(Bottom-up)的设计过程从最底层设计开始。
设计系统硬件时,首先选择具体的元器件,用这些元器件通过逻辑电路设计,完成系统中各独立功能模块的设计,再把这些功能模块连接起来,总装成完整的硬件系统。
3.3设计程序
3.3.1正弦波
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entitysinis
port(clk4:
instd_logic;
k:
instd_logic_vector(3downto0);
dd4:
outintegerrange255downto0);
endsin;
architecturedaccofsinis
signalq:
integerrange63downto0;
begin
process(clk4)
begin
if(clk4'eventandclk4='1')then
q<=q+k;
endif;
endprocess;
process(q)
begin
caseqis
when00=>dd4<=255;
when01=>dd4<=254;
when02=>dd4<=253;
when03=>dd4<=250;
when04=>dd4<=245;
when05=>dd4<=240;
when06=>dd4<=234;
when07=>dd4<=226;
when08=>dd4<=218;
when09=>dd4<=208;
when10=>dd4<=198;
when11=>dd4<=188;
when12=>dd4<=176;
when13=>dd4<=165;
when14=>dd4<=152;
when15=>dd4<=140;
when16=>dd4<=128;
when17=>dd4<=115;
when18=>dd4<=103;
when19=>dd4<=90;
when20=>dd4<=79;
when21=>dd4<=67;
when22=>dd4<=57;
when23=>dd4<=47;
when24=>dd4<=37;
when25=>dd4<=29;
when26=>dd4<=21;
when27=>dd4<=15;
when28=>dd4<=10;
when29=>dd4<=5;
when30=>dd4<=2;
when31=>dd4<=1;
when32=>dd4<=0;
when33=>dd4<=1;
when34=>dd4<=2;
when35=>dd4<=5;
when36=>dd4<=10;
when37=>dd4<=15;
when38=>dd4<=21;
when39=>dd4<=29;
when40=>dd4<=37;
when41=>dd4<=47;
when42=>dd4<=57;
when43=>dd4<=67;
when44=>dd4<=79;
when45=>dd4<=90;
when46=>dd4<=103;
when47=>dd4<=115;
when48=>dd4<=128;
when49=>dd4<=140;
when50=>dd4<=165;
when51=>dd4<=176;
when52=>dd4<=188;
when53=>dd4<=198;
when54=>dd4<=208;
when55=>dd4<=218;
when56=>dd4<=226;
when57=>dd4<=234;
when58=>dd4<=240;
when59=>dd4<=245;
when60=>dd4<=250;
when61=>dd4<=253;
when62=>dd4<=254;
when63=>dd4<=255;
whenothers=>null;
endcase;
endprocess;
enddacc;
3.3.2三角波
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entitytriais
port(clk3:
instd_logic;
k:
instd_logic_vector(3downto0);
dd3:
outstd_logic_vector(7downto0));
endtriangular;
architecturedaccoftriangularis
signalb:
std_logic;
signalc:
std_logic_vector(7downto0);
begin
process(clk3)
begin
if(clk3'eventandclk3='1')then
if(b='0')then
c<=c+1;
if(c=250)then
b<='1';
endif;
elsif(b='1')then
c<=c-1;
if(c=1)then
b<='0';
endif;
endif;
dd3<=c;
endif;
endprocess;
enddacc;
3.3.3方波
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entitysquareis
port(clk1:
instd_logic;
k:
instd_logic_vector(3downto0);
dd1:
bufferintegerrange255downto0);
endsquare;
architecturedaccofsquareis
signalq:
integerrange1downto0;
begin
process(clk1)
begin
if(clk1'eventandclk1='1')then
q<=q+k;
endif;
endprocess;
process(q)
begin
caseqis
when0=>dd1<=255;
when1=>dd1<=0;
whenothers=>null;
endcase;
endprocess;
enddacc;
3.3.4特殊波形
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitysintrais
port(clk2:
instd_logic;
k:
instd_logic_vector(3downto0);
dd2:
outintegerrange255downto0);
endsintra;
architecturedaccofsintrais
signalq:
integerrange63downto0;
begin
process(clk2)
begin
if(clk2'eventandclk2='1')then
q<=q+k;
endif;
endprocess;
process(q)
begin
caseqis
when00=>dd2<=255;
when01=>dd2<=254;
when02=>dd2<=253;
when03=>dd2<=250;
when04=>dd2<=245;
when05=>dd2<=240;
when06=>dd2<=234;
when07=>dd2<=226;
when08=>dd2<=218;
when09=>dd2<=208;
when10=>dd2<=198;
when11=>dd2<=188;
when12=>dd2<=176;
when13=>dd2<=165;
when14=>dd2<=152;
when15=>dd2<=140;
when16=>dd2<=128;
when17=>dd2<=115;
when18=>dd2<=103;
when19=>dd2<=90;
when20=>dd2<=79;
when21=>dd2<=67;
when22=>dd2<=57;
when23=>dd2<=47;
when24=>dd2<=37;
when25=>dd2<=29;
when26=>dd2<=21;
when27=>dd2<=15;
when28=>dd2<=10;
when29=>dd2<=5;
when30=>dd2<=2;
when31=>dd2<=1;
when32=>dd2<=0;
when33=>dd2<=8;
when34=>dd2<=16;
when35=>dd2<=24;
when36=>dd2<=32;
when37=>dd2<=40;
when38=>dd2<=48;
when39=>dd2<=56;
when40=>dd2<=64;
when41=>dd2<=72;
when42=>dd2<=80;
when43=>dd2<=88;
when44=>dd2<=96;
when45=>dd2<=104;
when46=>dd2<=112;
when47=>dd2<=120;
when48=>dd2<=128;
when49=>dd2<=136;
when50=>dd2<=144;
when51=>dd2<=152;
when52=>dd2<=160;
when53=>dd2<=168;
when54=>dd2<=176;
when55=>dd2<=184;
when56=>dd2<=192;
when57=>dd2<=200;
when58=>dd2<=208;
when59=>dd2<=216;
when60=>dd2<=224;
when61=>dd2<=232;
when62=>dd2<=240;
when63=>dd2<=247;
whenothers=>null;
endcase;
endprocess;
enddacc;
when55=>dd2<=184;
when56=>dd2<=192;
when57=>dd2<=200;
when58=>dd2<=208;
when59=>dd2<=216;
when60=>dd2<=224;
when61=>dd2<=232;
when62=>dd2<=240;
when63=>dd2<=247;
whenothers=>null;
endcase;
endprocess;
enddacc;
3.3.5分频
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entityfpIS
port(clk:
instd_logic;
k:
inintegerrange7downto0;
clko:
bufferstd_logic);
endfp;
architectureaoffpis
signaltemp:
std_logic_vector(3downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
iftemptemp<=temp+1;
else
temp<="0000";
clko<=notclko;
endif;endif;endprocess;
enda;
3.3.6时钟输入
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityWaveSelectis
port(clk1,clk2,clk3,clk4:
instd_logic_vector(7downto0);
sel:
instd_logic_vector(1downto0);
outwave:
outstd_logic_vector(7downto0));
endWaveSelect;
architectureartofWaveSelectis
begin
withselselect
outwave<=clk1when"00",
clk2when"01",
clk3when"10",
clk4when"11",
nullwhenothers;
endart;
3.3.7输出波形选择器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityWaveSelectis
port(clk1,clk2,clk3,clk4:
instd_logic_vector(7downto0);
sel:
instd_logic_vector(1downto0);
outwave: