引言
一、2 选 1数据选择器的Verilog代码实现和 RTL 电路实现
二、4 选 1数据选择器的Verilog代码实现和 RTL 电路实现
总结
引言
  在数字信号的传输过程中,有时需要从一组输入数据中选出某一个来,比如输入有 “A、B、C、D” 四个数据,那么我们想要哪个字母输出,就可以设置哪个字母输出,这里的设置,即所谓的 “选择开关” ;又或者,你可以理解为多个通道输入到单个通道的输出;于是,数据选择器(Data Selector)或多路开关(Multiplexer)的逻辑电路便应运而生。

一、2 选 1 数据选择器的 Verilog 代码实现和 RTL 电路实现
Plaintext
module Multiplexer(
    input wire a, // 输入数据信号
    input wire b, // 输入数据信号
    input wire sel, // 输入控制信号
    output result // 输出数据信号_已选择
    );

assign result = sel ? a : b;

endmodule
  这是 2 选 1 数据选择器的设计代码,非常简单明了,主要是输入数据 a 和 b,然后通过 sel 信号来选择输出是 a 还是 b。倘若 sel 拉高,即为 “1” 的时候,那么就输出 “a”,反之,倘若 sel 拉低,即为 “0” 的时候,那么就输出 “b”。
  这是一个数据选择器设计,该设计是一个直接用组合逻辑语句或者也可以说是连续赋值语句 assign 的方式描述的电路,其 RTL 电路图如下所示:
forum.jpg
2 选 1 数据选择器的 RTL 电路图

二、4 选 1 数据选择器的 Verilog 代码实现和 RTL 电路实现
Plaintext
module Multiplexer(
    input wire a, // 输入数据信号
    input wire b, // 输入数据信号
    input wire c, // 输入数据信号
    input wire d, // 输入数据信号
    input wire [1:0] sel, // 输入控制信号
    output reg result // 输出数据信号_已选择
    );

   always @(sel, a, b, c, d)
      case (sel)
         2'b00: result <= a;
         2'b01: result <= b;
         2'b10: result <= c;
         2'b11: result <= d;
      endcase

endmodule
  这是一个 4 选 1 数据选择器,基于查找表 LUT(Look Up Table)(查找表在 FPGA 中非常重要,软件思维可以理解为 “索引”,它是 FPGA 芯片架构的重要组成部分,合理利用查找表,能够使你的 FPGA 硬件工程达到一定程度的优化设计)的方式实现的一个电路,其 RTL 电路图如下所示:
forum.jpg
4 选 1 数据选择器的 RTL 电路图

总结
  数据选择器在实际生活中应用广泛。比如,在实际中对选手进行挑选,比如在歌手舞台对 “小洪” 编号为 “a”,对 “小华” 编号为 “b”,然后 “sel” 选择信号就交给 “裁判”,倘若 “小洪” 唱歌功底胜出,那么输出 “a”,反之输出 “b”,是不是很形象呢?!
  所以还是那句话,数字电路模块没有哪一个模块是平白无故添加出来的,每一个数字电路的小模块在实际生活中都有着非常重要的应用,而所有复杂的模块,都是由这些小模块构成的。因此,学好数字电路的基础知识之后,才能翱翔于数字电路的世界中,如果基础知识都学不好的话,那么更复杂的就更不用说了。
  希望大家能够扎实掌握基础知识,从而在数字电路 FPGA 中如鱼得水、游刃有余。