FPGA波形发生器实验报告Word文档格式.docx
- 文档编号:19056250
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:19
- 大小:348.18KB
FPGA波形发生器实验报告Word文档格式.docx
《FPGA波形发生器实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《FPGA波形发生器实验报告Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
参考频率为f_clk;
相位累加器的长度为N位,输出频率f_out为:
F_out——输出信号的频率;
N————相位累加器的位数;
△P———频率控制字(步长);
F_clk——基准时钟频率。
1、系统总体设计方案框架图:
FPGA
图1-1系统总体设计方案
2、四种波形单周期的取样示意图:
3、本实验采用每个周期取样16次,以便产生的波形更加的平滑。
函数查找表的设计:
(十进制)
地址(8位二进制)
rom的值
120
1
165
2
204
3
230
4
240
5
6
7
8
9
74
10
35
11
12
13
14
15
地址
16
17
18
19
20
21
22
23
24
250
25
26
27
28
29
30
31
32
33
60
34
90
36
150
37
180
38
210
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
61
62
63
4、程序思路
1)分频器控制读取rom的步长,通过输入变量改变分频器计数器的计数总量,控制分频实验频率可调。
2)制作rom,通过一个函数实现,给函数输入一个地址,通过case语句输出一个值。
3)波形选择,同个if语句选择地址计数器输出的值,从而输出四种不同的波形
4)锁相环(附加),调用FPGA芯片集成的锁相环模块,让输出的相位更加的稳定。
5)调幅(附加),通过在rom的值除以不同的值来控制改变输出信号的幅度。
三、程序及具体方法注释
moduledds_ver(
clk_50MHz,fout,change,freq,key0
);
inputclk_50MHz;
//输入50MHz的全局时钟
input[1:
0]change;
//定义输入变量,用来切换输出波形,一共4个档位
input[2:
0]freq;
//定义输入变量,用来改变输出信号的频率,一共8个档位
output[7:
0]fout;
//输出8为rom的值,用来驱动DA转化芯片,输出波形
inputkey0;
//定义输入变量,用来改变幅值计数器的值,从而改变幅值
//调用FPGA芯片集成的锁相环模块,让输出的波形相位更稳定
pllpll_inst(
.inclk0(clk_50MHz),
.c0(clk_pll)
wire[7:
//分频功能,根据输入变量的不同实现不同的分频,用于读取rom的步长
regclk;
reg[15:
0]cnt;
always@(posedgeclk_pll)//利用计数器实现任意分频
begin
if(cnt==(50*(freq+1)))//设定频率控制字节
begin
cnt=0;
clk=~clk;
end
else
cnt=cnt+1;
end
//调幅功能,输入key0更变计数器cntvol的值,从而更变输出信号的幅度
reg[2:
0]cntvol;
always@(negedgekey0)
if(cntvol>
=1&
&
cntvol<
7)
cntvol<
=cntvol+1'
d1;
elsecntvol<
=1'
b1;
//地址累加器,实现地址的分段累加,从而实现四种不同波形的切换输出
reg[5:
0]addr;
always@(posedgeclk)
if(change==0)
begin
if(addr>
=0&
addr<
15)//切换正弦波
addr=addr+1;
else
addr=0;
end
elseif(change==1)
begin
=16&
31)//切换方波
addr=16;
elseif(change==2)
=32&
47)//切换正三角波
addr=32;
elseif(change==3)
=48&
63)//切换反三角波
addr=48;
end
//制作rom的函数
function[7:
0]rom;
input[63:
0]address;
case(address)
0:
rom=120/cntvol;
//正弦波的rom值
1:
rom=165/cntvol;
2:
rom=204/cntvol;
3:
rom=230/cntvol;
4:
rom=240/cntvol;
5:
6:
7:
8:
9:
rom=74/cntvol;
10:
rom=35/cntvol;
11:
rom=9/cntvol;
12:
rom=0/cntvol;
13:
14:
15:
16:
rom=10/cntvol;
//方波的rom值
17:
18:
19:
20:
21:
22:
23:
24:
rom=250/cntvol;
25:
26:
27:
28:
29:
30:
31:
32:
rom=30/cntvol;
//正三角波的rom值
33:
rom=60/cntvol;
34:
rom=90/cntvol;
35:
36:
rom=150/cntvol;
37:
rom=180/cntvol;
38:
rom=210/cntvol;
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
//反弦波的rom值
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
endcase
endfunction
assignfout=rom(addr);
////把读到的rom的值赋给输出端口,输出驱动DA转换芯片
endmodule
四、实验结果及分析
1、QuartusII仿真结果
2、下载到DE2实验板连接到DVCC试验箱用示波器显示输出的各种波形图
1)输出正弦波
2)输出正弦波频率调节
3)输出正弦波幅值调节
4)输出方波
5)输出正三角波
6)输出正三角波
3、结果分析
通过仿真和搭建实验平台。
成功完成了实验设计的要求
输出波形有很严重的锯齿现象,但是基本上显示出了完整的波形,实现了设计的波形切换输出、频率可调和幅值可调,前后比较了没有加入锁相环和加入锁相环模块输出波形的质量,加入锁相环值之后波形稳定很多。
输出波形的质量只要取决于信号周期取样的频率,取样点越多输出波形的失真越小,当然跟取样点的准确性也有很大关系,但是rom的值是通过MATLAB产生的,准确性很高。
为了验证这个结论,决定每个信号周期取256个点(8为DA转换最大取样点256个)再进行实验,观察实验结果。
输出波形质量明显提高。
实验结果波形图如下:
1)正弦波
2)方波
3)三角波
4)锯齿波
说明:
由于觉得正三角波和反三角波只是相位上相差180度,显示出来的波形没有区别,这是由于采用取值法决定的,取值是包括了DA输出负值的点,所以没有正三角波和负三角波在显示上占有180度相位差的区别。
所以把反三角波改成输出锯齿波。
(这只是取样点不同,没有本质其别)当然,这些输出信号也是可以调节频率和幅度的。
五、实验结论:
经过不断的试验,最终完成了该实验设计的基本要求,输出四种不同的波形实现信号频率可调,并且在此基础上调用了锁相环技术,增加了输出信号幅度可调。
经过测量显示输出波形信号稳定。
通过该信号发生器的设计,学习和掌握了DA转换,更加熟练地使用Verilog语言描述硬件电路和信号的输出,也更加熟练地掌语言编写过程中的握数据的控制、运用quartusII仿真和调用modelsim仿真。
熟悉软件在编译过程中出现的错误和排除这些错误。
在搭建实验平台的过程中,由于没有使用过DVCC实验箱,所以遇到麻烦,开始没有使DE2板和DVCC试验箱共地,所以输不出波形,但是有些同学没有共地也能输出波形,而我试验之后发现我的实验平台只有共地才能输出完整波形,理论上也是需要所有的实验系统共地才不会影响信号完整性输出的。
编写代码时应该细分代码实现的功能,从很小的一个功能部分开始编写,不能全部一起编写,要先编写一小部分进行仿真。
测试成功之后再编写下一个功能模块,最好能使用模块化设计,以功能分开编写,分别测试。
一步步实现功能。
如果没有细分的话,容易出问题,而且出现问题也不知道是哪一小部分,无从排除。
发现编写实现相同的不同代码占有FPGA的逻辑单元也大小不一,通过对语言的简化可以节省很多逻辑单元。
觉得硬件编程的最高境界应该是“用最简单的语言描述最复杂的硬件”。
六、意见与建议:
希望老师在下学期的可编程ASIC设计课程中更加具体的讲Verilog解语言的本身和数据流的控制。
建议老师也简单讲下其他语言,如VHDL。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 波形 发生器 实验 报告