MUX và DEMUX: chọn đường dữ liệu, không giữ dữ liệu

Khoảng 45 phútMức 1/3Bản nháp: một số khẳng định chưa đối chiếu spec

Sau bài này bạn sẽ

  • Đọc ánh xạ select của mux và xây một cây chọn
  • Phân biệt mux, demux và decoder theo vai trò tín hiệu
  • Tạo một hàm nhỏ bằng dữ liệu mux lấy từ bảng chân trị

Một đầu ra đang lấy dữ liệu từ đâu?

Một khối cần chọn một trong bốn nguồn để đưa tới đầu ra. MUX, hay multiplexer, làm việc chọn đó; hai bit select chỉ ra nguồn có số thứ tự từ 0 tới 3.

DEMUX làm việc ngược về hướng phân phối: một đầu vào được chuyển tới một trong nhiều đầu ra. Hai khối đều là tổ hợp trong bài này; không tự lưu giá trị của lượt chọn trước.

Đọc select theo đúng thứ tự bit

Với mux 4:1, gọi select là S1/S0, S1 là bit cao. Mỗi nguồn dữ liệu có thể là một bit hoặc một bus cùng độ rộng.

S1 S0 Đầu ra lấy từ
0 0 D0
0 1 D1
1 0 D2
1 1 D3

Mux 2:1 có biểu thức Y=S'·D0+S·D1. Thay S bằng 0 sẽ chặn nhánh D1; thay S bằng 1 sẽ chặn nhánh D0.

Một mux chọn giữa bốn bus tám bit vẫn chỉ cần hai bit select. Số nguồn quyết định số bit chọn; độ rộng mỗi nguồn quyết định số lane dữ liệu.

Ghép mux nhỏ thành cây

Mux 4:1 có thể dựng từ ba mux 2:1. Tầng đầu dùng S0 chọn trong cặp D0/D1 và D2/D3; tầng sau dùng S1 chọn giữa hai kết quả.

Mux 8:1 có thể dùng hai mux 4:1 và một mux 2:1. Các bit thấp chọn trong mỗi nửa, bit cao chọn nửa. Với số nguồn là lũy thừa hai, một cây 2:1 đầy đủ có N-1 mux và log2(N) tầng chọn.

Nếu có sáu nguồn thì cần ít nhất ba bit select, nhưng còn hai mã chưa dùng. Phải định nghĩa đầu ra cho các mã ấy; công thức cây đầy đủ tám nguồn không tự quyết định hợp đồng sáu nguồn.

Một nguồn, nhiều đích và các đầu ra không được chọn

Trong demux 1:4 active-high của bài, đầu ra được chọn đi theo bit dữ liệu D; ba đầu ra còn lại bằng 0.

Select D Vector Y3..Y0
00 1 0001
10 1 0100
11 0 0000

Khi select đổi, đầu ra cũ không giữ dữ liệu. Nếu cần mỗi kênh giữ một giá trị giữa các lượt, phải thêm phần tử lưu và điều kiện cập nhật riêng.

Decoder active-high có enable dùng cùng dạng hàm: enable đóng vai trò dữ liệu của demux. Decoder cũng có thể active-low; luôn đọc mức kích hoạt cụ thể trước khi nối mạch.

Dùng MUX để tạo một hàm

Xét F=A·B+B'·C, chọn A/B làm hai bit select. Với mỗi cặp A/B, xét hai giá trị C:

A B F khi C=0 F khi C=1 Nối vào mux
00 0 1 D0=C
01 0 0 D1=0
10 0 1 D2=C
11 1 1 D3=1

Các đầu dữ liệu trở thành C hoặc hằng. Mux lựa đúng cột hàm theo A/B, không cần viết SOP từng minterm ở đường ra.

Đây là cách nhìn theo phân rã Shannon: F=S'·F(S=0)+S·F(S=1). Một LUT có thể chọn giữa các bit cấu hình từ bảng chân trị; đó là liên hệ về chức năng, không khẳng định mọi LUT vật lý có đúng sơ đồ mux cụ thể ở bài.

Binary select khác one-hot select

Binary select mã hóa số thứ tự. One-hot select dành một bit cho mỗi nguồn và yêu cầu đúng một bit được kích hoạt; mạng AND-OR có thể dùng các bit đó trực tiếp.

Nếu có nhiều bit one-hot cùng bằng 1, mạng OR có thể trộn dữ liệu của nhiều nguồn. Nó không tự quyết định ưu tiên như priority mux. Nếu không bit nào bằng 1, cần biết đầu ra mong muốn và có cờ valid hay không.

Thêm enable hoặc quy tắc giữ giá trị đều là thay đổi hợp đồng. Bỏ gán trong một nhánh RTL có thể suy latch; đừng dùng cách đó để “tắt mux” mà không chủ đích.

Những lỗi chọn đường thường gặp

  • Đảo S1/S0 làm tráo thứ tự nguồn.
  • Nhầm số nguồn với số bit của bus.
  • Nghĩ demux lưu dữ liệu ở đầu ra cũ.
  • Bỏ hành vi của mã select không dùng.
  • Cho rằng tổ hợp không có trễ hoặc không thể glitch khi select đổi.

Các so sánh ở ví dụ dùng bit 0/1 đã ổn định. Với select X/Z, các cách viết ternary, case và mạng cổng có thể khác hành vi mô phỏng; không suy kết quả miền Boolean thành quy tắc 4-state chung.

Lần đường dữ liệu

  1. Một mux chọn giữa 16 bus 32 bit cần bao nhiêu bit select? Đầu ra rộng bao nhiêu?
  2. Với cây 4:1, S1/S0 bằng 10 đi qua nguồn nào?
  3. Demux đang D bằng 1, select đổi 01→11; Y1 có giữ 1 không?
  4. Lập bảng dữ liệu cho F=A XOR B bằng mux 2:1 lấy A làm select.
  5. Nếu one-hot select vi phạm và hai nguồn khác nhau, mạng AND-OR có bảo đảm chọn đúng một nguồn không?

Kiểm tra

Tự kiểm tra: MUX và DEMUX: chọn đường dữ liệu, không giữ dữ liệu

  1. MUX 4:1 có S1/S0=10 chọn nguồn nào?
  2. Chọn một trong 16 bus 32 bit cần bao nhiêu bit select?
  3. Demux tổ hợp có giữ dữ liệu ở đầu ra cũ sau khi select đổi không?
  4. Hàm A·B+B’·C với A/B làm select nối D1 thành gì?
  5. Mạng AND-OR dùng one-hot bị hai select cùng bật sẽ làm gì?

Bằng chứng kiểm chứng

Expected tính trước chạy: MUX CHECK vectors=64 demux=8 functions=8 time_ns=80.

Chọn dữ liệu, phân phối dữ liệu và tạo hàm bằng MUX

Kỳ vọng tính trước chạy: MUX CHECK vectors=64 demux=8 functions=8 time_ns=80

mux_core.sv RTL
`timescale 1ns/1psmodule mux_core(input logic [3:0] data,input logic [1:0] sel,input logic din,a,b,c, output wire flat,tree,function_out,output wire [3:0] demux); wire [3:0] function_data={1'b1,c,1'b0,c}; assign flat=data[sel]; assign tree=sel[1]?(sel[0]?data[3]:data[2]):(sel[0]?data[1]:data[0]); assign demux={4{din}}&(4'b0001<<sel); assign function_out=function_data[{a,b}];endmodule
tb.sv testbench
`timescale 1ns/1psmodule tb_a2_mux; logic [3:0] data;logic [1:0] sel;logic din,a,b,c;wire flat,tree,function_out;wire [3:0] demux; mux_core dut(.*); logic [7:0] function_truth=8'he2; int vectors=0,demux_count=0,functions=0,expected_bit; initial begin  a=0;b=0;c=0;din=0;data=0;sel=0;  for(int value=0;value<16;value++)for(int j=0;j<4;j++)begin   data=4'(value);sel=2'(j);#1;vectors++;expected_bit=(value/(2**j))%2;   if(int'(flat)!=expected_bit||int'(tree)!=expected_bit)$fatal(1,"Mux selection mismatch data=%0d sel=%0d",value,j);  end  for(int value=0;value<2;value++)for(int j=0;j<4;j++)begin   din=1'(value);sel=2'(j);#1;demux_count++;   if(int'(demux)!=(value==0?0:2**j))$fatal(1,"Demux mismatch data=%0d sel=%0d",value,j);  end  for(int i=0;i<8;i++)begin   a=1'(i/4);b=1'((i/2)%2);c=1'(i%2);#1;functions++;   if(function_out!==function_truth[i])$fatal(1,"Mux function mismatch row=%0d",i);  end  if(vectors!=64||demux_count!=8||functions!=8||$time!=80)$fatal(1,"Mux contract");  $display("MUX CHECK vectors=%0d demux=%0d functions=%0d time_ns=%0d",vectors,demux_count,functions,$time);  $finish; endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Lint -Wall (Verilator 5.050)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)
  • Tổng hợp, số cell khớp kỳ vọng (Yosys 0.70)

Output phải khớp: MUX CHECK vectors=64 demux=8 functions=8 time_ns=80

Kỳ vọng sau tổng hợp: mux_core: $_*DFF* = 0mux_core: $_*LATCH* = 0

Finite known 0/1 input domains only. Generic synthesis, where claimed, is not technology mapping, STA or PPA. No all-width or X/Z language conformance claim.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-07), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

Kiểm 16 pattern dữ liệu qua bốn select cho mux phẳng và cây; tham chiếu trích bit bằng phép chia số nguyên. Demux kiểm đủ hai bit dữ liệu qua bốn select. Hàm mux đối chiếu literal E2 của tám hàng đã tính, tách khỏi biểu thức gốc.

Parsed/linted/simulated/synthesized đạt. Không có flip-flop/latch trong synthesis generic. Không claim timing/4-state tương đương của mọi kiểu viết hoặc cấu trúc cell chính xác sau mapping.

[1] [2] [3] [4]

Nguồn và mức độ đối chiếu

  1. Digital Multiplexer Circuit — bản chụp resources.zip, The 2-to-1 and 4-to-1 Multiplexer; Building Bigger Multiplexers; Implementing Functions With a Multiplexer; Multiplexer Cells and One-Hot Selects. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. Thí nghiệm nguyên bản A2.mux, Sixty-four mux selections, eight demux vectors and eight independently tabulated function rows. Trích dẫn; nguồn đã đọc toàn văn.
  3. IEEE 1800-2023 SystemVerilog LRM, Variable packed indexing, concatenation, conditional expressions and logical shifts — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
  4. Digital Demultiplexer Circuit — bản chụp resources.zip, Quick Answer: Demultiplexer vs. Decoder; The 1-to-2 and 1-to-4 Demultiplexer; A Demultiplexer Is a Decoder With the Data on Enable; Steering a Write Enable. Trích dẫn; nguồn đã đọc các mục liên quan.