verilog期末大作业
- 格式:doc
- 大小:280.00 KB
- 文档页数:11
深圳大学实验报告
课程名称:Verilog HDL及其应用
实验项目名称:波形选择器
学院:电子科学与技术学院
专业:微电子学
指导教师:刘春平
报告人:温志煌学号:2012160228 班级:微电二班实验时间:
实验报告提交时间:
波形选择器
一、实验目的
(1)熟悉Modelsim软件
(2)掌握Modelsim软件的编译、仿真方法
(3)熟练运用Modelsim 软件进行Verilog程序设计开发
二、实验内容及要求
实验原理:在同一个波形里面分别取八个点,用这个八个点的数据还原出对应的波形来,在Verilog中通过建立一个函数分别取这些点数据,然后再通过调用函数得到相对应的波形。
1.实验要求
用Verilog语言设计以下电路,分别产生四种波形:正弦波、方波、三角波1及三角波2。
实验要求先在QuartusII里面编译仿真程序,然后再在Modelsim里面仿真产生这四种波形。
程序仿真结果示意图如图1所示。
图1.四种波形产生及选择器示意图
2.实验步骤
2.1在QuartusII里的操作步骤:
1)建立一个waveshaper的工程文件
2)以Verilog语言书写waveshaper的源程序
3)编译waveshaper源程序
4)最后再仿真一下这个程序,得到与程序相吻合的数据具体如图所示:
图2. Waveshaper源程序
图3. Waveshaper编译成功
图4. Waveshaper 仿真结果
2.2在Modelsim里的操作步骤:
1)建立waveshaper工程
2)添加两个文件waveshaper跟waveshaper_tp到工程3)分别编译这两个文件
4)在work里面查看编译后的设计单元
5)将信号加入波形窗口
6)运行仿真
其源程序如下:
module waveshaper(q,cp,n);
output [7:0] q;
input cp;
input [1:0] n;
reg [7:0] q;
reg [2:0] Q=3'd0;
wire cp,cr;
always @ (negedge cp )
begin
if(cr) Q<=3'd0;
else
Q<=Q+3'd1;
end
always @(Q or n)
begin
case (n)
0: q=romout({n,Q});
1: q=romout({n,Q});
2: q=romout({n,Q}); 3: q=romout({n,Q}); endcase
end
function [7:0] romout; input [4:0] address; case(address)
0 : romout = 85;
1 : romout = 100;
2 : romout = 85;
3 : romout = 50;
4 : romout = 15;
5 : romout = 0;
6 : romout = 15;
7 : romout = 50;
8 : romout = 0;
9 : romout = 30;
10 : romout = 60;
11 : romout = 90;
12 : romout = 120;
13 : romout = 90;
14 : romout = 60;
15 : romout = 30;
16 : romout = 0;
17 : romout = 10;
18 : romout = 20;
19 : romout = 30;
20 : romout = 40;
21 : romout = 50;
22 : romout = 60;
23 : romout = 70;
24 : romout = 0;
25 : romout = 0;
26 : romout = 0;
27 : romout = 0;
28 : romout = 60;
29 : romout = 60;
30 : romout = 60;
31 : romout = 60; default : romout = 8'hxx; endcase
endfunction Endmodule
其测试程序如下:
`timescale 1ns/1ns
`include "waveshaper.v"
module waveshaper_tp;
reg cp;
reg[1:0] n;
wire[7:0] q;
parameter DELY=100;
waveshaper A(q,cp,n); //调用测试对象
always #(DEL Y/2) cp = ~cp; //产生时钟波形
initial
begin //激励信号定义
cp =0;
n=0;
#(DELY*80) n=1;
#(DELY*80) n=2;
#(DELY*80) n=3;
#(DELY*80) $finish;
end
//定义结果显示格式
initial $monitor($time,,,"cp=%d n=%d q=%d", cp,n,q); endmodule
具体的实验步骤图如下:
图5. waveshaper源程序文件
图6. Waveshaper-tp测试程序
两个文件编译成功后在work里面出现:
图7. Work里面的两个文件
三、实验结果及数据分析
在Modelsim里面添加波形后,然后仿真得到的首先是二进制表示的实验结果,然后再在实验结果里改变实验室数据类型,改为波形数据,调整坐标到屏幕中央,得到正弦波、三角波1及三角波2,但是没有出现方波。
由于方波的波形数据调整在另一栏,重新改变波形类型才能出现方波。
其具体的结果图如下:
图8.仿真结果数据显示
图9. 仿真结果波形图(没有调整数据类型)
图10. 仿真的正弦波(n=0)
图11.仿真出来的方波(n=3)
图12. 仿真的三角波1(n=1)
图13.仿真的三角波2(n=2)
数据分析:
仿真时,n是波形选择的关键,n=0时,调用romout函数输出的波形为正弦波;n=1时,输出的为三角波1;n=2时,输出的波形是三角波2;n=3时,调用
romout函数输出方波。
这样就把全部波形选择产生了。
四、心得体会
通过此次实验,我更进一步学习了Verilog语言的编写知识,以及一些常见的编写规则,同时提高了解决编译出错的能力。
此次实验中再次运用Quatlus II 软件编辑,已经熟练掌握这个软件的操作。
在这次实验中最重要也是最关键的就是Modelsim软件的学习与操作,从不会操作到最后将波形成功仿真出来。
这个过程学会了很多东西,测试程序的编写以及编译成功的过程可谓是绞尽了脑汁。
幸好在反复地检查和修改之后,最终编译成功。
同时也发现一个问题,QuatlusII 里面能仿真出来的程序,在Modelsim里面不一定能成功仿真,Modelsim遵循更多规则,输入变量的是必须要有而且是合理的,不能够是端口中的输入、输出。
只有遵循了这些规则,仿真才能做到成功。