eda多功能信号发生器课程设计
1. 锯齿波、递增斜波信号发生器eda课程设计
基本要求:能用按键选择输出以下波形:正弦波,三角波,锯齿波,方波. 提高要求:嘿嘿,我的毕业设计就是这个,用FPGA做的信号发生器,用MAXPLUS2做的仿真,
2. 多功能信号发生器设计原理
该 信号发生器 的硬件结构如图1 所示。硬件结构以 AT89C52 单片机为主控制器, 包括DA 转换模块、输出放大模块、数据存储模块、液晶显示模块、 时钟模块、电源监控模块及键盘等。系统工作原理: 在开机时, 主控制器 AT89C52 单片机定时中断产生脉冲信号, 其信号大小采用默认值, 该值输出给DA 转换模块后变为电流信号, 然后通过输出放大模块输出用户需要的电压方波信号, 同时, 液晶显示模块动态显示方波信号的各种参数和时间信息。 用户通过键盘可在线修改系统运行参数, 同时可保存当前设定值或查看历史运行数据。 为了提高系统的集成度和减小系统体积, 采用 CPLD 可编程逻辑器 件完成了系统外围电路的组合逻辑设计。从图1 可以看出, CPLD 是整个仪器的关键, 他接受从单片机发来的控制指令, 产生各个芯片的控制时序和地址信号。本设计中采用LATT ICE 公司的44 脚ispLSI1016VE 器件, 他采用PLCC 封装, 内有1000 个PLDGates, 擦写次数超过10 000 次, 是一种不需要特殊编程装置、使用极为方便的逻辑器件。 通过VHDL 语言编程实现了地址锁存器、译码器及其他组合逻辑。由于 信号发生 器需要时间信息, 选用了高性能的DS1302 时钟芯片向系统提供时间信息。考虑该 信号发生器 在不同时间各种设定参数长时间保存的要求, 选用富士通公司的FLASH 存储器MBM29F016 用于保存历史数据。容量为16 M b (2 M ×8 b) 的CMOS 器件 MBM29F016 在线可擦写次数超过100 000 次, 其48 脚的 TSOP 封装有助于减小系统体积和提高抗干扰性。此外, 由于在系统中单片机采用5 V 供电而DA 转换器采用15 V 供电, 所以采用了高性能的电源转换芯片MAX1776 作电平转换; 采用DS1233 作电源监控以保证系统工作的可靠性。系统在初始化后, 单片机将用户所需要生成波形的数据送出, 模数转换芯片DAC0832 将单片机输出数据转换为电流信号再通过运算放大器转化为电压信号 , 同时各种数据信息被送给液晶显示器进行显示。 通过按键操作菜单按特定的步长对参数进行加减。另外还设计了 信号 发生器 与PC 机的串行通讯接口RS 232 接口, 以便日后对信号发生器的历史数据进行分析和处理。
3. 基于单片机的多功能信号发生器设计
波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。本次课程设计使用的AT89S51 单片机构成的发生器可产生锯齿波、三角波、正弦波等多种波形,波形的周期可以用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑等优点。在本设计的基础上,加上按钮控制和LED显示器,则可通过按钮设定所需要的波形频率,并在LED上显示频率、幅值电压,波形可用示波器显示。
二、系统设计
波形发生器原理方框图如下所示。波形的产生是通过AT89S51 执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。在AT89S51的P2口接5个按扭,通过软件编程来选择各种波形、幅值电压和频率,另有3个P2口管脚接TEC6122芯片,以驱动数码管显示电压幅值和频率,每种波形对应一个按钮。此方案的有点是电路原理比较简单,实现起来比较容易。缺点是,采样频率由单片机内部产生故使整个系统的频率降低。
1、波形发生器技术指标
1)波形:方波、正弦波、锯齿波;
2)幅值电压:1V、2V、3V、4V、5V;
3)频率:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;
2、操作设计
1)上电后,系统初始化,数码显示6个‘-’,等待输入设置命令。
2)按钮分别控制“幅值”、“频率”、、“正弦波”。
3)“幅值“键初始值是1V,随后再次按下依次增长1V,到达5V后在按就回到1V。
4)“频率“键初始值是10HZ,随后在按下依次为20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循环。
三、硬件设计
本系统由单片机、显示接口电路,波形转换(D/A)电路和电源等四部分构成。电路图2附在后
1、单片机电路
功能:形成扫描码,键值识别、键处理、参数设置;形成显示段码;产生定时中断;形成波形的数字编码,并输出到D/A接口电路和显示驱动电路。
AT89S51外接12M晶振作为时钟频率。并采用电源复位设计。复位电路采用上电复位,它的工作原理是,通电时,电容两端相当于短路,于是RST引脚上为高电平,然后电源通过对电容充电。RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始工作。
AT89S51的P2口作为功能按钮和TEC6122的接口。P1口做为D/A转换芯片0832的接口。用定时/计数器作为中断源。不同的频率值对应不同的定时初值,允许定时器溢出中断。定时器中断的特殊功能寄存器设置如下:
定时控制寄存器TCON=20H;
工作方式选择寄存器TMOD=01H;
中断允许控制寄存器IE=82H。
2、显示电路
功能:驱动6位数码管显示,扫描按钮。
由集成驱动芯片TEC6122、6位共阴极数码管和5个按钮组成。当某一按钮按下时,扫描程序扫描到之后,通过P2口将数字信号发送到 TEC6122芯片。TEC6122是一款数字集成芯片。它的外接电压也是+5V,并且由于数码管的载压较小,为了保护数码管,必须在两者间接电阻,大约是560欧。
扫描利用软件程序实现,当某一按键按下时,扫描程序立即检测到,随后调用子程序,执行相应的功能。
3、D/A电路
功能:将波形样值的编码转换成模拟值,完成双极性的波形输出。
由一片0832和两块LM358运放组成。DAC0832是一个具有两个输入数据寄存器的8位DAC。目前生产的DAC芯片分为两类,一类芯片内部设置有数据寄存器,不需要外加电路就可以直接与微型计算机接口。另一类芯片内部没有数据寄存器,输出信号随数据输入线的状态变化而变化,因此不能直接与微型计算机接口,必须通过并行接口与微型计算机接口。DAC0832是具有20条引线的双列直插式CMOS器件,它内部具有两级数据寄存器,完成8位电流D/A转换,故不需要外加电路。0832是电流输出型,示波器上显示波形,通常需要电压信号,电流信号到电压信号的转换可以由运算放大器LM358实现,用两片LM358可以实现双极性输出。
单片机向0832发送数字编码,产生不同的输出。先利用采样定理对各波形进行抽样,然后把各采样值进行编码,的到的数字量存入各个波形表,执行程序时通过查表方法依次取出,经过D/A转换后输出就可以得到波形。假如N个点构成波形的一个周期,则0832输出N个样值点后,样值点形成运动轨迹,即一个周期。重复输出N个点,成为第二个周期。利用单片机的晶振控制输出周期的速度,也就是控制了输出的波形的频率。这样就控制了输出的波形及其幅值和频率。
四、 软件设计
主程序和子程序都存放在AT89S51单片机中。
主程序的功能是:开机以后负责查键,即做键盘扫描及显示工作,然后根据用户所按的键转到相应的子程序进行处理,主程序框图如图1所示。
子程序的功能有:幅值输入处理、频率输入处理、正弦波输出、锯齿波输出、方波输出、显示等。
下面是程序
include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCP=P2^2;
sbit SCP=P2^1;
sbit SI=P2^0;
sbit S1=P2^3;
sbit S2=P2^4;
sbit S3=P2^5;
sbit S4=P2^6;
sbit S5=P2^7;
sbit DA0832=P3^3;
sbit DA0832_ON=P3^2;
uchar fun=0,b=0,c=0,d=0,tl,th;
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code tosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5
,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5
,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd
,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda
,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99
,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51
,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16
,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15
,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e
,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };
void display(unsigned char command)
{
unsigned char i;
LCP=0;
for(i=8;i>0;i--)
{
SCP=0;
if((command & 0x80)==0)
{
SI=0; }
else
{
SI=1;
}
command<<=1;
SCP=1;
}
LCP=1;
}
void key1(void)
{
fun++;
if(fun==4)
fun=0x00;
}
void key2(void)
{
tl++;
if(tl==0x1f)
th++;
}
void key3(void)
{
tl--;
if(tl==0x00)
th--;
}
void key4(void)
{
double t;
int f;
TR0=0;
t=(65535-th*256-tl)*0.4;
f=(int)(1000/t);
S3=tab[f%10];
f=f/10;
S2=tab[f%10];
f=f/10;
if(f==0)
S1=0;
else
S1=tab[f];
TR0=1;
}
void key5(void)
{
tl--;
if(tl==0x00)
th++;
}
void judge(void)
{
uchar line,row,de1,de2,keym;
P1=0x0f;
keym=P1;
if(keym==0x0f)return;
for(de1=0;de1<200;de1++)
for(de2=0;de2<125;de2++){;}
P1=0x0f;
keym=P1;
if(keym==0x0f)return;
P1=0x0f;
line=P1;
P1=0xf0;
row=P1;
line=line+row; /*存放特征键值*/
if(line==0xde)key1();
if(line==0x7e)key2();
if(line==0xbd)key3();
if(line==0x7d)key4();
}
void time0_int(void) interrupt 1 //中断服务程序
{
TR0=0;
if(fun==1)
{
DA0832=tosin[b]; //正弦波
b++;
}
else if(fun==2) //锯齿波
{
if(c<128)
DA0832=c;
else
DA0832=255-c;
c++;
}
else if(fun==3) // 方波
{
d++;
if(d<=128)
DA0832=0x00;
else
DA0832=0xff;
}
TH0=th;
TL0=tl;
TR0=1;
}
void main(void)
{
TMOD=0X01;
TR0=1;
th=0xff;
tl=0xd0;
TH0=th;
TL0=tl;
ET0=1;
EA=1;
while(1)
{
display();
judge();
}
}
五、心得体会
开始的时候由于没有经验,不知如何下手,所以就去图书管找了一些书看,尽管有许多的设计方案,可是总感觉自己还是有许多的东西弄不太清楚,于是就请教同学。他常做一些设计,有一些经验。经过他的解释分析各方案之后,决定用查表的方法来做。这样可以降低一些硬件设计的难度,初次设计应切合自己的水平。用8031需要扩展ROM,这样还要进行存储器扩展。而且现在8031实际中已经基本上不再使用,实际用的AT89S51芯片有ROM,这样把经过采样得到的数值制成表,利用查表来做就简单了。我认为程序应该不大,片内ROM应该够用的。用LED显示频率和幅值,现有集成的接口驱动芯片,波形可通过示波器进行显示,单片机接上D/A转换芯片即可,这样硬件很快就搭好了。
我以为这些做好了,构思也有了,写程序应该是相对容易的。谁知道,写起程序来,才想到功能键要有扫描程序才行呀,我真的感到很难。那时真的有点想放弃?于是就去请教了老师,老师帮忙分析了一下,自己又查阅了一些资料,终于明白了扫描程序怎么写。
于是在自己的努力下,程序很快就写好了。这次是我的第一个设计器件,尽管经历了不少的艰辛,但给我积累了一点设计的经验,最后也有点小小的成就感。后面的路还很长,我还的努力!
4. EDA课程设计VHDL信号发生器设计 要求: (1) 产生方波、三角波、锯齿波、正弦波 (2)频率为10KHz
要求DDS方式实现么。。。你要看你的时钟频率。。。然后计算你需要的频率控制字。。。
5. EDA课程设计:用vhdl语言设计一个正弦扫频信号发生器,要求正弦波输出,波形点数128点,幅度范围8位。
正弦扫频信号发生器,没问题的。我会。。。。
6. EDA的调频信号发生器的程序及课程设计报告,要求如下:
Ⅱ中完成一个正弦信号发生器的设计。系统可由五部分组成,如下图所示:嵌入设计要求:FPGA内部底层其实网上书上都有现成的,问网不如自己找的快,
7. 求基于EDA的函数信号发生器的课程设计
本设计采用FPGA和锁相环4046实现波形发生器。系统由波形产生模块和可调频率的时钟产生模块,数模转换模块和显示模块四部分组成。波形产生模块完成三种波形的产生,并根据控制信号完成选定波形的输出。可调频率的时钟产生模块能够产生具有不同频率的方波clk,用此方波作为时钟完成输出波形频率的调整。显示模块用于显示输出波形的频率。数模转换模块将波形产生模块输出的数字信号转换为模拟信号;并完成滤波以及放大等功能。此设计的特点在于结合了直接数字频率合成技术和锁相技术各自的优点,同时利用了FPGA的强大处理能力使系统易于实现,结构简单。本设计能产生正弦波,三角波,占空比可调的方波以及它们的线性组合;频率在100Hz~20KHz之间能以100Hz为步进进行调整;幅度可调范围为0~5V。
关键词:正弦波;三角波;占空比可调的方波;频率可调;FPGA;锁相环4046
目 录
引言………………………………………………………………………………………1
1 设计任务……………………………………………………………………………1
1.1 基本要求……………………………………………………………………………1
1.2 发挥部分……………………………………………………………………………1
2 方案论证与比较……………………………………………………………………1
2.1 常见信号源制作方法原理…………………………………………………………1
2.2 常见信号产生电路…………………………………………………………………3
3 系统电路的设计………………………………………………………………4
3.1 系统框图及说明……………………………………………………………………4
3.2 主要电路设计说明…………………………………………………………………6
3.2.1晶体振荡电路………………………………………………………………………6
3.2.2倍频电路……………………………………………………………………………6
3.2.3数模转换和放大滤波电路…………………………………………………………7
3.2.4数码管显示电路……………………………………………………………………8
3.2.5 输入去抖电路……………………………………………………………………9
3.3 主要软件设计说明…………………………………………………………………10
3.3.1前端核心软件设计………………………………………………………………10
3.3.2波形产生模块软件设计…………………………………………………………12
3.4 主要元器件介绍……………………………………………………………………15
3.4.1FPGA介绍…………………………………………………………………………15
3.4.2锁相环4046介绍…………………………………………………………………16
3.4.3VHDL介绍…………………………………………………………………………19
3.4.4MAX+PLUSII介绍…………………………………………………………………20
4软件仿真与硬件调试与测试 ……………………………………………………20 4.1 软件部分仿真……………………………………………………………………20
4.2 硬件调试……………………………………………………………………………22
4.3 硬件电路测试………………………………………………………………………22
4.4 误差分析……………………………………………………………………………23
5 工程设计……………………………………………………………………………23
6 制作…………………………………………………………………………………24
7 结论…………………………………………………………………………………25
谢辞………………………………………………………………………………………26
参考文献…………………………………………………………………………………27
附录………………………………………………………………………………………28
8. EDA课程设计 信号发生器
嘿嘿,我的毕业设计就是这个,用FPGA做的信号发生器,用MAXPLUS2做的仿真,用VHDL编程,比你要求的波形多两个,这你可以减掉。你邮箱里已经发目录,加分到了发整个word文档。
9. 急求eda课程设计一份:脉冲信号发生器的设计
给个时钟信号发生器参考一下吧
一个电子系统中需要三种时钟,分别是:1000HZ、100Hz、50Hz,系统输入时钟为100KHz。试用VHDL描述该时钟发生器。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is
generic(count_value:integer:=9);
port(clk:in std_logic;
co:out std_logic);
end counter;
architecture a of counter is
signal cnt:integer range 0 to count_value;
begin
process(clk)
begin
if(clk'event and clk='1')then
if(cnt=count_value)then
cnt<=0;
co<='1';
else
cnt<=cnt+1;
co<='0';
end if;
end if;
end process;
end a;
(2)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity div3 is
port (clk:in std_logic;
fout:out std_logic_vector(2 downto 0));
end div3;
architecture a of div3 is
signal co_clk:std_logic_vector(3 downto 0);
component counter is
generic(count_value:integer:=9);
port(clk:in std_logic;
co:out std_logic);
end component;
begin
cnt0:counter
generic map(count_value=>9)
port map(clk=>clk, co=>co_clk(3));
cnt1:counter
generic map(count_value=>9)
port map(clk=>co_clk(3), co=>co_clk(2));
cnt2:counter
generic map(count_value=>9)
port map(clk=>co_clk(2), co=>co_clk(1));
cnt3:counter
generic map(count_value=>1)
port map(clk=>co_clk(1), co=>co_clk(0));
fout(2)<=co_clk(2);
fout(1)<=co_clk(1);
fout(0)<=co_clk(0);
end a;