正弦信号发生器设计

  • 格式:doc
  • 大小:93.00 KB
  • 文档页数:5

正弦信号发生器设计

一:实验目的

1. 进一步熟悉Quartus2的使用;

2. 学会用case语句设计正弦信号;

3. 掌握DAC0832的使用以及运用示波器观察波形。

二:实验原理

简易正弦信号发生器的结构由如下四部分组成:

1.‘计数器或地址信号发生器

2.正弦信号数据存储器ROM,但在本实验中,为了简便起见,我们采用case语句直接将数据在程序中给出,而无需调用子模块ROM。并且我们选择的是128个的8位波形数据(一个正弦波形周期)。

3.VHDL顶层程序设计。

4.8位D/A(此实验器件选择DAC0832)。

地址发生器的时钟CLK的输入频率 f0与每个周期的波形数据点的个数(实验中选择了64个),以及D/A输出的频率f的关系是:f=f0/64

波形频率受以下因素制约:

1) D/A的最高工作频率

2) FPGA的工作频率

三:实验步骤

1. 程序的编辑:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity sin1 is port(rst,clk:in std_logic;

q:buffer std_logic_vector(7 downto 0) );

end;

architecture one of sin1 is

signal q1:integer range 0 to 127:=0;

begin

process(clk)

begin

if rst='0' then q<="00000000";

elsif clk'event and clk='1' then

if q1=127 then q1<=0;

else q1<=q1+1;

end if;

case q1 is

when 0=>q<="10000000";

when 1=>q<="10000110";

when 2=>q<="10001100";

when 3=>q<="10010010";

when 4=>q<="10011000";

when 5=>q<="10001110";

when 6=>q<="10100101";

when 7=>q<="10101010";

when 8=>q<="10110000";

when 9=>q<="10110110";

when 10=>q<="10111100";

when 11=>q<="11000001";

when 12=>q<="11000110";

when 13=>q<="11001011";

when 14=>q<="11010000";

when 15=>q<="11010101";

when 16=>q<="11011010";

when 17=>q<="11011110";

when 18=>q<="11100010";

when 19=>q<="11100110";

when 20=>q<="11101010";

when 21=>q<="11101101";

when 22=>q<="11110000";

when 23=>q<="11110011";

when 24=>q<="11110101";

when 25=>q<="11111000";

when 26=>q<="11111010";

when 27=>q<="11111011";

when 28=>q<="11111101";

when 29=>q<="11111110"; when 30=>q<="11111110";

when 31=>q<="11111111";

when 32=>q<="11111111";

when 33=>q<="11111111";

when 34=>q<="11111110";

when 35=>q<="11111110";

when 36=>q<="11111101";

when 37=>q<="11111011";

when 38=>q<="11111010";

when 39=>q<="11111000";

when 40=>q<="11110101";

when 41=>q<="11110011";

when 42=>q<="11110000";

when 43=>q<="11101101";

when 44=>q<="11101010";

when 45=>q<="11100110";

when 46=>q<="11100010";

when 47=>q<="11011110";

when 48=>q<="11011010";

when 49=>q<="11010101";

when 50=>q<="11010000";

when 51=>q<="11001011";

when 52=>q<="11000110";

when 53=>q<="11000001";

when 54=>q<="10111100";

when 55=>q<="11010110";

when 56=>q<="10110000";

when 57=>q<="10101010";

when 58=>q<="10100101";

when 59=>q<="10011110";

when 60=>q<="10011000";

when 61=>q<="10010010";

when 62=>q<="10001100";

when 63=>q<="10000110";

when 64=>q<="01111111";

when 65=>q<="01111001";

when 66=>q<="01110011";

when 67=>q<="01101101";

when 68=>q<="01100111";

when 69=>q<="01100001";

when 70=>q<="01011010";

when 71=>q<="01010101";

when 72=>q<="01001111";

when 73=>q<="01001001"; when 74=>q<="01000011";

when 75=>q<="00111110";

when 76=>q<="00111001";

when 77=>q<="00110100";

when 78=>q<="00101111";

when 79=>q<="00101010";

when 80=>q<="00100101";

when 81=>q<="00100001";

when 82=>q<="00011101";

when 83=>q<="00011001";

when 84=>q<="00010101";

when 85=>q<="00010010";

when 86=>q<="00001111";

when 87=>q<="00001100";

when 88=>q<="00001010";

when 89=>q<="00000111";

when 90=>q<="00000101";

when 91=>q<="00000100";

when 92=>q<="00000010";

when 93=>q<="00000001";

when 94=>q<="00000001";

when 95=>q<="00000000";

when 96=>q<="00000000";

when 97=>q<="00000000";

when 98=>q<="00000001";

when 99=>q<="00000001";

when 100=>q<="00000010";

when 101=>q<="00000100";

when 102=>q<="00000101";

when 103=>q<="00000111";

when 104=>q<="00001010";

when 105=>q<="00001100";

when 106=>q<="00001111";

when 107=>q<="00010010";

when 108=>q<="00010101";

when 109=>q<="00011001";

when 110=>q<="00011101";

when 111=>q<="00100001";

when 112=>q<="00100101";

when 113=>q<="00101010";

when 114=>q<="00101111";

when 115=>q<="00110100";

when 116=>q<="00111001";

when 117=>q<="00111110"; when 118=>q<="01000011";

when 119=>q<="01001001";

when 120=>q<="01001111";

when 121=>q<="01010101";

when 122=>q<="01011010";

when 123=>q<="01100001";

when 124=>q<="01100111";

when 125=>q<="01101101";

when 126=>q<="01110011";

when 127=>q<="01111001";

end case;

end if;

end process;

end one;

2.程序的编译。

3.管脚的锁定和下载。

4.硬件测试。

硬件测试:选择电路模式5,分配管脚号完毕后,将sof文件下载到FPGA中运行、测试,将示波器接于实验箱左下角的两个挂钩上观察波形的输出情况。

四:问答题

1. 如何让q输出口的16进制显示的数据在显示管上以十进制的方式显示出来。

答:只需采用12位的8421BCD码便可将0~255之间的所有数显示在三个数码管内,只是需将程序改一下。

五:小结

这次实验也没遇到太大障碍,一来是因为程序我已经在自己电脑上调试好了,基本工作都已完成,而来整个的工作原理相当熟悉。但还是有一些细节问题需要解决,示波器上显示的波形稍微有几个点不是很平滑,主要是出在数值上,需对某些数值做进一步的调整。