什么是多路复用器或多路复用器?
多路复用器或 mux 简而言之,是一个数字元件,它根据选择信号将数据从 N 个输入之一传输到输出。下面显示的情况是当 N 等于 4 时。例如,一个 4 位多路复用器将有 N 个输入,每一个 4 位,其中每个输入都可以通过使用选择信号传输到输出。
sel 是一个 2 位输入,可以有四个值。选择线上的每个值都允许将其中一个输入发送到输出引脚。
sel a b c d out 0 3 7 1 9 3 1 3 7 1 9 7 2 3 7 1 9 1 3 3 7 1 9 9
4x1 多路复用器可以通过多种方式实现,这里您将看到两种最常见的方式:
- 使用
assign
声明 - 使用
case
声明
使用assign
声明
module mux_4to1_assign ( input [3:0] a, // 4 位输入称为 a input [3:0] b, // 4-位输入称为 b input [3:0] c, // 4 位输入称为 c input [3:0] d, // 4 位输入称为 d input [1:0] sel, // 输入 sel 用于在 a,b,c,d 输出 [3:0] 输出之间进行选择); // 基于输入 sel 的 4 位输出 // 当 sel[1] 为 0 时,(sel[0]? b:a) 被选中,当 sel[1] 为 1 时,(sel[0] ? d:c ) 被采用 // 当 sel[0] 为 0 时,a 被发送到输出,否则 b 并且当 sel[0] 为 0 时,c 被发送到输出,否则 d 分配 out =sel[1] ? (sel[0] ? d :c) :(sel[0] ? b :a);结束模块
名为 mux_4x1_assign 的模块 有 4 个 4 位数据输入、1 个 2 位选择输入和 1 个 4 位数据输出。多路复用器将使用 assign
根据选择信号 sel 选择 a、b、c 或 d 声明。
使用case
声明
请注意,信号输出被声明为 reg
类型,因为它用于过程 像 always
一样阻塞 .
module mux_4to1_case ( input [3:0] a, // 4 位输入称为 a input [3:0] b, // 4-位输入称为 b input [3:0] c, // 4 位输入称为 c input [3:0] d, // 4 位输入称为 d input [1:0] sel, // 输入 sel 用于在 a,b,c,d 输出 reg [3:0] out 之间进行选择); // 基于输入 sel 的 4 位输出 // 每当 a/b/c/d/sel 更改值时,都会执行此始终块 // 当发生这种情况时,根据 sel 中的值,将输出分配给 a/b/ c/d 总是@(a 或 b 或 c 或 d 或 sel) 开始 case (sel) 2'b00 :out <=a; 2'b01 :out <=b; 2'b10 :out <=c; 2'b11 :出 <=d; endcase endendmodule
名为 mux_4x1_case 的模块 有 4 个 4 位数据输入、1 个 2 位选择输入和 1 个 4 位数据输出。多路复用器将使用 case
根据选择信号 sel 选择 a、b、c 或 d 声明。
硬件原理图
两种类型的多路复用器模型都合成到相同的硬件中,如下图所示。
测试平台
模块 tb_4to1_mux; // 声明内部 reg 变量以驱动设计输入 // 声明线信号以收集设计输出 // 声明用于测试平台 reg [3:0] a; 的其他内部变量; reg [3:0] b; reg [3:0] c; reg [3:0] d;电线 [3:0] 输出; reg [1:0] sel;整数 i; // 实例化其中一个设计,在这种情况下,我们使用了带有 case 语句的设计 // 将上面声明的测试平台变量与设计中的变量连接起来 mux_4to1_case mux0 ( .a (a), .b (b), .c ( c)、.d(d)、.sel(sel)、.out(out)); // 这个初始块是刺激初始开始 // 在后台启动监视器以显示值以在 a/b/c/d/sel/out 更改时记录 $monitor ("[%0t] sel=0x%0h a=0x%0h b=0x%0h c=0x%0h d=0x%0h out=0x%0h", $time, sel, a, b, c, d, out); // 1. 在时间 0,将随机值驱动到 a/b/c/d 并保持 sel =0 sel <=0; a <=$random; b <=$random; c <=$random; d <=$random; // 2. 每 5ns 改变一次 sel 的值 for (i =1; i <4; i=i+1) begin #5 sel <=i; end // 3. Step2结束后,等待5ns,完成模拟#5 $finish;结束模块
仿真日志 ncsim> run[0] sel=0x0 a=0x4 b=0x1 c=0x9 d=0x3 out=0x4[5] sel=0x1 a=0x4 b=0x1 c=0x9 d =0x3 out=0x1[10] sel=0x2 a=0x4 b=0x1 c=0x9 d=0x3 out=0x9[15] sel=0x3 a=0x4 b=0x1 c=0x9 d=0x3 out=0x3Simulation 通过$完成在 20 NS + 0 时间完成(1)
Verilog