实验一、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