实验一、Verilog 与 ModelSim 基础

您所在的位置:网站首页 4选1数据选择器verilog测试文件 实验一、Verilog 与 ModelSim 基础

实验一、Verilog 与 ModelSim 基础

2024-07-10 12:09| 来源: 网络整理| 查看: 265

实验一、Verilog 与 ModelSim 基础

一、实验目的:

熟悉并掌握 Verilog HDL 与 ModelSim 的使用

二、实验环境:

ModelSim

三、实验内容:

学习使用 Verilog 完成 4 选 1 多路选择器的设计和实现,并使用 ModelSim 工具对设计进

行仿真和分析验证。

四、实验原理

多路选择器(MUX)是一种在多路数据传送过程中,能够根据需要将其中任意一路选 出来的电路,其原理图和真值表如下图所示。

图 1 4 选 1 多路选择器及其真值表

五、实验内容(步骤)

5.1、Verilog 关键代码实现

选择输入

数据输入

输出

select

in1

in2

in3

in4

out

00

in1

×

×

×

in1

01

×

in2

×

×

in2

10

×

×

in3

×

in3

11

×

×

×

in4

in4

3 / 27

表 1. MUX 模块功能描述

MUX 模块的 verilog 代码如下:

输入

4 位输入信号 in1、in2、in3、in4 和 2 位选择信号 select

输出

4 位输出信号 out

功能

根据选择信号 select 的值把相应输入信号赋值给 out 输出

5.2、测试文件(TestBench)关键代码描述

4 / 27

5.3、ModelSim 仿真及分析5.3.1 建立 ModelSim 工程

打开 ModelSim,选择 File->New->Project,出现 Create Project 对话框,填写工程名 (Project Name),选择保存目录(Project Location),注意保存目录中不要有中文,如下 图所示:

5 / 27

单击 OK 按钮后,会出现下图界面:

现在可以选 Create New File(新建文件)或者 Add Existing File(添加已存在文件)。这里 我们选择 Add Existing File,也就是添加 5.1 和 5.2 中的 Verilog 代码,会出现下图界面:

点击 Browse 按钮,添加 5.1 中的 mux41.v 和 5.2 中的测试文件 mux41_tb.v,会出现下图6 / 27

界面:

选择要添加的文件后,单击“打开”按钮,即添加完成,会出现下图界面,在其中选择 copy to project directory,这样就会将 mux41.v 和 mux41_tb.v 文件复制到新的工程目录下,单击OK 按钮。

文件添加完成后,ModelSim 主界面会显示所有文件的状态。选中任意一个文件,右键单击, 选择 Compile->Compile All,即开始编辑所有文件,会出现下图界面。没有出错,文件状态 应该都是绿色的对号,否则点击屏幕下方的 Transcript,查看出错信息,直至无误。

7 / 27

5.3.2 开始仿真 切换到 Library,然后展开 work 目录,在 mux41_tb.v 文件上单击右键,在弹出菜单中

选择 Simulate (without Optimization),如下图界面:

8 / 27

此时会出现一个名为 sim 的界面,展开其中的 mux41_tb 节点,选择 uut,会在 Objects 窗 口显示所有信号,如下图所示:(若没有出现 Objects 窗口,可以通过菜单 View->Objects调出该窗口)

选择 Objects 窗口的所有信号(Ctrl+A),然后单击右键,在弹出菜单中选择 Add to->Wave->Selected Signals,如下图所示:

单击工具栏中的 Run-All 按钮,便开始仿真,如下图所示:

仿真效果图,如下图所示:

9 / 27

图 X. 多路选择器仿真结果

结束后,请在 Transcript 中输入 quit –sim 命令退出,如下图所示:

六、进一步实验

请使用 Verilog 完成 4 位全加器、8 位比较器、74138 译码器等模块设计,然后编写测试 文件使用 ModelSim 进行仿真验证。

//4位全加器 module fulladder( input wire [3:0] A, B, input wire Cin, output reg [3:0] S, output reg Cout ); always@* begin {Cout, S} = A + B + Cin; end endmodule //8位比较器 module comparer( input wire [7:0] A, B, input wire [2:0] in, output reg [2:0] out ); always@* begin if(A > B) out = 3'b001; else if(A < B) out = 3'b100; else out = 3'b010; end endmodule //74138译码器 module decoder74138( input wire [2:0] E, input wire A, B, C, output reg [7:0] Y ); always@* begin if(E == 3'b001) case({C, B, A}) 3'b000: Y = 8'b11111110; 3'b001: Y = 8'b11111101; 3'b010: Y = 8'b11111011; 3'b011: Y = 8'b11110111; 3'b100: Y = 8'b11101111; 3'b101: Y = 8'b11011111; 3'b110: Y = 8'b10111111; 3'b111: Y = 8'b01111111; default: Y = 8'bxxxxxxxx; endcase else Y = 8'b11111111; end endmodule

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3