亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Verilog
Verilog 4 to 1 多路复用器/Mux

什么是多路复用器或多路复用器?

多路复用器或 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 声明

  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

  1. Verilog 调度语义
  2. Verilog 函数
  3. JK 人字拖
  4. Verilog 纹波计数器
  5. Verilog n 位双向移位寄存器
  6. Verilog 生成块