Verilog期末实验报告波形发生器.docx
《Verilog期末实验报告波形发生器.docx》由会员分享,可在线阅读,更多相关《Verilog期末实验报告波形发生器.docx(14页珍藏版)》请在冰豆网上搜索。
Verilog期末实验报告波形发生器
一、实验目的
使用Verilog软件编写四种波形任意发生器的源代码,用modelsim软件进行仿真测试,进一步强化Verilog,modelsim软件的编程能力为进一步的编程学习打下良好的基础。
二、实验原理
2.1该任意波形发生器要实现三个功能:
(1)通过计数器并结合拼接操作产生四种波形正弦波,方波,三角波1,三角波形的5位数据地址。
(2).设定ROM中对应波形地址地址的8位数值,将所有波形数值存储到ROM中。
(3).设定2位的波形选择开关端口。
2bit
00000~00111
01000~01111
3bitdata[7:
0]
10000~10111
11000~11111
图1整体设计方案
2.2四种波形要在一个周期内等间隔取8个点,定义对应的数据,下图为示意图,由于编程序需要,数据会进行相应的修改。
图2四种波形一个周期内的取样示意图
2.3四种波形数据地址对应的数据的存储器ROM
根据示意图,由于实际情况需要,将正弦波平移至x轴以上,并将所有波形的峰峰值取大100倍。
下表1是ROM存储器
波形选择地址取样点的地址ROM数据
00
000
171
00
001
200
00
010
171
00
011
100
00
100
29
00
101
0
00
110
29
00
111
100
01
000
0
01
001
0
01
010
0
01
011
0
01
100
100
01
101
100
01
110
100
01
111
100
10
000
0
10
001
0
10
010
33
10
011
67
10
100
100
10
101
67
10
110
33
10
111
0
11
000
0
11
001
50
11
010
100
11
011
150
11
100
200
11
101
133
11
110
67
11
111
0
表1ROM存储器
3、实验内容
3.1任意波形发生器verilog程序代码:
modulewave(data,clk,add1,reset);//顶层模块端口定义
output[7:
0]data;
inputclk,reset;
input[1:
0]addr1;
Wire[1:
0]addr1;
wireclk,reset;//输入输出变量定义
ADDR4(addr,clk,addr1,reset);//地址发生器模块调用
rom1(addr,data);//ROM存储器模块调用
endmodule
moduleADDR(addr,clk,addr1,reset);
output[4:
0]addr;
inputclk,reset;
wireclk,reset;
reg[2:
0]addr2;
wire[1:
0]addr1;
reg[4:
0]addr;
initialaddr2=3'b000;//定义计数初值
always@(posedgeclkorposedgereset)//每当有clk,或reset信号开启程序
begin
if(reset)
begin
addr2<=0;//同步复位
addr<=0;
end
elseif(addr2>=7)//addr2计数至7时,addr2复位
begin
addr2<=0;
end
else
begin
addr2<=addr2+1;//addr2由0至7计数
addr<={addr1,addr2};//addr1与addr2地址拼接为addr的最终地址
end
end
endmodule
modulerom(addr,data);//数据存储器模块
input[4:
0]addr;
output[7:
0]data;
function[6:
0]romout;//定义函数,存储32个波形取样点地址的数据
input[4:
0]addr;
reg[4:
0]addr;
wire[7:
0]data;
case(addr)//根据不同地址,得到不同数据。
0:
romout=171;
1:
romout=200;
2:
romout=171;
3:
romout=100;
4:
romout=29;
5:
romout=0;
6:
romout=29;
7:
romout=100;
8:
romout=0;
9:
romout=0;
10:
romout=0;
11:
romout=0;
12:
romout=100;
13:
romout=100;
14:
romout=100;
15:
romout=100;
16:
romout=0;
17:
romout=0;
18:
romout=33;
19:
romout=67;
20:
romout=100;
21:
romout=67;
22:
romout=33;
23:
romout=0;
24:
romout=0;
25:
romout=50;
26:
romout=100;
27:
romout=150;
28:
romout=200;
29:
romout=133;
30:
romout=67;
31:
romout=0;
default:
romout=8'hxx;
endcase
endfunction
assigndata=romout(addr);
endmodule
3.2verilog在quartus软件仿真截图
将代码输入后,建立波形文件,定义输入输出端口后进行仿真。
3.2.1正弦波示意图:
将两位波形选择端设置为00,得出正弦波示意图2
图2
3.2.2.方波示意图:
将两位波形选择端设置为01,得出方波示意图3
图3
3.2.3三角波1示意图:
将两位波形选择端设置为10,得出三角波1示意图4
图4
3.2.4.三角波2示意图:
将两位波形选择端设置为11,得出三角波2示意图5
图5
3.2.5结论:
由上面的四个波形截图可知,在一个周期内,通过不同的波形选择端控制,该程序实现了基本的任意波形产生的功能,产生了正确的波形数据,说明代码编写正确。
3.3modelsim任意波形发生器测试程序仿真
3.3.1任意波形发生器测试程序代码。
`timescale1ns/1ns
`include"wave.v"
modulewave_tp;//测试模块的名字
regreset,clk;
reg[1:
0]addr1;//测试输入信号addr1定义为reg型
wire[7:
0]data;//测试输出信号data定义为wire型
parameterdely=100;
wavefourwave(data,clk,reset,addr1);//调用测试对象
always#(dely/2)clk=~clk;
initial
begin
reset=1;clk=0;addr1=0;
#(dely*200)reset=0;//延迟200dely后先进行复位
#(dely*200)addr1=2'b00;//延迟200dely后测试出正弦波
#(dely*200)addr1=2'b01;//延迟200dely后测试出方波
#(dely*200)addr1=2'b10;//延迟200dely后测试出三角波1
#(dely*200)addr1=2'b11;//延迟200dely后测试出三角波2
#(dely*200)$finish;//
end
endmodule
3.3.2modelsim测试程序仿真截图
将测试程序代码与源程序代码一起输入后进行编译,显示波形如下:
3.3.2.1
正弦波测试图6:
将波形输出格式设为模拟形式,可以看出正弦波的测试图
图6
3.3.2.2
方波测试图7:
将波形输出格式设为离散输出形式,可以看出方波的测试图7
图7
3.2.2.3
三角波1测试图8:
将波形输出格式设为模拟形式,可以看出三角波1的测试图8
图8
3.2.2.4
三角波2测试图9:
将波形输出格式设为模拟形式,可以看出三角波2的测试图9
图9
3.3.3.总结
由上面的四个测试波形截图可知,在一个周期内,通过不同的波形选择端控制,该程序实现了基本的任意波形产生的功能,产生了正确的实验波形,说明代码编写正确。
4、实验总结
4.1遇到的问题和对应的解决措施:
(1)编程过程中没有注意端口定义过程,没有正确理解wire与reg类型的区别。
导致出错(解决办法:
输出端口应设为可变的wire类型)。
(2)一开始拼接操作用错了地方,用在了ROM内部,导致错误。
(解决办法:
应用在加法计数操作后)。
(3)波形数据初值有负数,无法正确显示数字。
(解决办法:
将波形数据平移至x轴以上即可显示正确的波形数据)
(4)一开始我是用拼接操作,有错误,无法正确显示波形数据(解决办法:
通过case语句输入波形选择addr1端口,成功显示了波形)。
4.2收获:
通过这次期末实验,虽然花了较多时间,遇到了许多的难题,但让我进一步认识了Verilog语言的使用,详细了解了整个程序的设计和仿真过程,独立思考并通过很多的调试,摸索和优化实验程序,最终完成实验,锻炼了我设计verilog程序能力,十分感谢刘春平老师的指导和其他同学的帮助。
本课程综合性较强,在实验中涉及了本学期多个知识点:
①always语句;②initial语句;③if—else语句;④case语句;⑤传递函数assign;⑥function说明语句,但都属于我们能掌握的基础内容,很好地促进了我们进一步学习的激情和自信心。