数据选择器,通常也称为多路选择器(或干脆称为多路器),其功能是通过对输入信号的“选择”或控制,使多路输入信号中只能有一路对外输出。多路器有N路数据输入信号, 路选择信号,还有一路输出。在操作过程中,选择信号决定哪一路输入信号可以输出,该路输入信号的电平是什么样的,输出信号电平也是什么样的。所有未被选中的输入信号都将被忽略。比如,如果一个4选1多路器的两路选择信号S1和S0分别为‘1’和‘0’,那么输出信号就是第2路的输入信号。
通常,多路器都是2选1(1个选择信号),4选1(2个选择信号),以及8选1(3个选择信号)。图中的真值表描述了一个4选1多路器的行为。注意,要在真值表中使用键值变量-因为如果不使用键值变量的话,那么就需要6列和 或64行。一般情况下,都使用键值真值表来描述电路,“控制”信号作为每一列的列头变量,而数据输入信号作为键值变量。


这样,通过对控制信号的增减,就可以很方便的修改有不同输入信号的多路器真值表。将真值表中的信息转化到K图中,就可以设计出一个最简化的多路器,或是根据真值表直接写出SOP等式。4选1多路器的最简化等式如下:
.gif)
一个N输入的多路器就是一个简单的SOP电路,由N个与门构成,且每个与门都有 个输入,最后是一个信号输出或门。每个与门由 个选择信号和1个数据输入信号组成,这样每次只会有一个与门的输出有效。而或门的作用就是将这些与门的输出组合在一起。比如,在4输入多路器中选择输入信号I2,那么两路选择信号就要设置为S1=1,S2=0。这样,输入的与运算就是使用一个三输入的与门,且输入信号为S1,非(So)以及I2。
通常,多路器电路中会对其它输入信号附加上一个输入使能信号。输入使能功能作为一种全局的开关。当使能信号无效时,输出全为‘0’,打夯使能信号有效时,执行正常的多路器操作。
大型多路器可以很容易的用小型多路器来构造。比如,一个8选1多路器就可以用两个4选1多路器和一个2选1多路器构造。其中,4选1多路器的输出是作为2选1多路器的输入,并且用最终的选择信号来选定2选1多路器中的输入信号。
多路器在数字电路中的用途一般是在计算机系统中,将数据从存储阵列中传送到数据处理电路中。在这一应用中,内存地址线连接在多路器的选择信号线上,内存地址单元中的内容放在多路器的数据输入端(多路器的这一应用将在后面处理内存系统的实验中讨论到)。由于计算机系统中很多数据单元都是用字节或字表示的,字节为8比特,字为16比特,双字为32比特,那么计算机系统的多路器也要能够一次性切换8,16或32路信号。可以同时切换很多总线的多路器就称为“总线多路器”。如下原理图所示,该总线多路器可以从4路8-比特单元中选择一路输出

由于多路器最普通的应用已经超出了我们目前的讨论,所以我们先考虑一个不太通用的,有一点演示性质的应用。考虑一个给定逻辑功能的K图描述,其中每一个K图单元含有“0”或“1”,或一个键值变量表达式。每一种K图索引变量的唯一性组合都可以选定一个K图单元(比如,一个8单元的K图,如果A=1,B=1,C=0,那么就选定了单元6)。现在考虑一个多路器,选择信号的唯一性组合可以选择特定的数据输入通过输出(比如,一个8输入多路器如果其选择信号设置为A=1,B=1,C=0,那么选定了I6作为输出信号)。这样,如果给定逻辑功能中的输入信号就是多路器中的选择输入信号,那么也一定是K图中的索引变量。这样,K图中的每个单元都对应到了多路器中指定的数据输入上。这就意味着,可以通过将K图中的单元内容连接到多路器的输入线上,将K图中的索引变量连接到多路器的选择信号线上来搭建出多路器逻辑功能。当K图单元中含有0,其相应的多路器数据输入连接到0(或是地);当K 图单元中含有1,其相应的多路器数据输入连接到1(或是Vdd);如果K图单元中含有的是键值变量表达式,那么执行该表达式的电路就会连接到相应的多路器输入端。注意,当从真值表或K图中直接搭建多路器电路时,不需要最简化逻辑。这样就节省了时间,但是又会构造出一个低效率的电路(这是一个所有工程规则中都存在的经典权衡问题)。也要注意,K图中包含有键值变量,多路器也可以很好的工作。
如下例做示,多路器也可以很方便的用行为性的VHDL来描述,只要使用一个selected信号赋值表达式就可以了。左边的样例代码是多路器用于逻辑信号的开关,右边的样例代码是一个8-比特总线多路器。注意代码中唯一的不同就是端口表达式,总线多路器在这里将数据元素申明为了矢量信号,而不是单个信号。也要注意在总线多路器样例中,矢量信号的赋值表达式等同于一般信号的赋值表达式。仔细阅读该代码样例,尤其是总线多路器代码,然后再看前面的原理图,最后考虑并对比一下用原理图法创建总线多路器和用VHDL代码创建总线多路器的所需要的效率。

VHDL源代码可以用于搭建更为复杂的合路电路,比如将原有的输出经过任意的逻辑功能变换再输出,如下图所示。后面我们将看到,这一类的电路经常出现在处理电路的内核。

使用了条件赋值表达式的多路器VHDL代码