基于VHDL语言的波形发生器的设计

合集下载

VHDL语言设计信号发生器实验报告

VHDL语言设计信号发生器实验报告

实验四用VHDL设计多功能信号发生器一、设计任务基于《VHDL语言》,通过给定的仪器(EDA6000试验箱)设计一个多功能信号发生器,要求:(1)能产生周期性正弦波、方波、三角波、锯齿波以及用户自己编辑的特定波形(选作);(2)输出信号的频率范围为100Hz~200KHz,且输出频率可以调节;(3)具有显示输出波形、频率的功能。

(选作)二、系统顶层框图弦波的数字幅度信息,每个查找表的地址对应正(余)弦波幅度信号,同时输出到数模转换器(DAC)输入端,DAC输出的模拟信号经过低通滤波器(LPF),可以得到一个频谱纯净的正(余)弦波。

二、设计步骤用VHDL语言结合原理图设计实现一个函数信号发生器,输出正弦波、方波和三角波三种波形。

将频率控制、分频、三角波、正弦波、方波发生邓各个模块分别用VHDL语言编程为一个子程序,并把每一个模块转换成图形文件,然后在原理图编辑框调用这些图形模块,连接电路如上图系统顶层框图所示。

通过按键1到按键8控制频率调节f〔7...0〕,用按键6、按键7、按键8控制dlt 、sin 、sqr 波形选通,最后把八位输出接DAC0832通过D/A 转换,从示波器上就能看到波形输出。

按下不同的按键输出不同的波形及频率。

三、系统设计(1)数控分频器模块在时钟的作用下,通过预置分频数DIN ,来改变输出频率。

假如分频系数为N ,波形存储模块存储一个周期的波形,实验里按照一个周期波形采样64个点存储在波形存储模块里。

则输出频率N f f clkout .64=(2).数据存储模块 (存储波形数据)数据存储模块主要存的是正弦波、三角波、锯齿波等一个周期的采样点。

三角波模块可设计一个可逆计数器实现,设计时设置一变量作为工作状态标志,在此变量为0时,当检测到时钟的上升沿进行加同一个数操作;为1时,进行减同一个数操作。

DA 转换采用的DA0832,输入有8个数据端,范围是0到255;而且设置64个时钟周期为一个三角波周期,所有每次加、减为8.锯齿波的存储数据与三角波类似。

VHDL多路波形发生器实验报告

VHDL多路波形发生器实验报告

VHDL多路波形发生器实验报告一、基本要求:1、对输入时钟信号进行分频,实现三路互差120°的信号。

2、实现输出信号的占空比控制clk: 输入时钟信号reset: 同步复位信号(低电平有效)div: 输入分频控制信号(注意:6n分频)ctrl: 占空比控制信号ctrl=1时, 占空比为1:1ctrl=2时, 占空比为1:2ctrl=3时, 占空比为2:1A,B,C: 三路输出信号二、设计思路:1.实验为6n分频,用变量s来控制,0~6n-1这六个数,当时钟信号每来一个上升沿时加1,当为6n-1时清零;2.定义N为常量,通过改变N的值改变分频;3.ctrl值不同时,占空比不同,用case语句控制,ctrl分别为01,10,11和其他;4.具体波形的实现用if语句,当占空比为1时,A输出信号在s=0和s=3*n时翻转,B输出信号在s=2*n和s=5*n时翻转,C输出信号在s=4*n和s=n的时候翻转。

当占空比为1:2时,A输出信号在s=0和s=2*n时翻转,B输出信号在s=2*n和s=4*n时翻转,C输出信号在s=4*n和s=0的时候翻转。

当占空比为2:1时,A输出信号在s=0和s=4*n时翻转,B输出信号在s=2*n和s=0时翻转,C输出信号在s=4*n和s=2*n的时候翻转;5.在占空比为1和1:2时,C输出信号应比B慢120度,但是实际输出超前B,所以要对C输出进行反相;同理,在占空比为2:1时,要对B、C分别进行反向。

6.用if语句判断是否复位,若非,则执行case语句。

三、流程图:四、源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity top isport(clk,reset:in std_logic;ctrl:in std_logic_vector(1 downto 0);A,B,C:out std_logic);end top ;architecture rel of top issignal temp1,temp2,temp3,temp4,temp5 : std_logic; constant N: integer:=1;signal s:integer range 0 to 6*N-1 ;beginprocess(clk,reset,ctrl)beginif (reset='0') thentemp1<='0';temp2<='0';temp3<='0';temp4<='0';temp5<='0';s<=0;elsecase ctrl iswhen "01"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=3*N thentemp1<= not temp1;end if;if s=2*N thentemp2<= not temp2;end if;if s=5*N thentemp2<= not temp2;end if;if s=4*N thentemp4<= not temp4;end if;if s=N thentemp4<= not temp4;end if;end if;temp3<= not temp4;when "10"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=2*N thentemp1<= not temp1;end if;if s=2*N thentemp2<= not temp2;end if;if s=4*N thentemp2<= not temp2;end if;if s=4*N thentemp4<= not temp4;end if;if s=0 thentemp4<= not temp4;end if;end if;temp3<= not temp4;when "11"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=4*N thentemp1<= not temp1;end if;if s=2*N thentemp5<= not temp5;end if;if s=0 thentemp5<= not temp5;end if;if s=4*N thentemp4<= not temp4;end if;if s=2*N thentemp4<= not temp4;end if;end if;temp2<= not temp5;temp3<= not temp4;when others=>temp1<='0';temp2<='0';temp3<='0';end case;end if;end process;A<=temp1;B<=temp2;C<=temp3;end rel;五、仿真波形:整体波形:当ctrl=1 当ctrl=2 当ctrl=3复位当ctrl=其他:六、实验过程遇到的问题:在程序设计时,开始不知该怎样使A,B,C互差120度,开始是想通过定义一个变量,每来一个上升沿加1,从0开始,A路信号除3n 取余为0则翻转,B路信号除3n取余为1则翻转,C路信号除3n取余为2则翻转,我觉得这样的想法应该没有错,可是实际却调不出来,可能是某处逻辑有问题,后来就模仿老师给的6分频程序,设计了现在的程序。

FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设

FPGA VHDL 简易波形发生器 简易信号发生器 EDA课设

简易信号发生器1引言信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。

它能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波等,在电路实验和设备检测中具有十分广泛的用途。

例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。

在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。

本设计采用FPGA来设计制作多功能信号发生器。

该信号发生器可以产生锯齿波、三角波、方波等波形。

2 FPGA简介FPGA(Field-Programmable Gate Array)即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。

它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

与传统们阵列和掩模可编程门阵列(MPGA)相比,FPGA具有很多的优点,传统门阵列可以用来设计任何电路,但是只能在工厂中一次性编程,而且还需要针对该电路的特定的掩模。

FPGA是标准通用器件。

使用其代替MPGA,可以将设计时间由几个月缩短至几小时,并且使设计更加简单,从而减少了错误修改和设计指标变更的花费。

FPGA器件在结构上,由逻辑功能块排列为阵列,它的结构可以分为三个部分:可编程快CLB(Configurable Logic Blocks)、可编程I/O模块IOB(Input Block)和可编程内部连线PI(Programmable Interconnect)。

CL B在器件中排列为阵列,周围有环形内部连线,IOB 分布在四周的管脚上。

FPGA也存在缺点,FPGA中,每个可编程的点都有电阻和电容。

电阻和电容的使用减慢了信号的传输速度,所以FPGA的速度比传统门阵列要低,而且,FPGA中互联延迟是不可预测的。

基于VHDL语言的简易信号发生器

基于VHDL语言的简易信号发生器

基于VHDL语言的简易信号发生器1设计方案1.1??系统功能要求函数信号发生器是一种能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波等波形的电路。

函数信号发生器在电路实验和设备检测中具有十分广泛的用途。

现在我们通过对函数信号发生器的原理以及构成设计一个能变换出三角波、正弦波、方波的简易发生器。

1.2??总体框图(。

2??2.1BEGINBEGINIFclrn='0'THENtmp:="00000000";ELSIFclk'EVENTANDclk='1'THENIFf='0'THENIFTHENf:='1';ELSEtmp:=tmp+1;ENDIF;ELSEIFtmp="00000001"THENtmp:="00000000";f:='0';ELSEtmp:=tmp-1;ENDIF;ENDIF;ENDIF;q<=tmp;ENDPROCESS;ENDa;2.2方波模块该模块部分VHDL源程序如下: LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENDIF;BEGINENDIF;ENDIF;ENDa;2.3LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYsinISPORT(clk,clrn:INSTD_LOGIC;q:OUTINTEGERRANGE255DOWNTO0); ENDsin; ARCHITECTUREAOFsinISBEGINPROCESS(clk,clrn)VARIABLEtmp:INTEGERRANGE63DOWNTO0;BEGINIFclrn='0'THENq<=0;tmp:=0;ELSEIFclk'EVENTANDclk='1'THENIFtmp=63THENtmp:=0;ELSEtmp:=tmp+1;ENDIF;CASETMPISWHEN00=>q<=255;WHEN01=>q<=254;WHEN02=>q<=252;WHEN03=>q<=249; WHEN04=>q<=245;WHEN05=>q<=239;WHEN06=>q<=233;WHEN07=>q<=225;ENDIF;ENDIF;ENDa;2.4ENTITYsig_controlISPORT(delta,square,sin:INSTD_LOGIC;d0,d1,d2:INSTD_LOGIC_VECTOR(7DOWNTO0);q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDsig_control;ARCHITECTUREbehaveOFsig_controlISSIGNALsel:STD_LOGIC_VECTOR(2DOWNTO0);BEGINsel<=delta&square&sin;PROCESS(sel)BEGINCASEselISWHEN"100"=>q<=d0;WHEN"010"=>q<=d1;WHEN"001"=>q<=d2;WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDbehave;3仿真波形及分析各部分模块完成后,用Quartus对程序编译、仿真、得到的仿真波形,各模块仿真波形及顶层仿真波形如下:3.13.23.3clkclrnQ[7..0]。

波形发生器课程设计vhdl

波形发生器课程设计vhdl

波形发生器课程设计vhdl一、教学目标本课程旨在通过学习VHDL(硬件描述语言),让学生掌握波形发生器的设计与仿真。

通过本课程的学习,学生应能理解VHDL的基本语法和编程技巧,能够运用VHDL设计简单的数字电路,特别是波形发生器。

此外,通过课程实践,培养学生分析问题、解决问题的能力,以及团队合作和沟通交流的能力。

具体来说,知识目标包括:1.掌握VHDL的基本语法和编程技巧。

2.理解波形发生器的工作原理和设计方法。

技能目标包括:1.能够运用VHDL设计简单的数字电路。

2.能够独立完成波形发生器的设计与仿真。

情感态度价值观目标包括:1.培养学生的创新意识和实践能力。

2.培养学生团队合作和沟通交流的能力。

二、教学内容本课程的教学内容主要包括VHDL基本语法、数字电路设计方法和波形发生器的设计与仿真。

1.VHDL基本语法:包括数据类型、信号声明、实体和架构、过程和函数、线网和赋值语句等。

2.数字电路设计方法:包括组合逻辑电路、时序逻辑电路和触发器的设计方法。

3.波形发生器的设计与仿真:包括正弦波、方波、三角波等波形发生器的设计方法,以及相应的仿真测试。

三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、案例分析法、实验法和讨论法等。

1.讲授法:用于讲解VHDL基本语法和数字电路设计方法。

2.案例分析法:通过分析实际案例,让学生学会波形发生器的设计与仿真。

3.实验法:让学生动手实践,独立完成波形发生器的设计与仿真。

4.讨论法:在课堂上引导学生进行思考和讨论,培养团队合作和沟通交流的能力。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《数字电路设计与VHDL编程》等。

2.参考书:《VHDL完全学习手册》、《数字电路与逻辑设计》等。

3.多媒体资料:包括PPT课件、教学视频、在线课程等。

4.实验设备:计算机、VHDL仿真软件(如ModelSim)、示波器等。

基于VHDL语言正弦波信号发生器--EDA实训报告-

基于VHDL语言正弦波信号发生器--EDA实训报告-

EDA实训报告学生姓名: XXX 学号: XXXXXXXXXXXX学院:理工学院专业:电子科学与技术题目:基于FPGA的正弦波发生器指导教师:安国臣2013年1月课程设计成绩评定表基于FPGA的正弦波发生器摘要:本设计结合了EDA技术和直接数字频率合成(DDS)技术。

EDA技术是现代电子设计技术的核心,是以电子系统设计为应用方向的电子产品自动化的设计技术。

DDS技术则是最为先进的频率合成技术,具有频率分辨率高、频率切换速度快、相位连续、输出相位噪声低等诸多优点。

本文在对现有DDS技术的大量文献调研的基础上,提出了符合FPGA结构的正弦信号发生器设计方案并利用MAXPLUSⅡ软件进行了设计实现。

文中介绍了EDA技术相关知识,同时阐述了DDS技术的工作原理、电路结构,及设计的思路和实现方法。

经过仿真测试,设计达到了技术要求。

关键词:现场可编程门阵列(FPGA);直接数字频率合成(DDS);正弦波信号发生器一、DDS的基本原理正弦波信号发生器是由地址发生器和正弦波数据存储器ROM两块构成,输入为时钟脉冲,输出为8位二进制。

1.地址发生器的原理地址发生器实质上就是计数器,ROM的地址是6位数据,相当于64位循环计数器。

2.只读存储器ROM的设计(1)、VHDL编程的实现①基本原理:为每一个存储单元编写一个地址,只有地址指定的存储单元才能与公共的I/O相连,然后进行存储数据的读写操作。

②逻辑功能:地址信号的选择下,从指定存储单元中读取相应数据。

直接数字频率合成器(DDFS)的基本原理:DDS是利用采样定理,根据相位间隔对正弦信号进行取样、量化、编码,然后储存在EPROM中构成一个正弦查询表,通过查表法产生波形。

它是由参考时钟、相位累加器、正弦查询表和D/A转换器组成,如图1所示。

图1 直接数字频率合成器原理框图相位累加器由N位加法器与N位累加寄存器级联构成,其原理框图如图2所示。

每来一个时钟脉冲Fc,N位加法器将频率控制数据K与累加寄存器输出的累加相位数据相加,把相加后的结果Y送至累加寄存器的输入端。

第8章应用VHDL语言方法设计简易正弦波信号发生器

第8章应⽤VHDL语⾔⽅法设计简易正弦波信号发⽣器第8章应⽤VHDL语⾔⽅法设计简易正弦波信号发⽣器【要求】掌握运⽤VHDL语⾔设计正弦波形发⽣器的基本⽅法【知识点】理解函数发⽣器的含义理解VHDL设计正弦波形发⽣器理解FPGA对D/A的接⼝和控制技术【重点和难点】VHDL设计正弦波形发⽣器FPGA对D/A的接⼝和控制技术§8.1 ⼯作任务的陈述与背景⼀、⼯作任务⽤VHDL语⾔⽅法设计⼀个正弦波形发⽣器。

基本要求:①学习VHDL设计正弦波形发⽣器;②掌握FPGA对D/A的接⼝和控制技术。

完成波形发⽣器的设计、仿真测试及实验系统上的硬件测试。

⼆、任务背景⾃20世纪60年代以来信号发⽣器有了迅速的发展,出现了函数发⽣器。

作为电⼦系统的重要组成部分,它⼴泛地应⽤在电⼦技术实验、⾃动控制系统和其他科研领域。

早期的信号发⽣器多采⽤模拟电⼦技术,电路形式有采⽤运放及分离元件构成,也有采⽤单⽚集成函数发⽣器专⽤芯⽚。

但采⽤模拟电路组成的函数信号发⽣器,⼀般可靠性较差,频率输出精度、稳定度低,调节不够精确,设计过程复杂、困难,功能不易扩展,尤其对任意波信号产⽣较为困难,难以满⾜科研和⾼精度实验的需要。

现代⾼精度函数发⽣器设计采⽤了EDA 技术,不但⼤⼤缩短了开发研制周期,提⾼了设计效率,输出信号频率精度和稳定度有很⼤提升,⽽⽬使系统具有结构紧读、设计灵活、实现简单、性能稳定的特点。

本章着重介绍采⽤EDA技术,应⽤VHDL语⾔,在ALTERA公司的QuartusⅡ软件环境下,完成频率可调的正弦波发⽣器的程序设计过程,并进⾏逻辑综合、仿真和硬件下载,产⽣正弦波信号。

§8.2 完成⼯作任务的引导⼀、资讯要完成本任务,需要了解以下⽅⾯的知识。

1.函数(波形)信号发⽣器的定义和作⽤函数(波形)信号发⽣器能产⽣某些特定的周期性时间函数波形(C n1,弦波、⽅波、⼆⾓波、锯齿波和脉冲波等)信号,频率范围可从⼏个微赫到⼏⼗兆赫。

基于VHDL语言的波形发生器的设计

基于VHDL语言的波形发生器的设计基于VHDL语言的波形发生器的设计利用FPGA芯片信号发生器的设计。

当按下开关1时产生三角波,当按下开关2时产生正弦波,当按下开关3时产生方波。

本次设计采用xilinx公司的ISE设计工具,在zedboard开发板中的xc7z020芯片上用VHDL来实现,并且利用ISE自带的chipscop完成对FPGA内部的信号的读取。

这样的设计具有体积小,修改升级容易等特点。

本设计采用自顶向下、纯文本实现数字时钟的设计、下载和调试。

1 设计原理本设计由信号产生,信号选择,信号控制输出三大模块组合而成。

其中信号产生模块有:三角波模块、方波模块、正弦波模块。

本设计采用K0~K2这三个按键为信号选择开关,选择信号产生模块输出的信号。

(顶层设计的例化语句见附录一)其RTL 图1-1:RTL图1-12主要功能模块u1:square方波产生模块;u2:sin正弦波产生模块;u3:delta三角波产生模块;u4:sig_control数据选择器模块;u5,u6:为使用chipscope所需生成的IP核。

2.1 u1方波产生模块(程序见附录二)产生方波,初始化为幅值225的高电平,每有一次时钟上升沿触发产生一次计数,当计数值达到128时跳到为0的低电平。

利用循环语句不断的产生高低电平的方波输出。

原理如图2-1:方波模块RTL 图2-12.2 u1正弦波产生模块(程序见附录三)功能是产生正弦波,产用信号抽样的原理,在一个正弦信号中等间隔的抽样64点,此64点的幅值作为一个正弦波数据表,每有一次时钟上升沿触发便赋予输出端q一个点的数据,依次赋值64个点的数据便完成一个周期的正弦波的输出。

并利用循环语句不断的产生正弦波的输出。

原理如图2-2:正弦波模块RTL 图2-22.3 u1三角波产生模块(程序见附录四)功能是产生三角波,初始化为幅值为0,每有一次时钟上升沿触发便进行幅值加1,当幅值达到最大255时,每有一次时钟上升沿触发便进行幅值减1,当幅值减为0时完成一个周期的输出。

VHDL语言正弦波信号发生器设计

AS正弦波信号发生器设计一、实验内容1•设计一正弦信号发生器,采用ROM进行一个周期数据存储,并通过地址发生器产生正弦信号。

(ROM : 6位地址8位数据;要求使用两种方法:VHDL 编程和LPM)2•正弦信号六位地址数据128,140,153,165,177,188,199,209, 219,227,235, 241,246,250,253,255,255,254,252,248,244,238,231,223,214,204,194,183,171,159,147,134,121,109,96,84,72,61,51,41,32,24 ,17,11,7, 3 ,1,0,0,2,5,9,1420,28,36,46,56,67,78,90,102,115,127 。

二、实验原理正弦波信号发生器是由地址发生器和正弦波数据存储器ROM两块构成,输入为时钟脉冲,输出为8位二进制。

1.地址发生器的原理地址发生器实质上就是计数器,ROM勺地址是6位数据,相当于64位循环计数器。

2•只读存储器ROM的设计(1)、VHDL编程的实现①基本原理:为每一个存储单元编写一个地址,只有地址指定的存储单元才能与公共的I/O相连,然后进行存储数据的读写操作。

②逻辑功能:地址信号的选择下,从指定存储单元中读取相应数据。

addrp^O] data[7,.O] —rI II- Ii—en ■in st⑵、基于LPM宏功能模块的存储器的设计①LPM : Library of Parameterized Modules可参数化的宏功能模块库。

②Quartus II提供了丰富的LPM库,这些LPM函数均基于Altera器件的结构做了优化处理。

③在实际的工程中,设计者可以根据实际电路的设计需要,选择LPM库中适当的模块,并为其设置参数,以满足设计的要求,从而在设计中十分方便的调用优秀的电子工程技术人员的硬件设计成果。

1.基于VHDL S程的设计在地址信号的选择下,从指定存储单元中读取相应数据系统框图如下:FPGA屢理框團2. 基于LPM宏功能模块的设计LPM宏功能具有丰富的由优秀的电子工程技术人员设计的硬件源代码可供调用,我们只需要调用其设计的模块并为其设计必要的参数即可。

#基于VHDL的波形发生器的设计与仿真

图2 DDS的原理框图
上图就是DDS的原理框图。需要注意的是,在实际使用中,应该把减去的S个脉冲均匀的分布在单位时间上,否则最后得到的fd可能有较大的相位抖动"如果对fo信号,在单位时间内,每C=int(fo÷S)个脉冲减去一个脉冲,就可以使输出频率fd的相位抖动最小。
3.2 DDS的特点
DDS具有相对带宽很宽,频率转换时间极短(可小于20ns),频率分辨率可以做到很高。当DDS的频率分辨率在相位累加器的位数N足够大时,理论上是可以获得相应的分辨精度,这是传统方法难以实现的。但由于DDS中不需要行为反馈控制,不仅频率建立及频率切换快,而且和频率分辨率、频谱纯度相互独立,这一点明显的优于PPL。
本文共分5大部分,第1部分介绍波形发生器的研究现状、研究波形发生器的目的和意义以及研究的主要内容,并且就研究现状指出了其中存在的问题。
接着第2部分则是介绍了DDS技术的基本原理,并分析DDS技术的特点。直接频率合成(DDS)技术因有突出的特点,如输出波形灵活且相位连续(这是其最大优势)、频率稳定度高、输出频率分辨率高、频率转换速度快、输出相位噪声低、集成度高、功耗低、体积小等,使其在频率合成源技术中被广泛使用,但DDS合成频率比较低且输出频谱杂散较大,又限制了其使用。本段将介绍直接频率合成(DDS)的一些基础知识及常见问答。
当我们要得到某一目标频率fd时,一般情况下是需要有一个基准频率源fo,一个分频系数为m的分频器,它们之间有如下关系:
m=fo÷fd(1)
由于分频器的分频系数m只能是整数,因此实际分频系数m1,并不等于需要的分频器分频系数m,他们有如下关系:
m1=int(m)≤m(2)
因此,为了得到准确的目标频率fd,我们希望分频器的输入频率不是基准频率源fo,而是另外的一个频率f1=fd×m1.这样我们通过分频系数为m1的分频器就可以得到准确的目标频率fd。由于m1≤m,也就是f1≤fo。假设fo和f11的差值为d=fo-f1,因此只要在基准频率fo上减去d,然后送入分频系数为m1的分频器,就可以得到我们需要的目标频率了。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于VHDL语言的波形发生器的设计基于VHDL语言的波形发生器的设计利用FPGA芯片信号发生器的设计。

当按下开关1时产生三角波,当按下开关2时产生正弦波,当按下开关3时产生方波。

本次设计采用xilinx公司的ISE 设计工具,在zedboard开发板中的xc7z020芯片上用VHDL来实现,并且利用ISE自带的chipscop完成对FPGA内部的信号的读取。

这样的设计具有体积小,修改升级容易等特点。

本设计采用自顶向下、纯文本实现数字时钟的设计、下载和调试。

1 设计原理本设计由信号产生,信号选择,信号控制输出三大模块组合而成。

其中信号产生模块有:三角波模块、方波模块、正弦波模块。

本设计采用K0~K2这三个按键为信号选择开关,选择信号产生模块输出的信号。

(顶层设计的例化语句见附录一)其RTL图1-1:RTL图1-12主要功能模块u1:square方波产生模块;u2:sin正弦波产生模块;u3:delta三角波产生模块;u4:sig_control数据选择器模块;u5,u6:为使用chipscope所需生成的IP核。

2.1 u1方波产生模块(程序见附录二)产生方波,初始化为幅值225的高电平,每有一次时钟上升沿触发产生一次计数,当计数值达到128时跳到为0的低电平。

利用循环语句不断的产生高低电平的方波输出。

原理如图2-1:方波模块RTL 图2-12.2 u1正弦波产生模块(程序见附录三)功能是产生正弦波,产用信号抽样的原理,在一个正弦信号中等间隔的抽样64点,此64点的幅值作为一个正弦波数据表,每有一次时钟上升沿触发便赋予输出端q一个点的数据,依次赋值64个点的数据便完成一个周期的正弦波的输出。

并利用循环语句不断的产生正弦波的输出。

原理如图2-2:正弦波模块RTL 图2-22.3 u1三角波产生模块(程序见附录四)功能是产生三角波,初始化为幅值为0,每有一次时钟上升沿触发便进行幅值加1,当幅值达到最大255时,每有一次时钟上升沿触发便进行幅值减1,当幅值减为0时完成一个周期的输出。

利用循环语句不断的产生幅值为255的波形的输出。

原理图如下:三角波模块RTL 图2-32.3 u4数据选择器模块(见附录五)利用数据选择器模块可以对三角波,正弦波,方波进行三选一得输出。

当开关d0拨通,d1,d2均闭合时q端输出的是三角波;当开关d1拨通,d0,d2均闭合时q端输出的是方波;当开关d2拨通,d0,d1均闭合时q端输出的是正弦波;数据选择器模块RTL 图2-43 硬件测试当程序下载到硬件之后,采用chipscope实现对FPGA内部信号的在线调试。

在FPGA已经下载程序的情况下,添加我们关心的信号或者接口,将选定了端口Chipscope(不妨理解为一个嵌入的系统)加入到程序后重新布局布线下载到FPGA中,此时我们就可以观察信号和接口的值了。

在对ip核的设置中设置chipscope每次对信号的抓取为2048个。

3.1 对三角波的抓取当选择信号K0置1,K1、K2置0时,信号发生器输出波形为三角波,如图3-1-1所示:Chipscope抓三角波波形图3-1-1利用chipscope的导出功能,得到具体的数据表。

如图3-1-2所示:Chipscope对三角波形的导出图3-1-23.2 对方波的抓取当选择信号K1置1,K0、K2置0时,信号发生器输出波形为方波,如图3-2-1所示:Chipscope抓方波波形图3-2-1利用chipscope的导出功能,得到具体的数据表。

如图3-2-2所示:Chipscope对方波形的导出图3-2-23.3 对正弦波的抓取当选择信号K2置1,K0、K1置0时,信号发生器输出波形为正弦波,如图3-3-1所示:Chipscope抓正弦波形图3-3-1利用chipscope的导出功能,得到具体的数据表。

如图3-3-2所示:Chipscope对正弦波形的导出图3-3-24 利用MATLAB实现直观的观测数据因为利用chipscope所导出的数据是一个一个的数组,所以无法对波形实现直观的观察。

为了方便观察实验数据,利用MATLAB软件实现对文本文件中的数据的读。

导出的每行数据可看做一个数组,每个数组第11位是波形的数据位,因此利用MATLAB只读第11列的数据。

利用MATLAB画波形时,横轴作为波形的时间轴,每间隔为1打一个点,纵轴作为波形的幅值,用polt输出将这些点链接起来,就可以直观的观测波形。

方波的MATLAB程序如下:clc,cleardata=textread('F:\ISE Design\wave_generate\实验数据\DELTA.txt');%采集路径th=data(:,11);%数组全部采集,采集第11位a=th';%转置t=0:2047;%点的个数subplot(311)plot(t,a);利用grid on,和subplot语句可以实现把三个波形画在一起(MATLAB全部程序见附录六),画好后波形如图4-1:MATLAB画出波形图4-15有待改进程序中的频率和幅值都是固定的,未能实现频率和幅值的可调节,因此就没有广泛的实用性,进一步的研究应从波形发生器向信号发生器改变。

附录一顶层设计例化语句LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;entity sig isPORT(clk,clrn : IN STD_LOGIC;fb,sjb,zxb:IN STD_LOGIC;ou:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));end sig;architecture Behavioral of sig isCOMPONENT sinPORT ( clk,clrn : IN STD_LOGIC;q : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));END COMPONENT;COMPONENT squarePORT ( clk,clrn : IN STD_LOGIC;q : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));END COMPONENT;COMPONENT deltaPORT ( clk,clrn : IN STD_LOGIC;q : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));END COMPONENT;COMPONENT sig_controlPORT(delta,square,sin :IN STD_LOGIC;d0,d1,d2 :IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END COMPONENT;component ilaPORT (CONTROL : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0);CLK : IN STD_LOGIC;TRIG0 : IN STD_LOGIC_VECTOR(7 DOWNTO 0));end component;component iconPORT (CONTROL0 : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0));end component;signal CONTROL : STD_LOGIC_VECTOR(35 DOWNTO 0);signal TRIG0 : STD_LOGIC_VECTOR(7 DOWNTO 0);signal a:STD_LOGIC_VECTOR(7 DOWNTO 0);signal b:STD_LOGIC_VECTOR(7 DOWNTO 0);signal c:STD_LOGIC_VECTOR(7 DOWNTO 0);beginu1: square PORT MAP(clk=>clk ,clrn=>clrn,q=>a);u2: sin PORT MAP(clk=>clk ,clrn=>clrn,q=>b);u3: delta PORT MAP(clk=>clk ,clrn=>clrn,q=>c);u4: sig_control PORT MAP(delta=>sjb ,square=>fb,sin=>zxb,d0=>a ,d1=>b,d2=>c,q=>ou); u5: ila PORT MAP (CONTROL,clk,ou);u6: icon port map (CONTROL);end Behavioral;附录二u1方波产生模块程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY square ISPORT(clk,clrn: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR(7 downto 0));END square;ARCHITECTURE a OF square ISSIGNAL f: STD_LOGIC;BEGINPROCESS(clk, clrn)V ARIABLE tmp:STD_LOGIC_VECTOR(7 downto 0);BEGINIF clrn='0' THEN tmp:="00000000";ELSEIF clk'event and clk='1' THEN ------------------------------上升沿触发IF tmp="11111111" THEN tmp:="00000000"; ---计数为256时置零ELSE tmp:=tmp+1;END IF;IF tmp<"10000000" THEN f<='1'; ------------------ 当计数小于128时,f为1ELSE f<='0'; ---------------------------------------------否则f为0END IF;END IF;END IF;END PROCESS;PROCESS(clk,f)BEGINIF clk'event and clk='1' THENIF f='1' THEN q<="11111111"; -----------------------------------f为1时q为255ELSE q<="00000000"; --------------------------------------------f为0时q为0END IF;END IF;END PROCESS;END a;附录三u2:sin正弦波产生模块程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sin ISPORT (clk,clrn:IN STD_LOGIC;q:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));END sin;ARCHITECTURE A OF sin ISBEGINPROCESS(clk,clrn)V ARIABLE tmp:INTEGER RANGE 63 DOWNTO 0; -------------------------对一个周期的正弦波采用64个点BEGINIF clrn='0' THEN q<="00000000" ; tmp:=0;ELSEIF clk'EVENT AND clk='1' THEN -----------------------------------------------上升沿触发IF tmp=63 THEN tmp:=0;ELSE tmp:=tmp+1;END IF;CASE tmp ISWHEN 00=>q<="11111111"; WHEN 01=>q<="11111110"; WHEN 02=>q<="11111100";WHEN 03=>q<="11111001"; WHEN 04=>q<="11110101"; WHEN 05=>q<="11101111";WHEN 06=>q<="11101001"; WHEN 07=>q<="11100001"; WHEN 08=>q<="11011001";WHEN 09=>q<="11001111"; WHEN 10=>q<="11000101"; WHEN 11=>q<="10111010";WHEN 12=>q<="10101110"; WHEN 13=>q<="10100010"; WHEN 14=>q<="10010110";WHEN 15=>q<="10001001"; WHEN 16=>q<="01111100"; WHEN 17=>q<="01110000";WHEN 18=>q<="01100011"; WHEN 19=>q<="01010111"; WHEN 20=>q<="01001011";WHEN 21=>q<="01000000"; WHEN 22=>q<="00110101"; WHEN 23=>q<="00101011";WHEN 24=>q<="00100010"; WHEN 25=>q<="00011010"; WHEN 26=>q<="00010011";WHEN 27=>q<="00001101"; WHEN 28=>q<="00001000"; WHEN 29=>q<="00000100";WHEN 30=>q<="00000001"; WHEN 31=>q<="00000000"; WHEN 32=>q<="00000000";WHEN 33=>q<="00000001"; WHEN 34=>q<="00000100"; WHEN 35=>q<="00001000";WHEN 36=>q<="00001101"; WHEN 37=>q<="00010011"; WHEN 38=>q<="00011010";WHEN 39=>q<="00100010"; WHEN 40=>q<="00101011"; WHEN 41=>q<="00110101";WHEN 42=>q<="01000000"; WHEN 43=>q<="01001011"; WHEN 44=>q<="01010111";WHEN 45=>q<="01100011"; WHEN 46=>q<="01110000"; WHEN 47=>q<="01111100";WHEN 48=>q<="10001001"; WHEN 49=>q<="10010110"; WHEN 50=>q<="10100010";WHEN 51=>q<="10101110"; WHEN 52=>q<="10111010"; WHEN 53=>q<="11000101";WHEN 54=>q<="11001111"; WHEN 55=>q<="11011001"; WHEN 56=>q<="11100001";WHEN 57=>q<="11101001"; WHEN 58=>q<="11101111"; WHEN 59=>q<="11110101";WHEN 60=>q<="11111001"; WHEN 61=>q<="11111100"; WHEN 62=>q<="11111110";WHEN 63=>q<="11111111"; WHEN OTHERS=>NULL;END CASE;END IF;END IF;END PROCESS;END A;附录四u3:三角波产生模块程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; -------------------预先定义的操作符可以进行重载ENTITY delta ISport(clk,clrn:IN STD_LOGIC;q:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));END delta;ARCHITECTURE a OF delta ISBEGINPROCESS(clk,clrn)V ARIABLE tmp:STD_LOGIC_VECTOR(7 DOWNTO 0);V ARIABLE f:STD_LOGIC; BEGINIF clrn='0' THEN tmp:="00000000";ELSIF clk'EVENT AND clk='1' THENIF f='0' THEN --------------- 三角波的上升,到255时跳到f1 IF tmp="11111110" THEN tmp:="11111111"; f:='1';ELSE tmp:=tmp+1;END IF;ELSE -----------------三角波的下降,到0时跳到f0 IF tmp ="00000001" THEN tmp:="00000000"; f:='0';ELSE tmp:=tmp-1;END IF;END IF;END IF;q<=tmp;END PROCESS;END a;附录五u4:数据选择器模块程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sig_control ISPORT( delta,square,sin :IN STD_LOGIC;d0,d1,d2:IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END sig_control;ARCHITECTURE behave OF sig_control ISSIGNAL sel:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINsel<=delta&square&sin; ---------------------------并置PROCESS(sel)BEGINCASE sel ISWHEN"100"=>q<=d0;WHEN"010"=>q<=d1;WHEN"001"=>q<=d2;WHEN OTHERS=>NULL;END CASE;END PROCESS;END behave;附录六利用MATLAB画波形的程序clc,cleardata=textread('F:\ISE Design\wave_generate\实验数据\DELTA.txt');%采集路径th=data(:,11);%数组全部采集,采集第11位a=th';%转置t=0:2047;%点的个数subplot(311)plot(t,a);grid ondata=textread('F:\ISE Design\wave_generate\实验数据\SIN.txt');%采集路径th=data(:,11);%数组全部采集,采集第11位b=th';%转置t=0:2047;%点的个数subplot(312)plot(t,b);grid ondata=textread('F:\ISE Design\wave_generate\实验数据\SQUARE.txt');%采集路径th=data(:,11);%数组全部采集,采集第11位c=th';%转置t=0:2047;%点的个数subplot(313)plot(t,c);grid on。

相关文档
最新文档