实验一、Verilog 与 ModelSim 基础

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

 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值