深 圳 大 学 实 验 报 告
课程名称: Verilog使用及其应用
实验名称: 频率可变的任意波形发生器 学院: 电子科学与技术学院
一、 前言
波形发生器是一种数据信号发生器,在调试硬件时,常常需要加入一些信号,以观察电路工作是否正常,在实验与工程中都具有重要的作用。随着电子技术的发展与成熟,电子工程领域对波形发生器的要求越来越高,不仅要求波形发生器具有连续的相位变换,频率稳定等特点,还要求波形发生器可以模拟各种复杂信号,并能做到幅度、频率,相位,波形动态可调。Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
本实验正是基于Verilog HDL语言对波形发生器的功能进行描述,并进行仿真,从而了解与掌握波形发生器的内部工作原理,并进一步熟悉与掌握Verilog HDL语言,将课堂所学知识进行实践。
二、 实验原理
总体设计方案及其原理说明:
图 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位二进制数代表波形的取值
0 70 100 70 0 -70 100 -70 100 100 100 100 -100
01 101
01 110
-100
-100 -100 0 25 50 75 100 125 150 175 175 150 125 100 75 50 25 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
addr
f_out
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)
begin
if(count==p) //方波 //正三角波 //负三角波 //利用计数器count变量实现分频 //设置频率控制字
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
五、实验结果
深 圳 大 学 实 验 报 告
课程名称: Verilog使用及其应用
实验名称: 频率可变的任意波形发生器 学院: 电子科学与技术学院
一、 前言
波形发生器是一种数据信号发生器,在调试硬件时,常常需要加入一些信号,以观察电路工作是否正常,在实验与工程中都具有重要的作用。随着电子技术的发展与成熟,电子工程领域对波形发生器的要求越来越高,不仅要求波形发生器具有连续的相位变换,频率稳定等特点,还要求波形发生器可以模拟各种复杂信号,并能做到幅度、频率,相位,波形动态可调。Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
本实验正是基于Verilog HDL语言对波形发生器的功能进行描述,并进行仿真,从而了解与掌握波形发生器的内部工作原理,并进一步熟悉与掌握Verilog HDL语言,将课堂所学知识进行实践。
二、 实验原理
总体设计方案及其原理说明:
图 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位二进制数代表波形的取值
0 70 100 70 0 -70 100 -70 100 100 100 100 -100
01 101
01 110
-100
-100 -100 0 25 50 75 100 125 150 175 175 150 125 100 75 50 25 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
addr
f_out
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)
begin
if(count==p) //方波 //正三角波 //负三角波 //利用计数器count变量实现分频 //设置频率控制字
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
五、实验结果