Verilog期末实验报告—波形发生器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、实验目的使用Verilog软件编写四种波形任意发生器的源代码,用modelsim软件进行仿真测试,进一步强化Verilog,modelsim软件的编程能力为进一步的编程学习打下良好的基础。二、实验原理2.1该任意波形发生器要实现三个功能:(1)通过计数器并结合拼接操作产生四种波形正弦波,方波,三角波1,三角波形的5位数据地址。(2).设定ROM中对应波形地址地址的8位数值,将所有波形数值存储到ROM中。(3).设定2位的波形选择开关端口。2bit00000~0011101000~011113bitdata[7:0]10000~1011111000~11111图1整体设计方案2.2四种波形要在一个周期内等间隔取8个点,定义对应的数据,下图为示意图,由于编程序需要,数据会进行相应的修改。图2四种波形一个周期内的取样示意图地址发生器(0-7)正弦波方波三角波1三角波2clkreset波形选择1-111正弦波方波三角波1三角波2yxx88y00yx812.3四种波形数据地址对应的数据的存储器ROM根据示意图,由于实际情况需要,将正弦波平移至x轴以上,并将所有波形的峰峰值取大100倍。下表1是ROM存储器波形选择地址取样点的地址ROM数据000001710000120000010171000111000010029001010001102900111100010000010010010100010110011001000110110001110100011111001000001000101001033100116710100100101016710110331011101100001100150110101001101115011100200111011331111067111110表1ROM存储器三角波2方波正弦波三角波1三、实验内容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存储器模块调用endmodulemoduleADDR(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信号开启程序beginif(reset)beginaddr2=0;//同步复位addr=0;endelseif(addr2=7)//addr2计数至7时,addr2复位beginaddr2=0;endelsebeginaddr2=addr2+1;//addr2由0至7计数addr={addr1,addr2};//addr1与addr2地址拼接为addr的最终地址endendendmodulemodulerom(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;endcaseendfunctionassigndata=romout(addr);endmodule3.2verilog在quartus软件仿真截图将代码输入后,建立波形文件,定义输入输出端口后进行仿真。3.2.1正弦波示意图:将两位波形选择端设置为00,得出正弦波示意图2图23.2.2.方波示意图:将两位波形选择端设置为01,得出方波示意图3图33.2.3三角波1示意图:将两位波形选择端设置为10,得出三角波1示意图4图43.2.4.三角波2示意图:将两位波形选择端设置为11,得出三角波2示意图5图53.2.5结论:由上面的四个波形截图可知,在一个周期内,通过不同的波形选择端控制,该程序实现了基本的任意波形产生的功能,产生了正确的波形数据,说明代码编写正确。3.3modelsim任意波形发生器测试程序仿真3.3.1任意波形发生器测试程序代码。`timescale1ns/1ns`includewave.vmodulewave_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;initialbeginreset=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;//endendmodule3.3.2modelsim测试程序仿真截图将测试程序代码与源程序代码一起输入后进行编译,显示波形如下:3.3.2.1正弦波测试图6:将波形输出格式设为模拟形式,可以看出正弦波的测试图图63.3.2.2方波测试图7:将波形输出格式设为离散输出形式,可以看出方波的测试图7图73.2.2.3三角波1测试图8:将波形输出格式设为模拟形式,可以看出三角波1的测试图8图83.2.2.4三角波2测试图9:将波形输出格式设为模拟形式,可以看出三角波2的测试图9图93.3.3.总结由上面的四个测试波形截图可知,在一个周期内,通过不同的波形选择端控制,该程序实现了基本的任意波形产生的功能,产生了正确的实验波形,说明代码编写正确。四、实验总结4.1遇到的问题和对应的解决措施:(1)编程过程中没有注意端口定义过程,没有正确理解wire与reg类型的区别。导致出错(解决办法:输出端口应设为可变的wire类型)。(2)一开始拼接操作用错了地方,用在了ROM内部,导致错误。(解决办法:应用在加法计数操作后)。(3)波形数据初值有负数,无法正确显示数字。(解决办法:将波形数据平移至x轴以上即可显示正确的波形数据)(4)一开始我是用拼接操作,有错误,无法正确显示波形数据(解决办法:通过case语句输入波形选择addr1端口,成功显示了波形)。4.2收获:通过这次期末实验,虽然花了较多时间,遇到了许多的难题,但让我进一步认识了Verilog语言的使用,详细了解了整个程序的设计和仿真过程,独立思考并通过很多的调试,摸索和优化实验程序,最终完成实验,锻炼了我设计verilog程序能力,十分感谢刘春平老师的指导和其他同学的帮助。本课程综合性较强,在实验中涉及了本学期多个知识点:①always语句;②initial语句;③if—else语句;④case语句;⑤传递函数assign;⑥function说明语句,但都属于我们能掌握的基础内容,很好地促进了我们进一步学习的激情和自信心。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功