实验一 Verilog HDL语法及ModelSim仿真
【实验目的】通过实验,掌握《可编程逻辑器件及其应用》课上讲过的如下内容:
1. 使用ModelSim仿真软件复习Verilog HDL基本语法、仿真指令;
2. 掌握组合逻辑、时序逻辑的Verilog HDL代码风格;
3. 学会编写testbench(测试向量)代码,能熟练使用testbench对module进行测试,摆脱以前形成的用波形测试电路的惯性。
【实验方法】温习课件上Verilog HDL语法、ModelSim软件操作介绍部分,按照实验手册要求,在ModelSim平台下完成Verilog HDL语言实践。(ModelSim完整的帮助在软件主菜单:Help->SE Documentation->PDF Bookcase或Info Hub->ModelSim SE User's Manual.pdf中。)
【考核方法】实验完成后,将设计文件、软件输出结果、仿真波形等整理成实验报告(不用贴全部代码,选几段自己满意的代码即可)。课程结束后,四个实验报告装订好封皮,一起上交,时间截止到5月10日。
【实验内容】
一、ModelSim仿真平台搭建
1. 安装Mentor ModelSim SE 10.1b软件,配置License;
2. 新建空白工程,将被测的组合逻辑模块mux.v与测试向量tstmux.v加入工程,体会测试向量模块如何产生输入激励和查看输出信号;
3. 对模块进行测试,得到仿真波形,熟悉ModelSim各窗口功能和操作流程;
二、复习Verilog HDL语法
1. 复习算术及逻辑运算符语法:将讲义第5节各段代码(P57~P66)依次放进ModelSim工程,进行仿真,查看输出结果,比较其是否与期望值相符;
2. 复习阻塞与非阻塞赋值语法,将讲义第6节的各段代码改写成完整模块,放进ModelSim工程中仿真,查看输出结果;
3. 复习仿真系统任务函数,将讲义第7节的各模块放进ModelSim进行仿真,查看仿真结果,判断是否与期望值相符;
三、设计实践
设计一个闰年判断模块,4位数的年份以压缩BCD码的形式存放在两个字节中,设计完成后编写测试向量对闰年模块进行测试,测试向量要覆盖闰年的几种类型。
后面附了一个闰年判断模块供参考,请先独立思考。
四、安装XILINX ISE软件
因为ISE软件体积巨大,这次做实验的同时,把下次实验课要用到的ISE Design Suite 14.4软件在后台装好。实验室机器已经安装了ISE 12.2,但有些机器上软件运行有问题,先检查一下。
附:
1. mux.v文件内容:
module mux(out, a, b, sel); input a, b, sel; output out; reg out; always @(a or b or sel) if (!sel) out = a; else out = b;endmodule
2. tstmux.v文件内容
//`include ”mux2.v”
module tstmux;
reg ain, bin, sel_in;
reg clock;
wire outw;
initial
begin //初始化寄存器变量
ain = 0;
bin = 0;
sel_in = 0;
clock = 0;
end
always #50 clock = ~clock; //产生周期100个单位时间的时钟信号clock
always @ (posedge clock)
begin
ain = {$random} %2; //$系统函数
#3 bin = {$random} %2;
end
always #10000 sel_in = ! sel_in; //产生周期10000仿真单位时间的选通信号变化
mux m(.out(outw), .a(ain), .b(bin), .sel(sel_in)); //模块实例化,连接端口
endmodule;
3. 闰年计算的Verilog HDL代码
module leapyear(is, y3,y2,y1,y0); //BCD, year=y3*1000+y2*100+y1 *10+y0
input [3:0]y3,y2,y1,y0;
output is;
reg is;
always @ (y3 or y2 or y1 or y0)
begin //mn: m=1 n=2/6; m=2 n=0/4/8
if ((y3[0]==1'b1) &&((y2==4'b0010)||(y2==4'b0110)) && (y1==4'b0000) && (y0==4'b0000)) //400,m=odd
is = 1'b1;
else if ((y3[0]==1'b0) &&((y2==4'b0)||(y2==4'b0100)||(y2==4'b1000)) && (y1==4'b0000) && (y0==4'b0000))//400,m=even
is = 1'b1;
else if ((y1[0]==1'b1) &&((y0==4'b0010)||(y0==4'b0110))) //4 but not 100
is = 1'b1;
else if ((y1[0]==1'b0) &&((y0==4'b0000)||(y0==4'b0100)||(y0==4'b1000))&& ({y1,y0}!=8'b0) ) //4 but not 100
is = 1'b1;
else
is = 1'b0;
end
endmodule
本文来源:https://www.2haoxitong.net/k/doc/c44744dc168884868662d601.html
文档为doc格式