วิธี Variable Entering Map (VEM) – ลดตัวแปรให้เหลือ 2 ตัวต่อ MUX
ผศ.ดร.สมนึก สุระธง · มหาวิทยาลัยเทคโนโลยีราชมงคลล้านนา
เป้าหมาย: ออกแบบวงจรที่รับตัวเลข 2 ตัว (A และ B ขนาด 4 บิตแต่ละตัว) แล้วบอกว่า A มากกว่า, น้อยกว่า หรือเท่ากับ B
อุปกรณ์ที่ใช้: IC 4:1 Multiplexer เท่านั้น (ไม่ใช้ logic gate อื่น)
วิธีการ: ใช้เทคนิค Variable Entering Map (VEM) เพื่อ "ยุบ" สมการบูลีนให้เหลือแค่ 2 ตัวแปรต่อ MUX 1 ตัว
ปัญหา: สมการบูลีนมีตัวแปรเยอะ (เช่น 8 ตัว) แต่ 4:1 MUX มีขาเลือกแค่ 2 ขา (S₁, S₀)
VEM แก้ปัญหาด้วย: เลือกตัวแปร 2 ตัวมาเป็นขาเลือก แล้วแทนค่าตัวแปรที่เลือกลงสมการ ผลลัพธ์ที่ได้ 4 ค่า (สำหรับ 00, 01, 10, 11) คือค่าที่ต้องต่อเข้าขา I₀, I₁, I₂, I₃ ของ MUX
สมการเปรียบเทียบทั้ง 3 กรณี (A>B, A<B, A=B) ไม่ได้เกิดจากการเดาสุ่มหรือสูตรลอยๆ แต่เกิดจาก "หลักตรรกะการเปรียบเทียบเลขของมนุษย์" ที่นำมาจัดกลุ่มมินเทอม (Minterms) จากตารางความจริงขนาด 8 อินพุต (256 แถว):
เราต้องตรวจบิตซ้ายสุดก่อนเสมอ (A₃ เทียบ B₃) ถ้าหลักใหญ่รู้ผลแพ้ชนะแล้ว หลักย่อยด้านขวา (บิต 2, 1, 0) จะไม่มีผลใดๆ อีกเลย
• ชนะที่บิตนี้: AᵢB̄ᵢ (A=1, B=0)
• แพ้ที่บิตนี้: ĀᵢBᵢ (A=0, B=1)
• เสมอกัน: Aᵢ⊙Bᵢ (0=0 หรือ 1=1)
เมื่อบิตปัจจุบัน "เสมอกัน" (Aᵢ⊙Bᵢ=1) ผลลัพธ์จะถูกส่งต่อไปยังบิตต่ำกว่า (fᵢ₋₁) เพื่อตัดสินแทน
ตารางความจริงมี 2⁸ = 256 กรณี (A = 0..15 จับคู่กับ B = 0..15) ถูกแบ่งออกเป็น 3 กลุ่มตามหลักคณิตศาสตร์อย่างแม่นยำ:
| เอาท์พุต | จำนวนแถว | เงื่อนไขเหตุการณ์ | พจน์บูลีนที่ทำงาน (Active Term) | ฟังก์ชันที่รองรับ |
|---|---|---|---|---|
|
🟢 A > B รวม 120 แถว |
64 แถว | บิต 3 ชนะขาด (A₃=1, B₃=0) | A₃B̄₃ | MUX_X3 (บิต 3) |
| 32 แถว | บิต 3 เสมอ (A₃=B₃) และบิต 2 ชนะ (A₂=1, B₂=0) | (A₃⊙B₃) · A₂B̄₂ | MUX_X2 (บิต 2) | |
| 16 แถว | บิต 3,2 เสมอ และบิต 1 ชนะ (A₁=1, B₁=0) | (A₃⊙B₃)(A₂⊙B₂) · A₁B̄₁ | MUX_X1 (บิต 1) | |
| 8 แถว | บิต 3,2,1 เสมอ และบิต 0 ชนะ (A₀=1, B₀=0) | (A₃⊙B₃)(A₂⊙B₂)(A₁⊙B₁) · A₀B̄₀ | MUX_X0 (บิต 0) | |
|
🔴 A < B รวม 120 แถว |
64 แถว | บิต 3 แพ้ขาด (A₃=0, B₃=1) | Ā₃B₃ | MUX_Y3 (บิต 3) |
| 32 แถว | บิต 3 เสมอ (A₃=B₃) และบิต 2 แพ้ (A₂=0, B₂=1) | (A₃⊙B₃) · Ā₂B₂ | MUX_Y2 (บิต 2) | |
| 16 แถว | บิต 3,2 เสมอ และบิต 1 แพ้ (A₁=0, B₁=1) | (A₃⊙B₃)(A₂⊙B₂) · Ā₁B₁ | MUX_Y1 (บิต 1) | |
| 8 แถว | บิต 3,2,1 เสมอ และบิต 0 แพ้ (A₀=0, B₀=1) | (A₃⊙B₃)(A₂⊙B₂)(A₁⊙B₁) · Ā₀B₀ | MUX_Y0 (บิต 0) | |
|
🟡 A = B รวม 16 แถว |
16 แถว | ทุกบิตตรงกันเป๊ะ (0=0, 1=1, ..., 15=15) | (A₃⊙B₃)(A₂⊙B₂)(A₁⊙B₁)(A₀⊙B₀) | MUX_Z (ตัวตัดสิน) |
| รวมทั้งหมด | 256 แถว | 120 แถว (A>B) + 120 แถว (A<B) + 16 แถว (A=B) = 256 แถว ครบถ้วน 100% | ||
เมื่อนำทั้ง 4 กรณีของ A > B มารวมกัน (OR):
สังเกตว่ามีตัวประกอบร่วม (Aᵢ⊙Bᵢ) ซ้อนกันอยู่ เราจึงดึงตัวร่วมออกมาทีละชั้นแบบ Nested:
นี่คือที่มาของการตั้งชื่อตัวแปรย่อยเพื่อส่งต่อสัญญาณทีละ MUX:
แต่ละบิตมีหน้าที่ชัดเจนและสอดคล้องกับแถวในตารางความจริง 256 แถวดังนี้:
• ตัวแปรที่พิจารณา: ดูเฉพาะบิตคู่แรก A₀ และ B₀
• ทำไมไม่มีบิตก่อนหน้า? เพราะเป็นบิตต่ำสุด ไม่มีใครต่ำกว่าให้ส่งต่อแล้ว (f₋₁ = 0)
• สมการที่ได้: f₀ = A₀B̄₀ (A>B) และ g₀ = Ā₀B₀ (A<B)
• ในตาราง 256 แถว: มีผลตัดสินใน 8 แถว (เฉพาะกรณีที่บิต 3, 2, 1 ดันเสมอกันหมด)
• ตัวแปรที่พิจารณา: ดูคู่ A₁, B₁ ร่วมกับผลลัพธ์จากบิต 0 (f₀ / g₀)
• หลักการตัดสิน: ถ้า A₁ ชนะ (1,0) จบที่ 1 ทันที | ถ้าเสมอ (0,0 หรือ 1,1) ให้ดึงค่า f₀ มาใช้
• สมการที่ได้: f₁ = A₁B̄₁ + (A₁⊙B₁)·f₀ และ g₁ = Ā₁B₁ + (A₁⊙B₁)·g₀
• ในตาราง 256 แถว: มีผลตัดสินใน 16 แถว (กรณีที่บิต 3, 2 เสมอกัน แต่บิต 1 มีผลต่างกัน)
• ตัวแปรที่พิจารณา: ดูคู่ A₂, B₂ ร่วมกับผลลัพธ์จากบิต 1 (f₁ / g₁)
• หลักการตัดสิน: ถ้า A₂ ชนะ (1,0) จบที่ 1 ทันที | ถ้าเสมอ ให้ดึงผลลัพธ์สะสม f₁ มาใช้
• สมการที่ได้: f₂ = A₂B̄₂ + (A₂⊙B₂)·f₁ และ g₂ = Ā₂B₂ + (A₂⊙B₂)·g₁
• ในตาราง 256 แถว: มีผลตัดสินใน 32 แถว (กรณีที่บิต 3 เสมอกัน แต่บิต 2 มีผลต่างกัน)
• ตัวแปรที่พิจารณา: ดูคู่หลักสูงสุด A₃, B₃ ร่วมกับผลลัพธ์สะสม f₂ / g₂
• หลักการตัดสิน: ถ้า A₃ ชนะ (1,0) จะชนะขาดทันที 64 แถว! ถ้าแพ้ (0,1) แพ้ทันที 64 แถว! ถ้าเสมอจึงยอมดู f₂
• สมการที่ได้ (Final Output): A>B = A₃B̄₃ + (A₃⊙B₃)·f₂ และ A<B = Ā₃B₃ + (A₃⊙B₃)·g₂
• ในตาราง 256 แถว: ตัดสินขาดทันทีถึง 64 แถว ในฝั่ง A>B และอีก 64 แถว ในฝั่ง A<B
สังเกตสีไฮไลต์ที่บิต: บิตที่เป็นตัวตัดสินผลแพ้ชนะจะถูกไฮไลต์สีสว่างทันที ทำให้มองเห็นจุดตัดสินของทุกแถวได้อย่างชัดเจน 100%
| แถว # | อินพุต A (4 บิต) | อินพุต B (4 บิต) | เอาท์พุต (Output) | เหตุการณ์ & บิตที่ตัดสิน | พจน์สมการ & ฟังก์ชันที่ถูกกระตุ้น | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A₁₀ | A₃ | A₂ | A₁ | A₀ | B₁₀ | B₃ | B₂ | B₁ | B₀ | A > B | A < B | A = B | |||
สมการ:
เลือก: S₁ = A₀, S₀ = B₀
ตาราง VEM (แทนค่าลงสมการ):
| A₀ \ B₀ | B₀=0 | B₀=1 |
|---|---|---|
| A₀=0 | 0·1=0 | 0·0=0 |
| A₀=1 | 1·1=1 | 1·0=0 |
ผลลัพธ์ → ขา MUX_X0:
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | 0 | GND |
| I₁ | 01 | 0 | GND |
| I₂ | 10 | 1 | VCC |
| I₃ | 11 | 0 | GND |
| Output Y | → f₀ | ||
สมการ:
เลือก: S₁ = A₁, S₀ = B₁
f₀ = ตัวแปรแทรก (entering variable)
ตาราง VEM:
| A₁ \ B₁ | B₁=0 | B₁=1 |
|---|---|---|
| A₁=0 | 0+1·f₀=f₀ | 0+0=0 |
| A₁=1 | 1+...=1 | 0+1·f₀=f₀ |
เสมอ(00,11) → ผ่าน f₀ | แพ้(01) → 0 | ชนะ(10) → 1
ผลลัพธ์ → ขา MUX_X1:
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | f₀ | สาย f₀ |
| I₁ | 01 | 0 | GND |
| I₂ | 10 | 1 | VCC |
| I₃ | 11 | f₀ | สาย f₀ |
| Output Y | → f₁ | ||
สมการ:
เลือก: S₁ = A₂, S₀ = B₂
ตาราง VEM:
| A₂ \ B₂ | B₂=0 | B₂=1 |
|---|---|---|
| A₂=0 | f₁ | 0 |
| A₂=1 | 1 | f₁ |
ผลลัพธ์ → ขา MUX_X2:
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | f₁ | สาย f₁ |
| I₁ | 01 | 0 | GND |
| I₂ | 10 | 1 | VCC |
| I₃ | 11 | f₁ | สาย f₁ |
| Output Y | → f₂ | ||
สมการ:
เลือก: S₁ = A₃, S₀ = B₃
ตาราง VEM:
| A₃ \ B₃ | B₃=0 | B₃=1 |
|---|---|---|
| A₃=0 | f₂ | 0 |
| A₃=1 | 1 | f₂ |
ผลลัพธ์ → ขา MUX_X3:
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | f₂ | สาย f₂ |
| I₁ | 01 | 0 | GND |
| I₂ | 10 | 1 | VCC |
| I₃ | 11 | f₂ | สาย f₂ |
| Output Y | → LED A>B 🟢 | ||
ยกเว้น MUX_X0: I₀=GND, I₃=GND (เพราะไม่มี MUX ก่อนหน้า)
เลือก: S₁ = A₀, S₀ = B₀
ตาราง VEM:
| A₀ \ B₀ | B₀=0 | B₀=1 |
|---|---|---|
| A₀=0 | 1·0=0 | 1·1=1 |
| A₀=1 | 0·0=0 | 0·1=0 |
ผลลัพธ์ → ขา MUX_Y0:
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | 0 | GND |
| I₁ | 01 | 1 | VCC |
| I₂ | 10 | 0 | GND |
| I₃ | 11 | 0 | GND |
| Output Y | → g₀ | ||
| Aᵢ \ Bᵢ | Bᵢ=0 | Bᵢ=1 |
|---|---|---|
| Aᵢ=0 | gᵢ₋₁ | 1 |
| Aᵢ=1 | 0 | gᵢ₋₁ |
ขา MUX (เหมือนกันทุกตัว Y1–Y3):
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | gᵢ₋₁ | สาย g ก่อนหน้า |
| I₁ | 01 | 1 | VCC |
| I₂ | 10 | 0 | GND |
| I₃ | 11 | gᵢ₋₁ | สาย g ก่อนหน้า |
| Y3 Output | → LED A<B 🔴 | ||
ตาราง VEM:
| A>B \ A<B | A<B=0 | A<B=1 |
|---|---|---|
| A>B=0 | 1 (เสมอ!) | 0 |
| A>B=1 | 0 | 0 (เป็นไปไม่ได้) |
ผลลัพธ์ → ขา MUX_Z:
| ขา | S₁S₀ | ค่า | ต่อ |
|---|---|---|---|
| I₀ | 00 | 1 | VCC |
| I₁ | 01 | 0 | GND |
| I₂ | 10 | 0 | GND |
| I₃ | 11 | 0 | GND |
| Output Y | → LED A=B 🟡 | ||
| MUX | สมการ | S₁ | S₀ | I₀(00) | I₁(01) | I₂(10) | I₃(11) | Output Y |
|---|---|---|---|---|---|---|---|---|
| MUX_X0 | f₀=A₀B̄₀ | A₀ | B₀ | GND | GND | VCC | GND | f₀ |
| MUX_X1 | f₁=A₁B̄₁+(A₁⊙B₁)f₀ | A₁ | B₁ | f₀ | GND | VCC | f₀ | f₁ |
| MUX_X2 | f₂=A₂B̄₂+(A₂⊙B₂)f₁ | A₂ | B₂ | f₁ | GND | VCC | f₁ | f₂ |
| MUX_X3 | A>B=A₃B̄₃+(A₃⊙B₃)f₂ | A₃ | B₃ | f₂ | GND | VCC | f₂ | 🟢 A>B |
| MUX_Y0 | g₀=Ā₀B₀ | A₀ | B₀ | GND | VCC | GND | GND | g₀ |
| MUX_Y1 | g₁=Ā₁B₁+(A₁⊙B₁)g₀ | A₁ | B₁ | g₀ | VCC | GND | g₀ | g₁ |
| MUX_Y2 | g₂=Ā₂B₂+(A₂⊙B₂)g₁ | A₂ | B₂ | g₁ | VCC | GND | g₁ | g₂ |
| MUX_Y3 | A<B=Ā₃B₃+(A₃⊙B₃)g₂ | A₃ | B₃ | g₂ | VCC | GND | g₂ | 🔴 A<B |
| MUX_Z | A=B=¬(A>B)·¬(A<B) | A>B | A<B | VCC | GND | GND | GND | 🟡 A=B |
วงจรด้านล่างแสดงการต่อ MUX ทั้ง 9 ตัวใน CircuitVerse (ลูกศร = ทิศทางสัญญาณ)
MUX_X0 (เริ่มต้น — บิต 0)
• S₁ = ต่อ A₀
• S₀ = ต่อ B₀
• I₀ = ต่อ GND (0)
• I₁ = ต่อ GND (0)
• I₂ = ต่อ VCC (1)
• I₃ = ต่อ GND (0)
• Y = f₀ → ไปต่อ I₀ และ I₃ ของ MUX_X1
MUX_X1 (บิต 1)
• S₁ = ต่อ A₁
• S₀ = ต่อ B₁
• I₀ = ต่อ สาย f₀ (output ของ MUX_X0)
• I₁ = ต่อ GND
• I₂ = ต่อ VCC
• I₃ = ต่อ สาย f₀ เช่นกัน (ต่อพ่วงจาก I₀)
• Y = f₁ → ไปต่อ I₀ และ I₃ ของ MUX_X2
MUX_X2 (บิต 2) — ทำเหมือน X1 แต่เปลี่ยนสัญญาณ
• S₁=A₂, S₀=B₂, I₀=I₃=f₁, I₁=GND, I₂=VCC, Y=f₂
MUX_X3 (บิต 3 — ผลสุดท้าย)
• S₁=A₃, S₀=B₃, I₀=I₃=f₂, I₁=GND, I₂=VCC
• Y → ต่อเข้า LED สีเขียว (A>B)
MUX_Y0 (บิต 0 — ต่างจาก X0 ตรงที่ I₁=VCC, I₂=GND)
• S₁=A₀, S₀=B₀
• I₀ = GND | I₁ = VCC | I₂ = GND | I₃ = GND
• Y = g₀ → I₀ และ I₃ ของ MUX_Y1
MUX_Y1, Y2 (บิต 1, 2 — รูปแบบเดียวกัน)
• S₁=Aᵢ, S₀=Bᵢ, I₀=I₃=gᵢ₋₁, I₁=VCC, I₂=GND
MUX_Y3 (บิต 3 — ผลสุดท้าย)
• S₁=A₃, S₀=B₃, I₀=I₃=g₂, I₁=VCC, I₂=GND
• Y → ต่อเข้า LED สีแดง (A<B)
• S₁ = ต่อ Output ของ MUX_X3 (สาย A>B)
• S₀ = ต่อ Output ของ MUX_Y3 (สาย A<B)
• I₀ = ต่อ VCC (1)
• I₁ = ต่อ GND (0)
• I₂ = ต่อ GND (0)
• I₃ = ต่อ GND (0)
• Y → ต่อเข้า LED สีเหลือง (A=B)
เหตุผล: A=B เป็น 1 ก็ต่อเมื่อ A>B=0 และ A<B=0 (เลือก I₀=VCC เฉพาะ state 00)
ลองป้อนค่าต่อไปนี้เพื่อตรวจสอบว่าวงจรทำงานถูกต้อง:
| A₃A₂A₁A₀ | B₃B₂B₁B₀ | A (ทศนิยม) | B (ทศนิยม) | 🟢 A>B | 🔴 A<B | 🟡 A=B |
|---|---|---|---|---|---|---|
| 1010 | 0101 | 10 | 5 | 1 | 0 | 0 |
| 0011 | 1100 | 3 | 12 | 0 | 1 | 0 |
| 0111 | 0111 | 7 | 7 | 0 | 0 | 1 |
| 1111 | 1110 | 15 | 14 | 1 | 0 | 0 |
| 0000 | 0001 | 0 | 1 | 0 | 1 | 0 |