56 / 19
clk_out_c<=’1’;
END IF; END IF;
END PROCESS; clk-out<=clk_out_c; END;
(3) DDS_SIN模块实现正弦波地址数据输出
DDS_SIN的VHDL源代码如下。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY dds_sin IS
GENERIC(WIDTH:INTEGER:=6;
depth:INTEGER:=);
PORT(clk,clr:IN STD_LOGIC;
6
7 / 19
q:OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0));
END;
ARCHITECTURE one OF dds_sin IS
SIGNAL q1:INTEGER RANGE 0 TO (depth-1); BEGIN
PROCESS(clk,clr) BEGIN
IF clr=’1’THEN q1<=0;
ELSIF clk’EVENT AND clk=’1’THEN
IF q1<(depth-1) THEN q1<=q1+1;
ELSE q1<=0; END IF; END IF;
END PROCESS;
q<=CONV_STD_LOGIC_VECTOR(q1,WIDTH);
END;
(4) dds_rom模块用来保存正弦波波形数据
7
8 / 19
Dds_rom模块的VHDL源代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY dds_rom IS
GENERIC(addr:INTEGER:=6;
width:INTEGER:=8);
PORT( clk:IN STD_LOGIC;
address:IN STD_LOGIC_VECTOR(addr-1 DOWNTO 0);
dataout:OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0));
END;
ARCHITECTURE one OF dds_rom IS SIGNAL q:INTEGER RANGE 0 TO 63;
SIGNAL d:INTEGER RANGE 0 TO 255;
8
9 / 19
BEGIN
q<=CONV_INTEGER(address); PROCESS(clk)
BEGIN
CASE q IS
WHEN 00=>d<=255;
WHEN 01=>d<=254;
WHEN 02=>d<=252;
WHEN 03=>d<=249;
WHEN 04=>d<=245;
WHEN 05=>d<=239;
WHEN 06=>d<=233;
WHEN 07=>d<=225;
WHEN 08=>d<=217;
9
10 / 19
WHEN 09=>d<=207;
WHEN 10=>d<=197;
WHEN 11=>d<=186;
WHEN 12=>d<=174;
WHEN 13=>d<=162;
WHEN 14=>d<=150;
WHEN 15=>d<=137;
WHEN 16=>d<=124;
WHEN 17=>d<=112;
WHEN 18=>d<=99;
WHEN 19=>d<=87;
WHEN 20=>d<=75,
WHEN 21=>d<=;
10
11 / 19
WHEN 22=>d<=53;
WHEN 23=>d<=43;
WHEN 24=>d<=34;
WHEN 25=>d<=26;
WHEN 26=>d<=19;
WHEN 27=>d<=13;
WHEN 28=>d<=8;
WHEN 29=>d<=4;
WHEN 30=>d<=1;
WHEN 31=>d<=0;
WHEN 32=>d<=0;
WHEN 33=>d<=1;
WHEN 34=>d<=4;
11
12 / 19
WHEN 35=>d<=8;
WHEN 36=>d<=13;
WHEN 37=>d<=19;
WHEN 38=>d<=26;
WHEN 39=>d<=34;
WHEN 40=>d<=43;
WHEN 41=>d<=53;
WHEN 42=>d<=;
WHEN 43=>d<=75;
WHEN 44=>d<=87;
WHEN 45=>d<=99;
WHEN 46=>d<=112;
WHEN 47=>d<=124;
12
13 / 19
WHEN 48=>d<=137;
WHEN 49=>d<=150;
WHEN 50=>d<=162;
WHEN 51=>d<=174;
WHEN 52=>d<=186;
WHEN 53=>d<=197;
WHEN 54=>d<=207;
WHEN 55=>d<=217;
WHEN 56=>d<=225;
WHEN 57=>d<=233;
WHEN 58=>d<=239;
WHEN 59=>d<=245;
WHEN 60=>d<=249;
13
14 / 19
WHEN 61=>d<=252;
WHEN 62=>d<=254;
WHEN 63=>d<=255;
WHEN OTHERS=>NULL;
END CASE; END PROCESS;
dataout<=CONV_STD_LOGIC_VECTOR(d,WIDTH);
END;
(5) 三个元件如下所示:
dds_rom
dds_sin
14
15 / 19
dds_fen
15
16 / 19
(6)锁引脚,如下图:
16
17 / 19
(7)锁好引脚,编译成功后,下载到DE2板,扩展端口GPIO_0[7]~GPIO_0[0]外接D/A变换后送示波器观察波形。嵌入式逻辑分析仪SignalTapⅡ,可以方便把实际检测的信号通过JTAG口回送到计计算机进行分析。如下图所示,为最后输出波形。
17
18 / 19
四.实验收获
经过本次实验,我学到了很多东西。首先以前我对DDS的原理一无所知因为本次实验要用这个原理我就到图书馆去借有关的书籍、在网上查阅各种与DDS相关的资料,然后开始慢慢解了DDS原理,虽然我们只是做的比较简单的DDS信号源的设计,但这次试验,对我们来讲都是受益匪浅的一次经历。
还有以前我对QuartusII原理图的方式不是很熟悉,每次做老师布置的作业都会出现一些问题,不是代码容易写错就是引脚没有锁。但因为这次我们是小组合作的方式,我们三个齐头并进,刚开始都一起做,然后大家分工利用VHDL写出源代码,这也让我告诉自己不能够有错误,不然大家做的都会前功尽弃,于是我认真的输入代码,并编译成功后,给其他组员提供。在后面的工作中,我们又遇到了很多问题,例如由于某些数据提前没有改好,所以出来的波形不对,后来通过修改,以及在其他做出来的小组的帮助下,我18
19 / 19
们调试了DE2板的频率,出来了我们想要的波形。 此外团队合作在我们这次实验中也得到了充分的体现,大家都很想出色的完成此次实验,都很认真,很努力的完成。但对于我们来说本次实验中也是有一些遗憾的,例如我们的选题过于简单,单一,基本上全班都是一样的选题。对于我们小组来说,我们没有做出此次实验的拓展,没能够做出三角波 、方波和其他波形的产生。这是我们欠缺的地方。实践是检验真理的唯一标准。这次试验,让我学到了,求真、务实才是硬道理。
19