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

2020-12-29 16:16:23 浏览数 (1)

大侠好,欢迎来到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

制作人:郝旭帅

0 人点赞