1、任务书任务一:实现DDS信号发生器 (一)输出波形的频率范围100Hz20kHz; (二)具有频率设置和频率步进功能,频率步进50Hz; (三)在100Hz20kHz频率范围内,增加矩形波输出信号,频率可任意预置, 频率步进20Hz,频率精度0.05%; 任务二:简易数字信号传输性能分析仪设计 (一) 设计并制作一个数字信号发生器; (二)设计三个低通滤波器,用来模拟传输性道的幅频特性。 (三)设计一个伪随机信号发生器用来模拟信道噪声。 (四) 利用数字信号发生器产生的时钟信号进行同步,显示数字信号的信号眼图,并测试眼幅度。 任务三:电子琴设计 (一) 掌握常用的音阶产生原理,运用仿真研究其性
2、能;(二) 根据VHDL的语法规则,对系统的逻辑行为进行描述,然后通过综合工具进行电路结构的综合、编译、优化。扩展为多个音阶的电子琴,并利用FPGA内部的ROM装上多首歌曲,可用手动或自动选择歌曲。(三)设计控制输入电路、FPGA、显示电路和扬声器电路,实现声音滤波系统的整体实现。 目录任务一:实现DDS信号发生器1(一)设计目的1(二)设计原理1(三)设计结果3(四)心得体会5任务二:简易数字信号传输性能分析仪设计6(一)设计目的6(二)设计原理6(三)设计结果7(四)心得体会10任务三:电子琴设计11(一)设计目的11(二)设计原理11(三)电子琴各模块的设计实现12(四)设计结果17(五
3、)心得体会20四 结束语21五附录22六参考文献23 任务一:实现DDS信号发生器(一)设计目的 1、掌握DDS基本结构 2、掌握DSPBuilder层次化设计3、 掌握DSPBuilder中SignalTapII的使用 4、掌握频率设置和频率步进功能的算法设计(二)设计原理1、DDS电路的设计算法 直接数字频率合成(Direct Digital Synthesizer DDS)技术是从相位概念出发直接合成所需波形的一种新的频率合成技术,这种方法不仅可以产生不同频率的正弦波,而且可以控制波形的初始相位。还可以用DDS方法产生任意波形(AWG).DDS电路的工作原理如图1所示:图1其工作过程为:
4、 (1)将存于数表中的数字波形,经数模转换器D/A,形成模拟量波形。 (2)两种方法可以改变输出信号的频率:改变查表寻址的时钟CLOCK的频率,可以改变输出波形的频率。 改变寻址的步长来改变输出信号的频率,DDS即为对数字波形查表的相位增量由累加器对相位增量进行累加,累加器的值作为查表地址。 (3)D/A输出的阶梯形波形,经低通(或带通)滤波,成为质量符合需要的模拟波形。 2、DDS实现正弦波的算法设计 (1)该DDS系统的核心是相位累加器,它由一个加法器和一个位相位寄存器组成,每来一个时钟,相位寄存器以步长M增加,相位寄存器的输出与相位控制字相加,然后输入到正弦查询表地址上。正弦查询表包含一
5、个周期正弦波的数字幅度信息,每个地址对应正弦波中0度到360度范围的一个相位点。查询表把输入的地址相位信息映射成正弦波幅度的数字量信号,驱动DAC,输出模拟量。相位寄存器每经过2N/M个fc时钟后回到初始状态,相应的正弦波频率位为: (1)频率控制字与输出信号频率和参考时钟频率之间的关系为: (2)其中N是相位累加器的字长。因为取值范围为由以上公式解得:范围是100Hz到20kHz之间,所以N的取值范围为11到19.频率控制字与输出信号频率成正比,可见控制M就能得到任意频率的信号。 (2)通常用频率增量来表示频率合成器的分辨率,DDS的最小分辨率为: (3)这个增量也就是最低的合成频率。由取样
6、定理,所产生的信号频率不能超过时钟频率的一半,因此最高的合成频率为: (4)在实际运用中,为了保证信号的输出质量,输出频率不要高于时钟频率的1/4,即以避免混叠或谐波落入有用输出频带内。 (3)正弦ROM查询表完成输出信号相位到幅度的转换,它的输入是相位寄存器和相位控制字之和,其实也就是ROM的地址值(宽度为P位);ROM查找输出的数据(也为P位)送往D/A转换成模拟信号。在实际应用中,P不能太大,如果P太大,会导致ROM容量的成倍上升,而输出受D/A精度的限制未有很大改善。图2为相位累加器工作示意图,从图中可以看出,虽然相位累加器的位数为N为,但是只取高P位进行ROM查表。(三)设计结果 1
7、.在MATLAB里搭建的DDS信号发生器: 图2DDS信号发生器设计Phaseword(AltBus)模块起到相位调整的输入作用,一共32位。Freqword(AltBus)模块起到频率调整的输入作用,一共32位。AMP(AltBus)模块起到幅值调整的输入作用,一共8位。Delay(Storage)模块起到延时作用,图中是单位延时。ParallelAdderSubtractor1(Arithmetic)模块起到两个输入相加的作用,图中起到相位累加的功能。BusConversion(IO&Bus)模块起到调整总线位宽的作用,图中是从输入的32位调整为输出的10位。LUT(Storage)模块起
8、到保存正弦波值的作用,运用算法公式127*sin(0:2*pi/(210):2*pi)+128来输出正弦波。Product(Arithmetic)模块起到乘法作用,图中起到正弦波值与新输入的幅值进行相乘,来得到想要的波形的功能。DDSOut(AltBus)模块起到输出调整后的正弦波的作用。 2.MATLAB搭建的DDS仿真波形: 可以尝试改变DataIn的值观察不同频率下的波形。 图3仿真波形 3.在QuartusII中的顶层图形设计: 在新工程中搭建整个电路,调用dds子模块,搭建管口,配置管脚后自动生成下面的整个电路图。 、 图4dds电路模块 图5顶层图形设计 (四)心得体会经过这次设计
9、,我了解了DDS工作的特点和方式,掌握了在Quartus II环境下对FPGA设计,构建DDS的技术,其所产生的信号具有频率分辨率高、频率切换速度快、频率切换时相位连续,输出相位噪声低和可以产生任意波形等诸多优点。这是我接触FPGA语言的第一个设计,在这次设计中,我知道了我们要用到哪些软件,比如MATLAB,Dspbuilder,Quartus II.做DDS过程中,首先要先在MATLAB中搭建电路图,电路中的器件是要在Dspbuilder里找,在搭建的过程中,也相应了解了这些器件的功能,最后搭建完运行了一下,看波形是不是自己想要得到的。得到想要的,就要开始VHDL导出。在这个工程中。我遇到了
10、一些问题,无法导出文件,后来才知道这个软件要设环境变量,设完以后终于能成功导出文件。接下来就是建立Quartus II工程,在建的时候要仔细工程名,要跟导出的文件名一样,这样后面的编译才能通过。在建立图形设计文件也出现了一点问题,PDF文件里没有写明要新建一个文件,然后我就一直找都找不到,后来经老师操作才明白。新建完后打开电路图模块,开始搭建完整的电路,搭建完后进行管脚配置,我在这里学到了两种管脚配置的方法,一种是手动的把管脚一个个配上,一种是直接找到工程文件里的qsf文件,把管脚信息直接粘贴到这个文件中。这个地方我花的时间比较多,但也学到了不少。下面就要用到SignalTapII工具,先建立
11、stp文件,把一些需要的参数填进去,保存后进行再次编译,与DE2板子相连接后下载到里面,回到SignalTapII中,点击“AutoAnalysis”,自动分析便开始,在“data”栏里看到DDSOut信号不停地变换,说明此时已经可以观察到FPGA内DDSOut的信号变换。 设计流程遇到的问题都解决后,发现自己对不管是软件还是FPGA语言都有了一定的认知,有了解决问题的一些能力,为下次的设计打下了基础,能节省不少的时间,不用绕弯子。任务二:简易数字信号传输性能分析仪设计(一)设计目的 1、掌握DSP Builder的高级用法2、掌握M序列的vhdl语言编写 3、 运用M序列的算法设计实现数字信
12、号发生器 4、掌握低通滤波器的设计方法 (二)设计原理 1、伪随机序列设计 在数字通讯领域,为了提高数字信号的传输质量,必须对传输的数字信号在发送端做编码操作,在接收端做译码操作。但是在数字传输系统中,由于载有的信息在时间上往往是不均匀的(如数字语音信号),对应的数字序列编码的特性,不利于数字信号的传输。因此,可以通过数字基带信号预先进行“随机化”处理,使得信号的频谱在通带内平均化,改善数字信号的传输;然后在接收端进行译码操作,恢复到原来的信号。伪随机序列常用于这类加扰和解扰操作。下面以一类伪随机序列,即m序列为例,使用DSP Builder建立一个伪随机序列发生器。 M序列是指最长线性反馈移
13、位寄存器序列,是一种比较常见的伪随机序列发生器,可由线性反馈移位寄存器(Linear FeedBack Shift Register,LFSR)来产生。 图1 线性反馈移位寄存器的构成其多项式的表达式为: 在图1中所示的加法和乘法都是指模二运算中的乘法和加法,即逻辑与和逻辑异或。要产生最长的线性反馈移位寄存器序列,其特征多项式必须是n次本原多项式,如n=8。可以产生m序列的8级LFSR的特征多项式。如下: 上面公式可以生成的m序列的周期为。 2、曼彻斯特码设计 曼彻斯特编码,又称数字双向码。 在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示“1”
14、,从低到高跳变表示“0”, 利用硬件方法实现曼彻斯特编码的解调,电路复杂,实现较为困难由于曼彻斯特码每一位中间都有跳变信号,那么多次检测2个输入编码上升沿的时间间隔,可取间隔的最小值即为曼彻斯特码的数据率。已知曼彻斯特码时钟频率之后,就可以通过数字锁相的方式实现曼彻斯特码的码元和时钟同步。 图2 曼彻斯特码的码型结构图本次设计是将m序列输出与时钟相异或可得曼彻斯特码输出。3、滤波器设计:用有关软件制作三个低通滤波器,分别实现f=100KHz低通滤波器, f=200KHz低通滤波器, f=500KHz低通滤波器。(三)设计结果 1.用MATLAB搭建的m序列电路: 这个电路图主要实现了,图中有8
15、个延时器,代表次数,有一个异或器,起到相加的作用,有两个取反器,主要是由于一开始数值为0,取反后变1,才能开始后面的工作,最后输出波形图。 图3 m序列电路 2.m序列仿真波形: 图4 m序列波形 3.计数器-十分频 代码见附录 4.Quartus II中的整体电路: 包括十分频计数器,m序列生成,曼彻斯特码输出。曼彻斯特码是由时钟信号与m序列相异或而得。 图5 整体电路 5.曼彻斯特码波形(第四行波形): 图6 曼彻斯特码波形 6.三个滤波器设计电路: 用multisim软件搭建滤波器电路图,分别实现了f=100KHz低通滤波器, f=200KHz低通滤波器, f=500KHz低通滤波器。
16、图7 三个滤波器电路(四)心得体会这次设计主要了解了m序列和曼彻斯特码的产生过程,以及制作低通滤波器的流程。在做曼彻斯特码时也相继的遇到了许多困难,在解决的过程中,感受良多。首先制作m序列,按照任务书要求,在MATLAB里画出m序列的电路图,观察波形是否正确,在看波形时也了解了m序列产生规律,可以手动推出数据,再看波形,检查是否正确。然后就导出VHD文件,成为一个产生m序列的子模块,后面建工程时会用到,因为曼彻斯特码是由m序列和时钟信号相异或才得到的,为了在后面的波形图像上三个图形能对齐,正确显示波形,就要再写一个十分频计数器,我觉得写十分频计数器不难,难的是在新建工程并且搭建工程电路的时候,
17、总会出现各种各样的编译错误,解决过程是很考验人的耐心的。比如哪里的接口与模块的名字不一致,这个细小错误我碰到了好几次,编译成功后就可以新建波形文件,把接口全部导入进去并运行,就出来了波形,做到这我就有一种苦尽甘来的感觉。在做低通滤波器的工程中,由于指标要求给的比较详细,很快就把滤波器给搭建出来了。通过这次设计让我懂得了如何将m序列体现以及曼彻斯特码输出,增加了这方面的知识,为以后有关这方面的设计打下基础。任务三:电子琴设计(一)设计目的 1、了解电子琴各个模块的功能。2、用FPGA语言写出每个模块,把模块组合一起形成完整的电子琴程序。3、了解并运用DE2电路板。4、学会如何把电子琴程序加载到D
18、E2板上,在板上实现音乐播放。 (二) 设计原理电子琴的设计原理主要考虑实现以下功能:1.每个音符都有自己的固有频率,由频率的不同就决定了发出不同的音调。2.一首乐曲的组成不仅仅是音调,还包括每个音调持续时间的长短,也就是我们通常说的音长。3.需要建立一个ROM,存放不同歌曲,在板上能实现切换不同歌曲。采用FPGA来设计电子琴,原理图如图1: FPGA显示电路控制输入电路扬声电路 图1 采用FPGA设计的电子琴原理方框图控制输入电路主要是为用户设计的,起到一个输入控制的作用.FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现电子琴运作的主要控制模块.由设计者把编好的VHDL程序烧
19、制到现场可编程逻辑器件FPGA中,然后通过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱.FPGA的设计是整个系统的中心环节,具有举足清重的作用.它的实现主要是由设计者用VHDL硬件描述语言编程实现电子琴的功能,仿真调试成功之后,再烧到FPGA器件中去.这样作出来的成品插上电源,便可脱机运行.而FPGA模块的设计又重在VHDL语言的编程实现.用VHDL语言编写的程序总的顶层模块映射原理,它是由乐曲自动演奏模块、音调发生模块和数控分频模块组成。标准时钟频率经分频器分频得到一个12MHZ的频率和一个8HZ的频率,并分别输入音调发生模块和自动演奏模块。从自动演奏模块输出的
20、是乐谱信号,该乐谱信号作为音调发生模块的敏感信号输入并对其进行控制。音调发生模块有两个输出,分别是code和high,两个都接外部的显示部分,只不过code显示的是乐谱,high显示的是该乐谱是高音还是低音。这次电子琴设计采用了3个功能模块,分别是TONETABA .VHD、NOTETABS .VHD 和 SPEAKER.VHD。 图2 硬件乐曲演奏电路结构 (三)电子琴各模块的设计实现1 、数控分频器-SPEAKERA 音符的频率可以由图2中的 SPEAKERA 获得,这是一个数控分频器。由其clk 端输入一具有较高频率(这里是 12MHz)的信号,通过 SPEAKERA 分频后由 SPKO
21、UT 输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个 D 触发器以均衡其占空比,但这时的频率将是原来的 1/2 。SPEAKERA 对 clk 输入信号的分频比由 11 位预置数 T one10.0 决定。 SPKOUT 的输出频率将决定每一音符的音调,这样,分频计数器的预置值 Tone10.0 与 SPKOUT 的输出频率,就有了对应关系。例如在 TONETABA 模块中若取 Tone10.0=1036,将发音符为3音的信号频率。 图3 在RTL里显示的Speakera模块代码:LIBRARY IEEE;USE IEEE.STD_LOGIC
22、_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Speakera ISPORT ( clk : IN STD_LOGIC;clk2 : buffer std_logic;Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);SpkS : OUT STD_LOGIC );END;ARCHITECTURE one OF Speakera ISSIGNAL PreCLK, FullSpkS : STD_LOGIC;BEGINprocess(clk)VARIABLE COUNT:INTEGER RANGE 0 TO 2;be
23、ginIF(clk EVENT AND clk = 1)THENCOUNT:=COUNT+1; IF COUNT = 1 THEN clk2=1; ELSIF COUNT = 2 THEN clk2=0;COUNT:=0; END IF; END IF;END PROCESS;DivideCLK : PROCESS(clk2)VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ;BEGINPreCLK 11 THEN PreCLK = 1; Count4 := 0000;ELSIF clk2 EVENT AND clk2 = 1 THEN Count
24、4 := Count4 + 1;END IF;END PROCESS;GenSpkS : PROCESS(PreCLK, Tone)VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0);BEGINIF PreCLKEVENT AND PreCLK = 1 THENIF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS = 1;ELSE Count11 := Count11 + 1; FullSpkS = 0; END IF;END IF;END PROCESS;DelaySpkS : PROCESS
25、(FullSpkS)VARIABLE Count2 : STD_LOGIC;BEGINIF FullSpkSEVENT AND FullSpkS = 1 THEN Count2 := NOT Count2;IF Count2 = 1 THEN SpkS = 1;ELSE SpkS Tone=11111111111 ; CODE=1111111; HIGH Tone=01100000101 ; CODE=1001111; HIGH Tone=01110010000 ; CODE=0010010; HIGH Tone=10000001100 ; CODE=0000110; HIGH Tone=10
26、010101101 ; CODE=0100100; HIGH Tone=10100001010 ; CODE=0100000; HIGH Tone=10101011100 ; CODE=0001111; HIGH Tone=10110000010 ; CODE=1001111; HIGH Tone=10111001000 ; CODE=0010010; HIGH Tone=11000000110 ; CODE=0000110; HIGH Tone=11001010110 ; CODE=0100100; HIGH Tone=11010000100 ; CODE=0100000; HIGH Ton
27、e=11011000000 ; CODE=1001111; HIGH NULL;END CASE;END PROCESS;END;3、设置音符持续时间-NOTETABS在 NOTETABS 中设置了一个 8 位二进制计数器(计数最大值为 138 ),作为音符数据 ROM 的地址发生器。这个计数器的计数频率选为 4Hz ,即每一计数值的停留时间为 0.25 秒,恰为当全音符设为 1 秒时,四四拍的 4 分音符持续时间。例如,NOTETABS 在以下的 VHDL 逻辑描述中,“梁祝”乐曲的第一个音符为“3 ”,此音在逻辑中停留了 4 个时钟节拍,即 1秒时间,相应地,所对应的“ 3 ”音符分频预置
28、值为1036 ,在 SPEAKERA 的输入端停留了 1秒。随着NOTETABS 中的计数器按 4Hz 的时钟速率作加法计数时,即随地址值递增时,音符数据 ROM 中的音符数据将从 ROM 中通过ToneIndex3.0端口输向 TONETABA 模块,“梁祝”乐曲就开始连续自然地演奏起来了。 图5 在RTL里显示的NoteTabs模块代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTabs ISPORT ( clk : IN STD_LOGIC;trans : in
29、std_logic_vector(3 downto 0);clk2 : buffer std_logic;ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END;ARCHITECTURE one OF NoteTabs ISCOMPONENT MUSICCPORT(address : IN STD_LOGIC_VECTOR (8 DOWNTO 0);clock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT;SIGNAL Counter : STD_LOGIC
30、_VECTOR (8 DOWNTO 0);signal temp: std_logic_vector(8 downto 0);signal temp2: std_logic_vector(8 downto 0);BEGINPROCESS(clk) VARIABLE COUNT:INTEGER RANGE 0 TO 12500000; BEGIN IF(clk EVENT AND clk = 1)THENCOUNT:=COUNT+1; IF COUNT = 6250000 THEN clk2=1; ELSIF COUNT =12500000 THEN clk2=0;COUNT:=0; END I
31、F; END IF;END PROCESS;process(trans)begin if trans=0 thentemp=000000000;temp2=010001000;elsif trans=1 thentemp=010001011;temp2=011010011;elsif trans=2 thentemp=011010111;temp2=100010100;elsif trans=3 thentemp=100010111;temp2=101010011;end if;end process;CNT8 : PROCESS(clk2, Counter)BEGIN-if Countert
32、emp2 then -Counter=temp2 or Countertemp THEN Counter = temp;ELSIF (clk2EVENT AND clk2 = 1) THEN Counter Counter , q=ToneIndex, clock=clk);END;(四)设计结果1. 顶层设计 首先在Quartus II建立一个名为dianzi的工程,把上面的所有子模块的Vhd文件全部拷到这个工程文件夹下,然后在这个工程里新建一个名为dianzi的Vhd文件,编写顶层文件,来调用这些子模块,使整个电子琴代码能编译通过,能下载到DE2板上。顶层文件代码:LIBRARY IEEE
33、;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dianzi ISPORT ( CLK12MHZ : IN STD_LOGIC; CLK8HZ : IN STD_LOGIC;TT : in std_logic_vector(3 downto 0);CODE1 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);HIGH1 : OUT STD_LOGIC;SPKOUT : OUT STD_LOGIC );END;ARCHITECTURE one OF dianzi ISCOMPONENT NoteTabsPORT ( clk : IN STD_LOGI
34、C;trans : in std_logic_vector(3 downto 0);ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END COMPONENT;COMPONENT ToneTabaPORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ;CODE : OUT STD_LOGIC_VECTOR (6 DOWNTO 0) ;HIGH : OUT STD_LOGIC;Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) );END COMPONENT;COMPONEN
35、T SpeakeraPORT ( clk : IN STD_LOGIC;Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);SpkS : OUT STD_LOGIC );END COMPONENT;SIGNAL Tone : STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL ToneIndex : STD_LOGIC_VECTOR (3 DOWNTO 0);BEGINu1 : NoteTabs PORT MAP (clk=CLK8HZ, trans=TT ,ToneIndex=ToneIndex);u2 : ToneTaba PORT M
36、AP (Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1);u3 : Speakera PORT MAP(clk=CLK12MHZ,Tone=Tone, SpkS=SPKOUT );END;2. 建立mif文件 建立一个ROM,把原先存放数据的mif文件放入,然后就会生成一个完整的ROM。 图6 存放部分音乐拍子的mif文件3. 查看RTL电路,看整个构造以方便管脚配置。 图7 RTL里的整个电子琴电路图4.管脚配置 打开工程文件夹里的dianzi.qsf文件,里面的最后面输入需要的管脚的信息。管脚代码:set_location_assignmen
37、t PIN_Y2 -to CLK8HZset_location_assignment PIN_AG14 -to CLK12MHZset_location_assignment PIN_AB22 -to SPKOUTset_location_assignment PIN_AB28 -to TT0set_location_assignment PIN_AC28 -to TT1set_location_assignment PIN_AC27 -to TT2set_location_assignment PIN_AD27 -to TT3set_location_assignment PIN_G18 -to CODE16set_location_assignment PIN_F22 -to CODE15set_location_assignment PIN_E17 -to CODE14set_location_assignment PIN_L26 -to CODE13set_location_a