当前位置:文档之家› 频率可变的任意波形发生器

频率可变的任意波形发生器

深圳大学实验报告
课程名称:Verilog使用及其应用
实验名称:频率可变的任意波形发生器
学院:电子科学与技术学院
一、前言
波形发生器是一种数据信号发生器,在调试硬件时,常常需要加入一些信号,以观察电路工作是否正常,在实验与工程中都具有重要的作用。

随着电子技术的发展与成熟,电子工程领域对波形发生器的要求越来越高,不仅要求波形发生器具有连续的相位变换,频率稳定等特点,还要求波形发生器可以模拟各种复杂信号,并能做到幅度、频率,相位,波形动态可调。

Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

本实验正是基于Verilog HDL语言对波形发生器的功能进行描述,并进行仿真,从而了解与掌握波形发生器的内部工作原理,并进一步熟悉与掌握Verilog HDL语言,将课堂所学知识进行实践。

二、实验原理
总体设计方案及其原理说明:
FPGA
图1-1 系统总体设计方案
DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。

它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。

参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经N位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。

△P为频率字,即相位增量;参考频率为f_clk;相位累加器的长度为N位,输出频率f_out为:
F_out——输出信号的频率;
N————相位累加器的位数;
△P———频率控制字(步长);
F_clk——基准时钟频率。

图1-2 四种波形单周期的取样示意图
段地址基地址 16位二进制数代表波形的取值
00 000 0
00 001 70
00 010 100
00 011 70
00 100 0
00 101 -70
00 110 100
00 111 -70
01 000 100
01 001 100
01 010 100
01 011 100
01 100 -100
01 101 -100
01 110 -100
01 111 -100
10 000 0
10 001 25
10 010 50
10 011 75
10 100 100
10 101 125
10 110 150
10 111 175
11 000 175
11 001 150
11 010 125
11 011 100
11 100 75
11 101 50
11 110 25
11 111 0
图1-3 函数查找表的设计
三、源程序
module dds(f_clk,p,choice,data);//模块的端口设定
input [15:0] p; //频率控制字
input[1:0] choice; //波形选择变量
input f_clk; //输入时钟信号
output [15:0] data; //波形数值输出
wire [15:0] data;
reg [5:0] addr,address; //波形数值所在地址
reg [15:0] count;
reg f_out; //经P变量频率控制调动后的时钟信号initial
begin
count<=0;
addr<=0;
f_out<=0;
function [15:0]rom; //ROM中各波形数值的设定
input[5:0] address;
case(address) //波形选择
0 : rom = 0; //正弦波
1 : rom = 70;
2 : rom = 100;
3 : rom = 70;
4 : rom = 0;
5 : rom = -70;
6 : rom = -100;
7 : rom = -70;
8 : rom = 100; //方波
9 : rom = 100;
10: rom = 100;
11: rom = 100;
12: rom = -100;
13: rom = -100;
14: rom = -100;
15: rom = -100;
16 : rom = 0; //正三角波
17 : rom = 25;
18 : rom = 50;
19 : rom = 75;
20 : rom = 100;
21 : rom = 125;
22 : rom = 150;
23 : rom = 175;
24 : rom = 175; //负三角波
25 : rom = 150;
26 : rom = 125;
27 : rom = 100;
28 : rom = 75;
29 : rom = 50;
30 : rom = 25;
31 : rom = 0;
default : rom = 10'hxx;
endcase
endfunction
always @(posedge f_clk) //利用计数器count变量实现分频begin
if(count==p) //设置频率控制字
count=0;
f_out=~f_out;
end
else
count=count+1;
end
always@(posedge f_out)
begin
if(addr==7) //波形取8个点,实现波形数据切换addr=0;
else
addr=addr+1;
case(choice) //选择波形
0: address=addr;
1: address=addr+8;
2: address=addr+16;
3: address=addr+24;
endcase
end
assign data = rom(address);//将ROM中对应的数据传递到data端口输出endmodule
四、仿真程序
module test;
wire [15:0] data;
wire [5:0] address;
reg [15:0] p;
reg f_clk;
reg [1:0] choice;
always #10 f_clk = ~f_clk;
initial //波形的初始化
begin
f_clk =0;
p=2; //频率控制字为2时的波形
choice=0;
#1050 choice = 1;//延时,切换波形,使所有波形能够在同一个仿真结果#1500 choice = 2;
#1500 choice = 3;
#1000 p=5; //延时,更换频率
#500 choice=0;
#1050 choice = 1;
#1500 choice = 2;
#1500 choice = 3;
#1000 p=15; //延时,更换频率
#500 choice=0;
#1050 choice = 1;
#1500 choice = 2;
#1500 choice = 3;
end
dds phase (.f_clk (f_clk),.p(p),.choice(choice),.data(data)); //调用dds模块endmodule
五、实验结果。

相关主题