前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA学习altera系列: 第六篇 二选一多路选择器的设计及仿真测试

FPGA学习altera系列: 第六篇 二选一多路选择器的设计及仿真测试

作者头像
FPGA技术江湖
发布2020-12-29 16:16:23
1.2K0
发布2020-12-29 16:16:23
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19+,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。

在数字电路中,二选一多路选择器具备组合逻辑电路的简单性和经典性的特征,我们的第一个设计就从“它”开始。

工程名称为“mux2_1”,架构图如下:


端口描述:

输入:a、b、s。

输出:c。


功能描述:

当“s”为高电平时,“c”等于“a”;当“s”为低电平时,“c”等于“b”;

Verilog代码实现:

代码语言:javascript
复制
/*
模块名称:mux2_1
模块功能:当“s”为高电平时,“c”等于“a”;当“s”为低电平时,“c”等于“b”;
作者:郝旭帅
邮箱:746833924@qq.com
*/
module mux2_1 (a, b, s, c);

    input a;
    input b;
    input s;

    output reg c;

    always @ (*)
        begin
            if (s)
                begin
                    c = a;
                end
            else
                begin
                    c = b;
                end
        end

endmodule

这段代码很简单,相信小伙伴们自己能理解。如果有问题的话,可以发邮件到我的邮箱或者在“QQ交流群173560979”里面询问,我会及时回复大家。

写完了“二选一多路选择器”的代码,我们可以去检查一下代码是否有语法错误,点击:,快捷键是:Ctrl + K。

如果出现语法错误,我们要去修改代码并且再一次检查语法,直到不再有错误。虽然语法错误没有了,但是逻辑是否正确呢?这些还是不得而知的。写上一段激励,通过modelsim来查看我们的波形是否正确。

首先新建一个verilog文件,名称为“mux2_1_tb”(在复杂设计中有很多的设计文件,并且都需要去测试。笔者建议:对那个模块测试,激励的名称就叫做“<测试模块名称>_tb”)。

激励的代码如下:

代码语言:javascript
复制
/*
模块名称:mux2_1_tb
模块功能:为mux2_1提供输入信号 
作者:郝旭帅
邮箱:746833924@qq.com
*/
`timescale 1ns/1ps

module mux2_1_tb;

  reg a;
  reg b;
  reg s;

  wire c;

  initial begin
    a = 1'b0;
    b = 1'b1;
    s = 1'b0;
    # 50
    a = 1'b0;
    b = 1'b1;
    s = 1'b1;
    # 50
    a = 1'b1;
    b = 1'b0;
    s = 1'b0;
    # 50
    a = 1'b1;
    b = 1'b0;
    s = 1'b1;
    # 50
    $stop;
  end
  
  mux2_1 mux2_1_dut(
      .a(a),
      .b(b),
      .s(s),
      .c(c)
    );

endmodule

上述代码就是mux2_1的测试代码,大家写完之后也要去检测代码是否有语法错误。下面笔者来一一解释激励中的各个语句都是什么意思:

1. 时标:`timescale 1ns/1ps

1) 前面的”`”是Esc键下面的键(和波浪线为同一键)。

2) “/”前面的1ns 为时间单位。

3) “/”后面的1ps为时间精度。

深入理解时标的意义:在激励中,有很多的 “# xx“,代表的意思是:延时xx ns。那么时间精度是什么呢?这个我们可以看看自己的存款余额,例如:100.21元。单位是:元,精度是:0.01元(也可以理解为:分)。对比一下,是不是一下子就理解了呢。但是,要注意,精度不能比单位大。

2. 模块开始和结束

代码语言:javascript
复制
module mux2_1_tb;

endmodule

激励是不需要有端口的,所有的信号自己内部产生,然后连接到我们要测试的设计上。

3. 定义的变量

代码语言:javascript
复制
reg a;
reg b;
reg s;

wire c;

将设计的输入定义成reg的类型(在initial模块中赋值必须是reg类型),我们在激励当中对它们赋值,然后传输到设计当中。

将设计的输出定义成wire的类型,连接到设计的输出端口,在modelsim中查看输出波形是否正确。

4.上电过程

代码语言:javascript
复制
initial begin
    a = 1'b0;
    b = 1'b1;
    s = 1'b0;
    # 50
    a = 1'b0;
    b = 1'b1;
    s = 1'b1;
    # 50
    a = 1'b1;
    b = 1'b0;
    s = 1'b0;
    # 50
    a = 1'b1;
    b = 1'b0;
    s = 1'b1;
    # 50
    $stop;
end

initial 模块是顺序执行的。我们通过延时将输入在不同的时间段赋不同的值。”1’b1”:前面的“1“代表1bit,”‘b“代表用二进制表示(这个” ’“是单引号,一定要和`tiemscale的”`“区分开),后面的”1“代表高电平。$stop 是仿真的停止命令,具体的意思:当运行这个地方的时候,仿真自动停止(如果有不明白的小伙伴,可以查看后续章节)。

5. 设计例化并连线

代码语言:javascript
复制
mux2_1 mux2_1_dut(
      .a(a),
      .b(b),
      .s(s),
      .c(c)
    );

例化方式笔者在《FPGA学习系列 altera 系列 第五篇 verilog基础语法》中有介绍。

上述就是二选一多路选择器激励的分析,如果还是有不明白的小伙伴可以发邮件到我邮箱或者加群询问。

END

制作人:郝旭帅

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档