正弦信号发生器设计
- 格式: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之间的所有数显示在三个数码管内,只是需将程序改一下。
五:小结
这次实验也没遇到太大障碍,一来是因为程序我已经在自己电脑上调试好了,基本工作都已完成,而来整个的工作原理相当熟悉。但还是有一些细节问题需要解决,示波器上显示的波形稍微有几个点不是很平滑,主要是出在数值上,需对某些数值做进一步的调整。