版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 题目名称:基于fpga的正弦信号发生器班 级: 姓 名: 学 号: 日 期: 2012/07/06 基于fpga的正弦信号发生器设计1.1 引言直接数字频率合成(digital direct frequency synthesis)是一种比较新颖的频率合成方法。这个理论早在20世纪70年代就被提出,它的基本原理就是利用采样定理,通过查表法产生波形。1.2 方案比较与确定设计要求:利用eda技术,建立正弦信号dds产生模型,编写源程序,达到频率输出范围1khz-10mhz、频率步进100hz、频率稳定度优于10、带50负载输出电压峰峰值大于1v等要求,完成硬件实现与测试。【方案一】 采用分立元
2、件模拟直接合成法。这种方法转换速度快,频率分辨率高,但其转换量程靠手动来实现,不仅体积大难以集成,而且可靠性和准确度很难进一步提高。【方案二】 采用max038芯片来产生正弦波信号。该集成块的输出波形种类多,频率覆盖范围广。它采用的是rc充放电振荡结构。第一,由于模拟器件元件分散性太大,外接的电阻、电容对参数的影响很大,因而产生的频率稳定度差,只能达到。第二,它的频率控制是通过充放电流的大小来实现。因而要达到步进100hz,所需的电流变化量非常小,精度要求很高。所以采用max038芯片难以实现设计要求。【方案三】 采用锁相环合成方法。采用该方案设计输出信号的频率可达到超高频甚至微波段,且输出信
3、号频谱纯度较高。由于锁相环技术是一个不间断的负反馈控制过程,所以该系统输出的正弦信号频率可以维持在一个稳定状态,频率稳定度高。但由于它是采取闭环控制的,系统的输出频率改变后,重新达到稳定的时间也比较长。所以锁相环频率合成器要想同时得到较高的频率分辨率和转换率非常困难,频率转换一般要几毫秒的时间1,同时频率间隔也不可能做得很小。【方案四】 采用直接数字合成器(dds),可用硬件或软件实现。即用累加器按频率要求对相应的相位增量进行累加,再以累加相位值作为地址码,取存放于rom中的波形数据,经d/a转换,滤波即得到所需波形。以eda技术为基础,用fpga实现dds模型的设计。电路的规模大小和总线宽度
4、可以由设计者根据自己的需要而设定可将波形数据存入fpga的rom中。同时外部控制逻辑单元也可在fpga中实现。方法简单,易于程控,便于集成。用该方法设计产生的信号频率范围广,频率稳定度高,精度高,频率转换速度快。分析以上四种方案,显然第四种方案具有更大的优越性、灵活性。所以采用方案四进行设计。2、直接数字频率合成技术(dds)2.1 直接数字频率合成的基本结构图2.1 直接数字频率合成的基本结构如图2.1dds的基本结构图,从图中可以看出dds主要由四个基本部分组:(1)相位累加器;(2)波形rom;(3)d/a转换器;(4)低通滤波器。相位累加器的结构如图2.2所示图2.2 相位累加器原理框
5、图相位累加器是dds的核心部分,它由一个n位的加法器和n位的寄存器构成,通过把上一个时钟的累加结果反馈回加法器的输入端实现累加功能。这里的n是相位累加器的字长,k叫做频率控制字。每经过一个时钟周期,相位累加器的值递增k。波形rom示意图如图2.3所示 图2.3 波形 rom示意图当 rom 地址线上的地址(相位)改变时,数据线上输出相应的量化值(幅度量化序列)。因为波形rom的存储容量有限,相位累加器的字长一般不等于rom地址线的位数,因此在这个过程当中也又会引入相位截断误差。d/a 转换器将波形rom输出的幅度量化序列转化成对应的电平输出,将数字信号转换成模拟信号。但输出波形是一个阶梯波形,
6、必须经过抗镜像滤波,滤除输出波形中的镜像才能得到一个平滑的波形。抗镜像滤波器是一个低通滤波器,要求在输出信号的带宽内有较平坦的幅频特性,在输出镜像频率处有足够的抑止。根据 dds的基本结构,可以推出以下一些结论:频率控制字k唯一地确定一个单频模拟余弦信号的频率, (2.1)当k =1的时候dds输出最低频率为,= (2.2)这就是dds的频率分辨率,所以,当n不断增加的时候dds的频率分辨率可以不断的提高。d/a转换器的输出波形相当于是一个连续平滑波形的采样,根据奈奎斯特采样定律,采样率必需要大于信号频率的两倍。也就是说d/a转化器的输出如果要完全恢复的话,输出波形的频率必须小于。一般来说,由
7、于低通滤波器的设计不可能达到理想情况,即低通滤波器总是有一定的过渡带的,所以输出频率还要有一定的余量,一般来说在实际应用当中dds的输出频率不能超过0.4。 3、基于fpga的正弦信号发生器3.1 总体设计框图图3.1 信号发生器结构框图图3.1为本次设计总体结构框图,其中相位累加器和波形存储器构成信号发生器核 心部分。该部分又与频率字控制模块共同构成信号发生器主模块。而显示模块,d/a转换器和滤波电路则作为信号发生器外围硬件设计。下面就分主模块软件设计和外围硬件设计两大部分来说明信号发生器的设计。3.2 主模块软件设计3.2.1 相位累加器的设计图3.2 相位累加器图3.2为相位累加器内部结
8、构图,它有一个n位的全加器和一个寄存器构成。当系统时钟上升沿到来的时候,上一个时钟周期的相位值与频率字的相加值被送入累加寄存器,并输出高w位至波形存储器的地址线,同时相位值又被送回全加器进行相位累加。相位累加器流程图如图3.3所示 开 始 时钟上升沿到? no yes 相位累加 累加值寄存 高w位输出 结 束 图3.3 相位累加器流程图设计要求输出频率范围为50hz200hz,频率步进为50hz。根据前面介绍最高输出一般是系统时钟的40%。经过计算,设计选用系统时钟为40mhz时能实现设计要求。确定相位累加字长时,考虑到频率分辨率要等于或小于频率步进值,而且累加器字长一般为8的整数倍。由第二章
9、公式2.2计算后得出符合设计要求的累加器字长为n=24。 3.2.2 波形rom的设计这个模块是一个相对简单的模块。首先要确定波形rom的地址线位数和数据的字长,根据噪声功率的角度看波形rom的地址线位数应该等于或略大于字长。由于设计选择的dac位数为8,这样rom的字长很明显该和dac的字长相一致。而地址线的位数同样确定为8位。波形存储器利用相位累加器输出的高8位作为地址线来对其进行寻址,最后输出该相位对应的二进制正弦幅值。将得出的结果转化为8位的二进制数据,起幅值对应在00000000-11111111区间内。最后利用得到的二进制数据用vhdl编写程序实现正弦rom的设计。图3.4为正弦波
10、形rom模块。图3.4 正弦波形rom3.2.3 频率控制模块的设计设计要求频率步进为50hz,在频率控制模块中,增加了4个附加的频率步进按钮。分别为最小步进(50hz)的1倍、2倍、3倍和4倍即50hz、100hz、150hz和200hz。这样从大到小地利用频率步进值便可很快地调到所需要的频点。由于设计要求频率输出范围为50hz-200hz,则k值的最小值为21,最大值为84。设系统其始和复位时k的初值为21,即初始化频率为50hz。然后再根据所要输出的频率调整相应的步进量。图3.5为vhdl设计的频率控制模块。 图3.5为vhdl设计的频率控制模块3.3 外围硬件设计3.3.1 d/a转换
11、器实现数字量转化为模拟信号的转换电路称为d/a转换器(dac)。d/a转换器是把数字量转换成模拟量的线性电路器件,已做成集成芯片。由于实现这种转换的原理和电路结构及工艺技术有所不同,因而出现各种各样的d/a转换器。目前,国外市场已有上百种产品出售,他们在转换速度、转换精度、分辨率以及使用价值上都各具特色。 衡量一个d/a转换器的性能的主要参数有: (1)分辨率:是指d/a转换器能够转换的二进制数的位数,位数多分辨率也就越高。 (2)转换时间:指数字量输入到完成转换,输出达到最终值并稳定为止所需的时间。电流型d/a转换较快,一般在几ns到几百ns之间。电压型d/a转换较慢,取决于运算放大器的响应
12、时间。 (3)精度:指d/a转换器实际输出电压与理论值之间的误差,一般采用数字量的最低有效位作为衡量单位。 (4)线性度:当数字量变化时,d/a转换器输出的模拟量按比例关系变化的程度。理想的d/a转换器是线性的,但是实际上是有误差的,模拟输出偏离理想输出的最大值称为线性误差。目前,d/a转换器芯片种类较多,对于一般的使用者而言,只需掌握dac芯片性能及其与计算机之间接口的基本要求,就可根据应用系统的要求合理选用dac芯片,并配置适当的接口电路。3.3.2 滤波及放大电路在由数字信号至模拟信号这一过程转换好以后,得出的信号仍然是在时间上离散的点,需要将其用低通滤波器进行平滑处理,滤除高次频率的杂
13、波,得到平滑标准的正弦波。结束语随着信息技术高速发展,集成电路的大规模使用,电子系统已经进入了一个高速发展的全新时段。特别是eda技术的日趋成熟的今天,通过计算机辅助设计,可以很好地完成电子设计的自动化。在设计过程中,可根据需要随时改变器件的内部逻辑功能和管脚的信号方式,eda技术借助于大规模集成的fpga/cpld和高效的设计软件,用户不仅可通过直接对芯片结构的设计实行多种数字逻辑系统功能,而且由于管脚定义的灵活性,大大减轻了电路图设计和电路板设计的工作量及难度,同时,这种基于可编程芯片的设计大大减少了系统芯片的数量,缩小了系统的体积,提高了系统的可靠性。基于dds的信号发生器是最为理想的信
14、号产生模型,dds系统有着其他信号发生器所无法比拟的优势。今天dds广泛用于接受机本振、信号发生器、仪器、通信系统、雷达系统等,尤其适合跳频无线电通信系统。基于fpga的正弦信号发生器结合了的eda技术和dds理论,在eda技术高速、高效、高可靠性的前提下得到了更优的设计效果。但是系统的功能还没有得到完全利用,由于dds技术是利用查表法来产生波形的,则在基于fpga设计时只要把rom改成ram变可实现任意波形的产生。参考文献1 张玉兴. dds高稳高纯频谱频率源技术j. 系统工程与电子技术. 1997(2)24-282 冯 程. 用直接数字频率合成器产生正弦波j. 华中科技大学本科生论文. 2
15、003. 7-273 周国富. 利用fpga实现dds专用集成电路j. 电子技术应用. no.2.1998. 18-20波形截图:50hz100hz150hz200hz程序vhdl代码:-顶层模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sin256 isport(clk : in std_logic; rst : in std_logic; set : in std_logic_vector(1 downto 0);-
16、设置频率 q : out std_logic_vector(7 downto 0) );end sin256;architecture behavioral of sin256 is component adder port(a,b : in std_logic_vector(23 downto 0); c : out std_logic_vector(23 downto 0) ); end component; component d port(clk : in std_logic; rst : in std_logic; d : in std_logic_vector(23 downto
17、0); q : out std_logic_vector(23 downto 0) ); end component; component sin_rom8_8 port(adder:in std_logic_vector(7 downto 0); daout:out std_logic_vector(7 downto 0); end component; component setkp port(set : in std_logic_vector(1 downto 0); k : out std_logic_vector(23 downto 0); p : out std_logic_vec
18、tor(23 downto 0) ); end component; signal k,p : std_logic_vector(23 downto 0); signal tmp1,tmp2,tmp3 : std_logic_vector(23 downto 0);begin setk : setkp port map(set,k,p); add1: adder port map(k,tmp2,tmp1); d1 : d port map(clk,rst,tmp1,tmp2); add2: adder port map(tmp2,p,tmp3); sin_rom: sin_rom8_8 por
19、t map(tmp3(23 downto 16),q);end behavioral;-频率控制模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity setkp isport(set : in std_logic_vector(1 downto 0); k : out std_logic_vector(23 downto 0); p : out std_logic_vector(23 downto 0) );end setkp;
20、architecture behavioral of setkp isbegin process(set) begin case set is when "00"=>k<="000000000000000000010101"-50hz时 k 的值 when "01"=>k<="000000000000000000101010"-1000hz时 k 的值when "10"=>k<="000000000000000000111111"-150h
21、z时 k 的值when "11"=>k<="000000000000000001010100"-2000hz时 k 的值when others=>k<="000000000000000000010101" end case;end process; p<="000000000000000000000000"end behavioral;-相位累加模块,由加法器和d触发器组成-加法器library ieee;use ieee.std_logic_1164.all;use ieee.std
22、_logic_arith.all;use ieee.std_logic_unsigned.all;entity adder isport(a,b : in std_logic_vector(23 downto 0); c : out std_logic_vector(23 downto 0) );end adder;architecture behavioral of adder isbegin c<=a+b;end behavioral;-d触发器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;
23、use ieee.std_logic_unsigned.all;entity d isport(clk : in std_logic; rst : in std_logic; d : in std_logic_vector(23 downto 0); q : out std_logic_vector(23 downto 0) );end d;architecture behavioral of d isbegin process(clk,rst) begin if rst='1' then q<=(others=>'0'); elsif clk
24、9;event and clk='1' then q<=d; end if;end process;end behavioral;-sin 量化romlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sin_rom8_8 isport(adder:in std_logic_vector(7 downto 0); daout:out std_logic_vector(7 downto 0);end sin_r
25、om8_8;architecture behavioral of sin_rom8_8 isbeginprocess(adder) is begin case adder is when"00000000"=>daout<="10000000" when"00000001"=>daout<="10000011" when"00000010"=>daout<="10000110" when"00000011"=>da
26、out<="10001001" when"00000100"=>daout<="10001101" when"00000101"=>daout<="10010000" when"00000110"=>daout<="10010011" when"00000111"=>daout<="10010110" when"00001000"=>da
27、out<="10011001" when"00001001"=>daout<="10011100" when"00001010"=>daout<="10011111" when"00001011"=>daout<="10100010" when"00001100"=>daout<="10100101" when"00001101"=>da
28、out<="10101000" when"00001110"=>daout<="10101011" when"00001111"=>daout<="10101110" when"00010000"=>daout<="10110001" when"00010001"=>daout<="10110100" when"00010010"=>da
29、out<="10110111" when"00010011"=>daout<="10111010" when"00010100"=>daout<="10111100" when"00010101"=>daout<="10111111" when"00010110"=>daout<="11000010" when"00010111"=>da
30、out<="11000100" when"00011000"=>daout<="11000111" when"00011001"=>daout<="11001010" when"00011010"=>daout<="11001100" when"00011011"=>daout<="11001111" when"00011100"=>da
31、out<="11010001" when"00011101"=>daout<="11010100" when"00011110"=>daout<="11010110" when"00011111"=>daout<="11011000" when"00100000"=>daout<="11011011" when"00100001"=>da
32、out<="11011101" when"00100010"=>daout<="11011111" when"00100011"=>daout<="11100001" when"00100100"=>daout<="11100011" when"00100101"=>daout<="11100101" when"00100110"=>da
33、out<="11100111" when"00100111"=>daout<="11101001" when"00101000"=>daout<="11101010" when"00101001"=>daout<="11101100" when"00101010"=>daout<="11101110" when"00101011"=>da
34、out<="11101111" when"00101100"=>daout<="11110001" when"00101101"=>daout<="11110010" when"00101110"=>daout<="11110100" when"00101111"=>daout<="11110101" when"00110000"=>da
35、out<="11110110" when"00110001"=>daout<="11110111" when"00110010"=>daout<="11111001" when"00110011"=>daout<="11111010" when"00110100"=>daout<="11111010" when"00110101"=>da
36、out<="11111011" when"00110110"=>daout<="11111100" when"00110111"=>daout<="11111101" when"00111000"=>daout<="11111110" when"00111001"=>daout<="11111110" when"00111010"=>da
37、out<="11111111" when"00111011"=>daout<="11111111" when"00111100"=>daout<="11111111" when"00111101"=>daout<="11111111" when"00111110"=>daout<="11111111" when"00111111"=>da
38、out<="11111111" when"01000000"=>daout<="11111111" when"01000001"=>daout<="11111111" when"01000010"=>daout<="11111111" when"01000011"=>daout<="11111111" when"01000100"=>da
39、out<="11111111" when"01000101"=>daout<="11111111" when"01000110"=>daout<="11111111" when"01000111"=>daout<="11111110" when"01001000"=>daout<="11111110" when"01001001"=>da
40、out<="11111101" when"01001010"=>daout<="11111100" when"01001011"=>daout<="11111011" when"01001100"=>daout<="11111010" when"01001101"=>daout<="11111010" when"01001110"=>da
41、out<="11111001" when"01001111"=>daout<="11110111" when"01010000"=>daout<="11110110" when"01010001"=>daout<="11110101" when"01010010"=>daout<="11110100" when"01010011"=>da
42、out<="11110010" when"01010100"=>daout<="11110001" when"01010101"=>daout<="11101111" when"01010110"=>daout<="11101110" when"01010111"=>daout<="11101100" when"01011000"=>da
43、out<="11101010" when"01011001"=>daout<="11101001" when"01011010"=>daout<="11100111" when"01011011"=>daout<="11100101" when"01011100"=>daout<="11100011" when"01011101"=>da
44、out<="11100001" when"01011110"=>daout<="11011111" when"01011111"=>daout<="11011101" when"01100000"=>daout<="11011011" when"01100001"=>daout<="11011000" when"01100010"=>da
45、out<="11010110" when"01100011"=>daout<="11010100" when"01100100"=>daout<="11010001" when"01100101"=>daout<="11001111" when"01100110"=>daout<="11001100" when"01100111"=>da
46、out<="11001010" when"01101000"=>daout<="11000111" when"01101001"=>daout<="11000100" when"01101010"=>daout<="11000010" when"01101011"=>daout<="10111111" when"01101100"=>da
47、out<="10111100" when"01101101"=>daout<="10111010" when"01101110"=>daout<="10110111" when"01101111"=>daout<="10110100" when"01110000"=>daout<="10110001" when"01110001"=>da
48、out<="10101110" when"01110010"=>daout<="10101011" when"01110011"=>daout<="10101000" when"01110100"=>daout<="10100101" when"01110101"=>daout<="10100010" when"01110110"=>da
49、out<="10011111" when"01110111"=>daout<="10011100" when"01111000"=>daout<="10011001" when"01111001"=>daout<="10010110" when"01111010"=>daout<="10010011" when"01111011"=>da
50、out<="10010000" when"01111100"=>daout<="10001101" when"01111101"=>daout<="10001001" when"01111110"=>daout<="10000110" when"01111111"=>daout<="10000011" when"10000000"=>da
51、out<="10000000" when"10000001"=>daout<="01111101" when"10000010"=>daout<="01111010" when"10000011"=>daout<="01110111" when"10000100"=>daout<="01110011" when"10000101"=>da
52、out<="01110000" when"10000110"=>daout<="01101101" when"10000111"=>daout<="01101010" when"10001000"=>daout<="01100111" when"10001001"=>daout<="01100100" when"10001010"=>da
53、out<="01100001" when"10001011"=>daout<="01011110" when"10001100"=>daout<="01011011" when"10001101"=>daout<="01011000" when"10001110"=>daout<="01010101" when"10001111"=>da
54、out<="01010010" when"10010000"=>daout<="01001111" when"10010001"=>daout<="01001100" when"10010010"=>daout<="01001001" when"10010011"=>daout<="01000110" when"10010100"=>da
55、out<="01000100" when"10010101"=>daout<="01000001" when"10010110"=>daout<="00111110" when"10010111"=>daout<="00111100" when"10011000"=>daout<="00111001" when"10011001"=>da
56、out<="00110110" when"10011010"=>daout<="00110100" when"10011011"=>daout<="00110001" when"10011100"=>daout<="00101111" when"10011101"=>daout<="00101100" when"10011110"=>da
57、out<="00101010" when"10011111"=>daout<="00101000" when"10100000"=>daout<="00100101" when"10100001"=>daout<="00100011" when"10100010"=>daout<="00100001" when"10100011"=>da
58、out<="00011111" when"10100100"=>daout<="00011101" when"10100101"=>daout<="00011011" when"10100110"=>daout<="00011001" when"10100111"=>daout<="00010111" when"10101000"=>daout<="00010110" when"10101001"=>daout<="00010100" when"10101010"=>daout<="00010010" when"10101011"=>daout<="00010001" wh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 40吨级反渗透设备操作指南
- 工厂危险物品消防安全操作规程
- 苏教版五年级语文教学案例分析
- 食堂卫生管理与监督操作规范
- 七年级英语作文写作范本全集
- 环境教育特色课程开发方案
- 桥梁工程专项施工技术方案
- 高职院校校企合作实践教学方案
- 2025年航空航天行业航空航天安全管理研究报告及未来发展趋势预测
- 企业品牌建设与广告推广策略方案
- 2025年江苏省行政执法证考试题库附答案
- 2025年国考税务面试真题及答案
- 用火用电安全培训资料课件
- 城市沟槽开挖安全监测方案
- 基坑外架专项施工方案(单立杆双排脚手架)
- 本科护理系毕业论文
- (贵州)贵阳市、铜仁市2026届高三年级9月摸底考试化学(含答案)
- 外研版(三起)(2024)四年级上册英语 Unit 5 Lets go!单元整体教学设计(共5课时)
- GPS的课件教学课件
- 检验科标本接收与处理操作规程
- GB/T 43683.3-2025水轮发电机组安装程序与公差导则第3部分:立式混流式水轮机或水泵水轮机
评论
0/150
提交评论