您的当前位置:首页正文

基于FPGA的数字信号发生器设计

2024-08-27 来源:个人技术集锦


基于FPGA的数字信号发生器设计

作者:杨家兴

(陕西理工学院物电学院电子通信1104班,陕西汉中 723000)

指导教师:薛转花

[摘要]数字信号发生器是数字信号处理中不可缺少的调试设备,在生产生活中的

应用非常广泛。本文所设计的内容就是基于Altera公司的现场可编程门阵列(FPGA)实现数字信号发生器的设计,本设计中应用VHDL硬件描述语言进行描述,使该数字信号发生器可以产生正弦波、方波、三角波、锯齿波四个独立的波形。

[关键词]:数字波形发生器;FPGA;VHDL

Design Of FPGA-based Digital Signal Generator

Author:Yang Jiaxing

(Garde11 class4 Major Communication engineering, School of Physics and Telecommunication

Engineering, Shaanxi University of Telechnology ,shaanxi hanzhong 723000)

Tutor: Xue Zhuanhua

[Abstract]Digital signal transmitter as a test facility is an important part of information processing system. In the production of a wide range of application of life. This content is designed by Altera, based on field programmable gate array (FPGA) design of digital signal generator, the design of the application of VHDL hardware description language to describe, so that the digital signal generator can produce sine, square, triangle, sawtooth waveforms of four independent.

[Key words]: Digital Waveform Generator; FPGA; VHDL

目 录

I

第一章 绪 论 ............................................... 3 1.1 背景与意义 .......................................... 3 1.2 国内外发展现状 ....................................... 3 第二章 相关资料 ............................................ 4 2.1 FPGA简介 ............................................ 4 2.3 VHDL简介 ............................................ 5 2.4 QuartusⅡ简介........................................ 6 第三章 系统软件设计 ........................................ 7 3.1软件系统流程图 ....................................... 7 3.2 数字信号发生器的软件设计 ............................. 8 3.2.1 主控制模块 ...................................... 8 3.2.2 波形数据产生模块 ................................ 9 结束语 .................................................... 12 致谢 ...................................................... 12 参考文献 .................................................. 12 附 录 ..................................................... 13

II

基于FPGA的数字信号发生器设计

1.绪 论

1.1 背景与意义

在电子技术领域,常常需要波形、频率、幅度都可调的电信号,用于产生这种电信号的电子仪器称作信号发生器。

信号发生器是一种常用的信号源,广泛运用于科学研究、生产实践和教学试验等领域。特别是在通信系统的科研实验中,常常需要用到不同频率和幅度的信号,如正弦波、三角波、方波和锯齿波等。作为一种为电子测量和计量提供电信号的设备,它和万用表、示波器、频率计等仪器一样,是最普通、最基本,也是运用最广泛的电子仪器之一,几乎所有电参量的测量都需要用到信号发生器。

传统的波形发生器多采用模拟分立元件实现,产生的波形种类要受到电路硬件的限制,体积大、灵活性和稳定性也相对较差。近年来,以数字技术为基础的数字信号发生器得到了飞速的发展,性能指标都达到了一个新的水平。现场可编程门阵列器件具有容量大、运算速度快、现场可编程等优点,使得许多复杂的电路有了新的实现途径,越来越被广泛地应用到实际系统中。而且随着当今电子系统的越来越复杂,毫无疑问,数字信号发生器正在成为模拟复杂信号的事实标准。

凡是能产生测试信号的仪器,统称为信号源,也称为信号发生器,它用于产生被测电路所需特定参数的电测试信号。

信号源是根据用户对其波形的命令来产生信号的电子仪器。信号源主要给被测电路提供所需要的已知信号(各种波形),然后用其它仪表进行测量的参数。信号源有很多种分类方法,其中一种方法可分为混和信号源和逻辑信号源两种。其中混和信号源主要输出模拟波形;逻辑信号源输出数字码形。混和信号源又可分为函数信号发生器和任意波形/函数发生器,其中函数信号发生器输出标准波形,如正弦波、方波等,任意波/函数发生器输出用户自定义的任意波形;逻辑信号发生器又可分为脉冲信号发生器和码型发生器,其中脉冲信号发生器驱动较小个数的的方波或脉冲波输出,码型发生器生成许多通道的数字码型。 1.2 国内外发展现状

采用可变时钟和计数器寻址波形存储器的任意波形发生器在一段时期内曾得到广泛的应用,其取样时钟频率较高且可调节,然而这种波形发生器对硬件要求比较高,需要高性能的锁相环和截止频率可调的低通滤波器,且频率分辨率低,频率切换速度较慢,已经逐步退出市场。

目前市场上的数字信号发生器主要采用直接数字合成(Direct Digital Synthesuzer,DDS)技术,这种波形发生器不仅可以产生可变频的载频信号、各种调制信号,同时还能和计算机配合产生用户自定义的有限带宽的任意信号,可以为多领域的测试提供宽带宽、高分辨率的测试信号。 从目前发展状况来看,国外数字信号发生器的研制和生产技术已经较为成熟。以安捷伦(Agilent)和泰克(Tektronix)为代表的国际电子测量仪器公司在此领域进行了卓有成效的研究和开发,其产品无论在技术上还是市场占有率方面在国际上都享有盛誉,但其价格也相当昂贵,高端型号每台价格都在几万美金左右,低端的也要几万人民币。Tektronix公司的独立结构任意波形发生器AFG3000系列功能完善,人机界面友好,操作方便,可以以多种方式连接到PC机上,其最高采样率能达到2GS/s,输出正弦信号最高频率为240MHz,任意波频率最高能达到50MHz,并配备的强大的波形编辑软件ArbExpress,用户可以方便地创建和编辑自己的波形。Agilent公司的PXI模块任意波形发生器采样率已经能达到1.25GS/s,最高输出频率500MHz。我国研制任意波形发生器是从上世纪90年代开始的,近年来有一批本土厂商奋起直追,取得了可喜的成果。例如南京盛普科技电子有限公司的SPF120型信号发生器的主波输出频率达到了120MHz,任意波最高频率为100KHz;北京普源精电科技有限公司(RIGOL)生产的DG1000/2000/3000系列任意波形发生器,在性能上已经大略相当于国外中低端产品。

[6]

本课题的主要研究内容是参考直接数字频率合成原理(DDS)技术,利用Quartus II 9.0

3

[4]

基于FPGA的数字信号发生器设计

软件作为平台,VHDL语言作为开发语言,基于FPGA配合相应外围电路实现一个数字信号发生器,其电路结构简单,容易扩展,具有极大的灵活性和方便性,实现了产生频率、幅度可调的正弦波、三角波、方波、锯齿波信号的信号发生器。

2. 相关资料

2.1 FPGA简介

数字集成电路从产生到现在,经过了早期的电子管、晶体管、小中规模集成电路,到大规模、超大规模集成电路(VLSIC)以及许多既有特定功能的专用集成电路的发展过程。但是,随着为电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统设计师们更愿意自己设计专用集成电路(Application Special Integrated Circuit, ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在 实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(Field Programmable Logic Device, FPLD),

[1]

其中应用最广泛的当属CPLD和FPGA。

CPLD是复杂可编程逻辑器件(Complex Programmable Logic Device)的简称,FPGA是现场可编程门阵列(Field Programmable Gate Array)的简称。两者的功能基本相同,只是实现原理略有不同,但有时可以忽略这两者的区别。不同厂家对可编程逻辑器件的叫法也不尽相同。Altera公司把自己的可编程逻辑器件产品中的MAX系列(乘积项技术,EEPROM技术)、FLEX系列(查找表技术,SRAM工艺)都叫做CPLD;而把也是SRAM工艺、基于查找表技术、要外挂配置用的FLEX系列的EPROM叫做FPGA。

早期的可编程逻辑器件都属于低密度PLD(Programmable Logic Device),结构简单,设计灵活,但规模小,难以实现复杂的逻辑功能。1985年Xilinx公司首先推出了现场可编程门阵列FPGA,这是一种新型的高密度PLD,采用CMOS-SRAM工艺制作,其结构和阵列型PLD不同,内部由许多独立的可编程模块组成,逻辑模块之间可以灵活地相互连接,具有密度高、编程速度快,设计灵活和可再配置设计能力等许多优点。

FPGA一般由6部分组成,分别为可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等。

每个单元简介如下: (1)可编程输入/输出单元(I/O单元)。目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电气标准与I/O物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整输出驱动电流的大小等;

(2)基本可编程逻辑单元。FPGA的基本可编程逻辑单元是由查找表(LUT)和寄存器(Register)组成的,查找表完成纯组合逻辑功能。FPGA内部寄存器可配置为带 同步/异步复位和置位、时钟使能的触发器,也可以配置成为锁存器。FPGA一般依赖寄存器完成同步时序逻辑设计。一般来说,比较经典的基本可编程单元的配置是一个寄存器加一个查找表,但不同厂商的寄存器和查找表的内部结构有一定的差异,而且寄存器和查找表的组合模式也不同。

(3)嵌入式块RAM。目前大多数FPGA都有内嵌的块RAM。嵌入式块RAM可以配置为单端口RAM、双端口RAM、伪双端口RAM、CAM、FIFO等存储结构。

(4)丰富的布线资源。布线资源连通FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。布线资源的划分:

A全局性的专用布线资源:以完成器件内部的全局时钟和全局复位/置位的布线; B长线资源:用以完成器件Bank间的一些高速信号和一些第二全局时钟信号的布线; C短线资源:用来完成基本逻辑单元间的逻辑互连与布线;

D其他:在逻辑单元内部还有着各种布线资源和专用时钟、复位等控制信号线。

4

基于FPGA的数字信号发生器设计

(5)底层嵌入功能单元。由厂商及芯片型号决定。

(6)内嵌专用硬核。与“底层嵌入单元”有区别,这里指的硬核主要是那些通用性相对较弱的芯片,不是所有FPGA芯片都包含硬核。

2.3 VHDL简介

VHDL 的全称是Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982 年。1987年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。

VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用 , 它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来 ,VHDL 语言主要具有以下优点: (1) VHDL 语言功能强大 , 设计方式多样。

VHDL 语言具有强大的语言结构, 只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。同时, 它还具有多层次的电路设计描述功能。此外 ,VHDL 语言能够同时支持同步电路、异步电路和随机电路的设计实现, 这是其他硬件描述语言所不能比拟的。VHDL 语言设计方法灵活多样 , 既支持自顶向下的设计方式, 也支持自底向上的设计方法; 既支持模块化设计方法, 也支持层次化设计方法。

(2) VHDL 语言具有强大的硬件描述能力。

VHDL 语言具有多层次的电路设计描述功能,既可描述系统级电路 , 也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。同时,VHDL 语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL 语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。 (3) VHDL 语言具有很强的移植能力。

VHDL 语言很强的移植能力主要体现在: 对于同一个硬件电路的 VHDL 语言描述 , 它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。

(4) VHDL 语言的设计描述与器件无关。

采用 VHDL 语言描述硬件电路时, 设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化, 而不需要考虑其他的问题。当硬件电路的设计描述完成以后 ,VHDL 语言允许采用多种不同的器件结构来实现。 (5) VHDL 语言程序易于共享和复用。

VHDL 语言采用基于库 ( library) 的设计方法。在设计过程中 , 设计人员可以建立各种可再次利用的模块 , 一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计 , 而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块, 将这些模块存放在库中 , 就可以在以后的设计中进行复用。

由于 VHDL 语言是一种描述、模拟、综合、优化和布线的标准硬件描述语言 , 因此它可以使设计成果在设计人员之间方便地进行交流和共享, 从而减小硬件电路设计的工作量, 缩短开发周期。

5

基于FPGA的数字信号发生器设计

2.4 QuartusⅡ简介

Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VerilonHDL、VHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。

Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。

此外,Quartus II 通过和DSP Builder工具与 Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus II 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。

Altera QuartusII作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。

Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。

6

基于FPGA的数字信号发生器设计

图2.1 EDA工具设计流程图

3. 系统软件设计

3.1软件系统流程图

本设计主要是由FPGA为核心控制一些简单外围电路输出可控的方波、三角波、锯齿波、正弦波。输入部分为3个按键值,分别用于控制波型的选择、波型的调节;输出部分由一个8位的DA组成,由FPGA将数据波型数据送给DA转换输出模拟波型信号。具体流程如图4.1所示:

7

基于FPGA的数字信号发生器设计

初始化 按键输入,选择波型,调节波型。 由FPGA生成数字波型数据 将数字波型数据送入DA转换 输出模拟波型信号

图3.1 系统流程图

通过按键可以选择输出波型,如方波、三角波、正弦波、锯齿波。波型频率幅度的改变可以通过按对应的频率加按键和频率减键,幅度加键幅度减键。由于频率和幅度改变在QuartusⅡ软件平台下不能明显仿真步进变化,所以本设计没有介绍步进仿真。 3.2 数字信号发生器的软件设计

本次设计的软件部分主要运用Altera公司的QuartusⅡ软件平台,其开发流程基本分成2个步骤:

1.设计输入QuartusⅡ软件的设计文件可以来自QuartusⅡ9.0设计输入工具或各种工业标准的EDA设计输入工具QuartusⅡ强大的集成功能允许信息在各种应用程序间自由交流,设计者可在一个工程内直接从某个设计文件转换到其他任何设计文件,而不必理会设计文件是图形格式、文本格式,还是波形格式。QuartusⅡ具有如下的多种设计输入方法:原理图输入与符号编辑、硬件描述语言、波形设计输入、平面图编辑以及层次设计输入。如此众多的设计方法帮助设计者轻松地完成设计输入。 3.2.1 主控制模块

主控制模块完成了频率调节、幅度调节和波形选择三个控制功能。图是用QuartusⅡ9.0生成的主程序结构框图,其中CLK为标准频率50M输入,RST为系统复位键,VADD,VDEC为调节输出幅度的二个按键,使用方法是当按下VADD时幅度会每隔一秒递增一次,直到最大幅度,当按下VDEC时幅度会每隔一秒递减一次,直到最小幅度,PADD,PDEC为调节输出频率的二个按键,使用方法是当按下PVADD时频率会每隔一秒递增一次,直到最大频率,当按下PDEC时频率会每隔一秒递减一次,直到最小频率。SEL为波形选择键,当按下SEL键时系统每隔一秒在方波、三角波、正弦波,锯齿波四种波形循环切换。CNT为FPGA产生的8位数字波形数据信号。具体框图如图3.2所示。

8

基于FPGA的数字信号发生器设计

SUNCLKRSTVADDVDECPADDPDECSELinstCNT[7..0]

图3.2 主程序结构框图

3.2.2 波形数据产生模块

(1)方波数据产生模块

方波产生方法是由主控制模块提供方波频率和幅度,按照主控制模块的频率产生“0”和主控提供的幅度值。将这些数据直按送入DAC就能得到所需方波信号。产生框图如图3.3所示:CLK为主控模块提供的频率信号,RST为复位键,DIN为主控模块提供幅度信号,DOUT为产生的波型数据信号。

FOUTCLKRSTDIN[7..0]instDOUT[7..0] 图3.3 方波数据产生结构框图

方波信号仿真:因为幅度和频率调节不好仿真,下图为频率和幅度恒定的波形仿真图形,其中CLK为基准频率输入RST为复位键,低电平复位,其他的输入为调节键,CNT为数字方波数据。仿真如图3.4所示。

3.4 方波信号仿真

(2)三角波数据产生模块

三角波产生方法是由主控制模块提供波型频率和幅度,按照主控制模块的频率产生由0自加到主控模块提供的幅度值然后再自减到0。这些数据直按送入DAC就能得到所需三角波信号。产生框图如图3.5所示:CLK为主控模块提供的频率信号,RST为复位键,DIN为主控模块提供幅度信号,DOUT为产生的波型数据信号。

9

基于FPGA的数字信号发生器设计

SOUTCLKRSTDIN[7..0]inst3DOUT[7..0] 图3.5 三角波数据产生结构框图

三角波信号仿真:因为幅度和频率调节不好仿真,下图为频率和幅度恒定的波形仿真图形,其中CLK为基准频率输入,RST为复位键,低电平复位,其他的输入为调节键,CNT为数字三角波数据。仿真如图3.6所示。

3.6 三角波信号仿真

(3)锯齿波数据产生模块

锯齿波产生方法是由主控制模块提供波型频率和幅度,按照主控制模块的频率产生由0自加到主控模块提供的幅度值然后到跳到0再自加。这些数据直按送入DAC就能得到所需锯齿波信号。产生框图如图3.7所示:CLK为主控模块提供的频率信号,RST为复位键,DIN为主控模块提供幅度信号,DOUT为产生的波型数据信号。

JOUTCLKRSTDIN[7..0]inst1DOUT[7..0] 图3.7 锯齿波数据产生结构框图

锯齿波信号仿真:由于锯齿波信号与三角波信号仿真前面的数据相同,所以下面仿真截图为仿真后面的数据。由于幅度和频率调节不好仿真,下图为频率和幅度恒定的波形仿真图形,其中CLK为基准频率输入,RST为复位键,低电平复位,其他的输入为调节键,CNT为数字锯齿波数据。仿真如图3.8所示。

10

基于FPGA的数字信号发生器设计

3.8 锯齿波信号仿真

(4)正弦波数据产生模块

正弦波产生方法是由主控制模块提供波型频率,按照主控制模块的频率依次从64个已写好的正弦数据中取值,然后这些数据直按送入DAC就能得到所需正弦波信号。因为64个数据已经固定,所发正弦波不好调幅。产生框图如图:CLK为主控模块提供的频率信号,RST为复位键,DATA为产生的波型数据信号。具体框图如图3.9所示。

SINCLKRSTDATA[7..0]inst 图3.9 正弦波数据产生结构框图

正弦波信号仿真:因为幅度和频率调节不好仿真,下图为频率和幅度恒定的波形仿真图形,其中CLK为基准频率输入,RST为复位键,低电平复位,其他的输入为调节键,CNT为数字正弦波数据。仿真如图3.10所示。

3.10 正弦波信号仿真

11

基于FPGA的数字信号发生器设计

4.结束语

通过此次设计,让我深深的感觉到自己所学知识真是非常的浅薄。面对电子技术日新月异的发展,利用EDA手段进行设计已成为不可阻挡的趋势。相对于传统至底向上的设计方式,自上而下的设计具有其显著的优越性。利用EDA设计软件辅助设计,方便快捷,减少了错误率的产生,缩短了产品的设计及上市周期,既减轻了设计工作量又满足了商业利益的需求。

该系统以FPGA10K10器件为核心部件,可利用软件编程实现了对D/A转换信号的处理。努力做到了线路简单、高性价比的特点,充分利用了软件编程,弥补了硬件元器件的不足。

在设计过程当中,遇到了软件操作不熟练,程序编写不规范等诸多问题,通过对问题的总结分析得出,应用软件的主要功能必须熟练操作,才能提高工作效率,需要规范操作的地方必须严格按照使用说明操作,避免由于软件使用不当造成的错误产生。程序的编写格式必须规范,模块、端口以及信号变量的命名应当反映实际意义,缩进格式工整明了,方便阅读理解,这样有利于程序的编写,有利于分析调试,也有利于程序的重复使用。

此次课题的设计已告一段落,在这次毕业设计过程中需要用一些不曾学过的东西时,就要去有针对性地查找资料,然后加以吸收利用,以提高自己的应用能力,而且还能增长自己见识,补充最新的专业知识,学会了一些编程方面的常用算法。作为一名电子专业的毕业生,我将会继续在新技术的道路上不断钻研、开拓进取。相信通过此次设计的锻炼,我对专业知识和技能的掌握将更加牢靠,在今后的工作和学习中,必将使我受益匪浅,取得应有的优势。

致谢

我觉得作为一名通信工程专业的学生,QuartusⅡ的编程与设计是很有意义的,在这个过程中可以学会如何把自己平时所学的东西应用到实际中。虽然我对这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得有点难,但是靠着这两个多星期的突击学习,自己开始主动学习并逐步从基础慢慢开始弄懂它。我认为这个收获应该说是相当大的。我觉得课程设计反映的是一个从理论到实际应用的过程,这个过程对缺乏实际经验的我们是非常重要的。通过这次课程设计我认识到自身知识及能力的薄弱,更让我知道实践的重要性。在以后的学习过程中,我会更加努力学习QuartusⅡ的相关知识和应用,真正能够运用QuartusⅡ解决各种实际的问题。

通过这次课程设计,我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。我在FPGA的基本原理、FPGA应用系统开发方面,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。

参考文献

[1]谭会生,张昌凡等. EDA技术及应用(第二版)[M]. 西安:西安电子科技大学出版社,2004,17-78. [2]李国丽,朱维勇,栾铭.EDA与数字系统设计[M].北京:机械工业出版社,2004.1.4-10,98-128. [3]徐金龙,刘宇红,刘桥.基于DDS原理的任意波形信号发生器的设计[J].现代机械,2006,4:74-76.

[4]高琴,姜寿山,魏忠义.基于FPGA的DDS信号源设计与实现[J].西安工程科技学院学报,2006,20(2):211-214.

[5]杨丽,李镇,孙厚军.基于FPGA的多波形信号发生器[J].无线电工程,2005,35(7):46-48. [6]洪嘉,彭启琮,基于FPGA的数字中频信号发生器硬件设计[J].信息技术,2005,12:63-65. [7]杜培明.基于FPGA动态信号产生器设计[J].现代电子技术,2006,17:78-80. [8]莫小灵.正弦信号发生器的FPGA实现[J].新余高专学报,2006,11(3):90-91.

12

基于FPGA的数字信号发生器设计

附 录

数字信号发生器程序

--主控文件

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SUN IS PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; VADD :IN STD_LOGIC; VDEC :IN STD_LOGIC; PADD :IN STD_LOGIC; PDEC :IN STD_LOGIC; SEL :IN STD_LOGIC; CNT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END ENTITY;

ARCHITECTURE ONE oF SUN IS SIGNAL DCLK:STD_LOGIC;

SIGNAL DIV :STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL DCNT :STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL DDATA :STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL CNT1H:STD_LOGIC_VECTOR(24 DOWNTO 0); --定义一个1HZ的分频系数信号 SIGNAL CLK1H:STD_LOGIC; --定义一个1HZ频率信号。 SIGNAL DOUT0,DOUT1,DOUT2,DOUT3:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL SELCON :STD_LOGIC_VECTOR(1 DOWNTO 0);

COMPONENT FOUT PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT;

COMPONENT SOUT PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC;

13

基于FPGA的数字信号发生器设计

DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT;

COMPONENT JOUT PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT; COMPONENT SIN PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; DATA :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT; BEGIN

CNT <= DOUT0 WHEN SELCON=\"00\" ELSE DOUT1 WHEN SELCON=\"01\" ELSE DOUT2 WHEN SELCON=\"10\" ELSE DOUT3 ;

PROCESS(CLK1H,RST,SEL) BEGIN

IF RST='0' THEN SELCON<=\"00\"; ELSIF CLK1H'EVENT AND CLK1H='1' THEN IF SEL='1' THEN IF SELCON<\"11\" THEN SELCON<=SELCON+1; ELSE SELCON<=\"00\"; END IF; END IF; END IF;

END PROCESS;

PROCESS(CLK1H,RST,PADD,PDEC) BEGIN

IF RST='0' THEN DIV<=\"00000000\"; ELSIF CLK1H'EVENT AND CLK1H='1' THEN IF PADD='1' THEN DIV<=DIV+1; ELSIF PDEC='1' THEN

14

基于FPGA的数字信号发生器设计

DIV<=DIV-1; END IF; END IF;

END PROCESS;

PROCESS(CLK1H,RST,VADD,VDEC) BEGIN

IF RST='0' THEN DDATA<=\"00000000\"; ELSIF CLK1H'EVENT AND CLK1H='1' THEN IF VADD='1' THEN DDATA<=DDATA+1; ELSIF VDEC='1' THEN DDATA<=DDATA-1; END IF; END IF;

END PROCESS;

PROCESS(CLK,RST,DIV) BEGIN

IF RST='0' THEN DCLK<='0'; DCNT<=\"00000000\"; ELSIF CLK'EVENT AND CLK='1' THEN IF DCNT

END PROCESS;

--//////////////////////////////////////////// -- 1HZ分频进程

--/////////////////////////////////////////// PROCESS(CLK,RST) BEGIN

IF RST='0' THEN --当RST=0时复位 CNT1H<=(OTHERS=>'0');

ELSIF CLK'EVENT AND CLK='1' THEN --上升沿时计数。 IF CNT1H<\"1011111010111100000111111\" THEN CNT1H<=CNT1H+1;--当分频系数少于24999999时分频系数加1。 ELSE CNT1H<=(OTHERS=>'0'); CLK1H<=NOT CLK1H;--当分频系数等于24999999时分频系数清零同时1hz信号取反。 END IF; END IF;

END PROCESS;

15

基于FPGA的数字信号发生器设计

U0: SOUT PORT MAP(DCLK,RST,DDATA,DOUT1); U1: FOUT PORT MAP(DCLK,RST,DDATA,DOUT2); U2: JOUT PORT MAP(DCLK,RST,DDATA,DOUT3); U3: SIN PORT MAP(DCLK,RST,DOUT0); END ONE;

--方波数据产生文件

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY FOUT IS PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END ENTITY;

ARCHITECTURE ONE oF FOUT IS

SIGNAL DIV :STD_LOGIC_VECTOR(5 DOWNTO 0);

BEGIN

DOUT<= \"00000000\" WHEN DIV<\"100000\" ELSE DIN;

PROCESS(CLK,RST) BEGIN

IF RST='0' THEN DIV<=\"000000\";

ELSIF CLK'EVENT AND CLK='1' THEN IF DIV<\"111111\" THEN DIV<=DIV+1; ELSE DIV<=\"000000\"; END IF; END IF;

END PROCESS; END ONE;

--三角波数据产生文件

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SOUT IS

16

基于FPGA的数字信号发生器设计

PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END ENTITY;

ARCHITECTURE ONE oF SOUT IS

SIGNAL DIV :STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL CONT:STD_LOGIC; BEGIN

DOUT<=DIV;

PROCESS(CLK,RST) BEGIN

IF RST='0' THEN DIV<=\"00000000\"; CONT<='0';

ELSIF CLK'EVENT AND CLK='1' THEN IF CONT='0' THEN IF DIV\"00000000\" THEN DIV<=DIV-1; ELSE CONT<='0'; END IF; END IF; END IF;

END PROCESS; END ONE;

--锯齿波数据产生文件

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY JOUT IS PORT( CLK :IN STD_LOGIC; RST :IN STD_LOGIC; DIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

17

基于FPGA的数字信号发生器设计

END ENTITY;

ARCHITECTURE ONE oF JOUT IS

SIGNAL DIV :STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

DOUT<=DIV;

PROCESS(CLK,RST) BEGIN

IF RST='0' THEN DIV<=\"00000000\";

ELSIF CLK'EVENT AND CLK='1' THEN IF DIV<\"11111111\" THEN DIV<=DIV+1; ELSE DIV<=\"00000000\"; END IF; END IF;

END PROCESS; END ONE;

--正弦波数据产生文件

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY SIN IS PORT( CLK:IN STD_LOGIC; --读取数据频率输入 RST:IN STD_LOGIC; --复位键 DATA:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --正弦信号产生数据 );

END ENTITY;

ARCHITECTURE ONE OF SIN IS

SIGNAL CNT0:INTEGER RANGE 0 TO 63; --数据计数 BEGIN

--///////////////////////////////////////////// -- 正弦信号数据读取频率计数 --///////////////////////////////////////////// PROCESS(CLK,RST) BEGIN

IF RST='0' THEN CNT0<=0;

ELSIF CLK'EVENT AND CLK='1' THEN CNT0<=CNT0+1; END IF;

18

基于FPGA的数字信号发生器设计

END PROCESS;

--///////////////////////////////////////////// -- 正弦信号数据 --//////////////////////////////////////////// PROCESS(CNT0,RST) BEGIN

IF RST='0' THEN DATA<=\"00000000\"; ELSE

CASE CNT0 IS

when 0 => DATA<=\"10000000\"; when 1 => DATA<=\"10001100\"; when 2 => DATA<=\"10011001\"; when 3 => DATA<=\"10100101\"; when 4 => DATA<=\"10110001\"; when 5 => DATA<=\"10111101\"; when 6 => DATA<=\"11001000\"; when 7 => DATA<=\"11010010\"; when 8 => DATA<=\"11011011\"; when 9 => DATA<=\"11100100\"; when 10 => DATA<=\"11101011\"; when 11 => DATA<=\"11110010\"; when 12 => DATA<=\"11110111\"; when 13 => DATA<=\"11111011\"; when 14 => DATA<=\"11111110\"; when 15 => DATA<=\"11111111\"; when 16 => DATA<=\"11111111\"; when 17 => DATA<=\"11111110\"; when 18 => DATA<=\"11111100\"; when 19 => DATA<=\"11111001\"; when 20 => DATA<=\"11110100\"; when 21 => DATA<=\"11101110\"; when 22 => DATA<=\"11101110\"; when 23 => DATA<=\"11100111\"; when 24 => DATA<=\"11011111\"; when 25 => DATA<=\"11010110\"; when 26 => DATA<=\"11001100\"; when 27 => DATA<=\"11000001\"; when 28 => DATA<=\"10110110\"; when 29 => DATA<=\"10101010\"; when 30 => DATA<=\"10011110\"; when 31 => DATA<=\"10010010\"; when 32 => DATA<=\"10000101\"; when 33 => DATA<=\"01111000\"; when 34 => DATA<=\"01101011\"; when 35 => DATA<=\"01011111\";

19

基于FPGA的数字信号发生器设计

when 36 => DATA<=\"01010011\"; when 37 => DATA<=\"01000111\"; when 38 => DATA<=\"00111100\"; when 39 => DATA<=\"00110001\"; when 40 => DATA<=\"00100111\"; when 41 => DATA<=\"00011111\"; when 42 => DATA<=\"00010111\"; when 43 => DATA<=\"00010000\"; when 44 => DATA<=\"00001010\"; when 45 => DATA<=\"00000110\"; when 46 => DATA<=\"00000010\"; when 47 => DATA<=\"00000000\"; when 48 => DATA<=\"00000000\"; when 49 => DATA<=\"00000000\"; when 50 => DATA<=\"00000010\"; when 51 => DATA<=\"00000101\"; when 52 => DATA<=\"00001001\"; when 53 => DATA<=\"00001110\"; when 54 => DATA<=\"00010101\"; when 55 => DATA<=\"00011101\"; when 56 => DATA<=\"00100101\"; when 57 => DATA<=\"00101111\"; when 58 => DATA<=\"00111001\"; when 59 => DATA<=\"01000100\"; when 60 => DATA<=\"01010000\"; when 61 => DATA<=\"01011100\"; when 62 => DATA<=\"01101000\"; when 63 => DATA<=\"01110101\"; when others=> DATA<=\"00000000\"; END CASE; END IF;

END PROCESS;

--///////////////////////////////// END ONE;

20

基于FPGA的数字信号发生器设计

总体电路图

21

因篇幅问题不能全部显示,请点此查看更多更全内容