รับจำนวนบิตที่ตั้งไว้ในตรรกะดิจิตอล


9

ในการออกกำลังกายฉันพยายามออกแบบการใช้งาน Game of Life ของ Conway ด้วยตรรกะดิจิทัลอย่างง่าย ฉันสามารถทำสิ่งทั้งหมดได้โดยการลดฟังก์ชั่น 9-Variable แต่ฉันคิดว่ามันจะค่อนข้างใหญ่ หนึ่งในองค์ประกอบหลักของอัลกอริทึมคือการกำหนดจำนวนเพื่อนบ้าน 8 คนของคุณว่า 'มีชีวิต'

เมื่อได้รับ 8 อินพุตวิธีที่ง่ายที่สุดในการพิจารณาว่ามีการตั้งค่าจำนวนเท่าใด โดยเฉพาะฉันต้องการเอาต์พุตที่สูงเมื่อตั้งค่า 2 และเอาต์พุตที่สูงเมื่อตั้ง 3

แนวคิดหลักของฉันตอนนี้ประกอบด้วย PISO shift register ตัวนับและตัวถอดรหัส 3: 8 แต่ฉันต้องการไมโครคอนโทรลเลอร์เพื่อขับสิ่งเหล่านี้ทั้งหมด ดูเหมือนว่าฟังก์ชันจะไม่ซับซ้อน บางที ROM 256x2 อาจใช้งานได้เช่นกัน แต่การค้นหาของฉันไม่ได้มีส่วนเช่นนั้น

ฉันรู้ว่ารูปใด ๆ ที่มี 10 IO สามารถทำสิ่งนี้ได้เล็กน้อย แต่ฉันต้องการนำไปใช้ให้เกิดประโยชน์น้อยที่สุดเท่าที่จะทำได้

คำตอบ:


13

คุณอาจพบว่าขั้นตอนวิธีการต่างๆในบิตได้อย่างรวดเร็วนับ enlightening สองครั้งสุดท้าย: Nifty Parallel Count และ MIT HAKMEM Count อาจแปลงเป็นประตูได้ง่าย ดูหน้านี้สำหรับคำอธิบายที่ดีเกี่ยวกับการทำงาน

คุณสามารถทำได้โดยใช้เกตฮาร์ดแวร์ ใช้ Adders 1 บิตสี่ตัวเพื่อเพิ่มคู่บิตเข้าด้วยกัน นี่ให้ตัวเลข 3 บิตสี่ตัว เพิ่มเหล่านี้เป็นคู่โดยใช้โปรแกรมเสริม 3 บิตสองตัว สิ่งนี้จะให้ตัวเลข 4 บิตสองหมายเลขเพื่อเพิ่มโดยใช้ adder 4 บิตเดียว สิ่งนี้ทำให้คุณมีค่า 5 บิต แต่คุณสามารถละเว้นบิตบน จากนั้นใช้ตัวเปรียบเทียบ 4 บิตสองตัวเพื่อทดสอบค่า 2 และ 3

สำหรับจำนวนชิ้นส่วนที่น้อยที่สุดทำไมไม่ลองใช้ Analog?

สร้างตัวแบ่งแรงดันพร้อมตัวต้านทานหนึ่งตัวที่ด้านบนและอินพุต 8 ตัวของคุณเชื่อมต่อกับด้านล่างโดยตัวต้านทาน 8 ตัวในแบบขนาน จากนั้นใช้ชุดเครื่องมือเปรียบเทียบสองชุดเพื่อตรวจสอบระดับแรงดันไฟฟ้าที่ 2 หรือ 3 บิตจะสร้าง นั่นเป็นเพียง 6 ส่วน:

เครื่องตรวจจับจำนวนบิต

เครือข่ายตัวต้านทาน 8 ตัวจะสร้างแรงดันไฟฟ้าระหว่าง 0v (สำหรับชุด 0 บิต) ถึง 5v (สำหรับชุด 8 บิต) 2 บิตจะสร้าง 0.5v 3 บิตจะสร้าง 1.56v

  • ด้วย 0 หรือ 1 บิตเอาต์พุตจะเป็น 00
  • ด้วย 2 หรือ 3 บิตเอาต์พุตจะเป็น 01
  • ด้วย 4 บิตขึ้นไปเอาต์พุตจะเป็น 11

ที่เพิ่ม:

ขอบคุณ DavidCary สำหรับคำแนะนำที่ยอดเยี่ยม หลังจากการคำนวณจำนวนมากฉันคิดว่าฉันพบชุดตัวต้านทานที่ทำงานได้ แต่คุณควรตรวจสอบการคำนวณของฉันก่อน ที่นี่ฉันใช้ตัวเปรียบเทียบกับเอาต์พุตแบบ open-drain และฉันคิดว่าฉันจัดการเพื่อให้ได้ผลลัพธ์แบบเดี่ยว ต่ำหมายถึงตายรอบถัดไปสูงหมายถึงมีชีวิตรอบถัดไป

เกมวงจรชีวิตของคอนเวย์ 2

สิ่งที่ดีคือวงจรนี้มีเพียงสององค์ประกอบมากกว่าวงจรอื่น พวกเขาเป็นตัวต้านทานซีรีย์ E8 ทั้งหมดดังนั้นควรเป็นไปได้ที่จะได้รับ นอกจากนี้ R6 ควรเป็นค่าที่สูงกว่าเช่น 4.7k หรือบางอย่าง


4
+1 เพียงเพราะคำตอบของคุณไม่ใช่ "ใช้ไมโครคอนโทรลเลอร์" ดูเหมือนว่าจะเป็นโหมดเริ่มต้นที่นี่
Connor Wolf

@FakeName: การอ้างอิงแรกคือโซลูชันซอฟต์แวร์ แน่นอนคุณจะได้ไม่ต้องใช้พวกเขาบนไมโครคอนโทรลเลอร์, คุณยังสามารถใช้ซูเปอร์คอมพิวเตอร์ :)
เฟเดริโก้รุสโซ

@FedericoRusso - ฉันให้การอ้างอิงไปยังโซลูชันซอฟต์แวร์ที่ให้ข้อมูลเชิงลึกเกี่ยวกับวิธีที่เขาสามารถนำไปใช้ในฮาร์ดแวร์
Rocketmagnet

3
บางที: เพิ่ม "ข้อสรุปการต้านทาน" ครั้งที่ 9 ที่ 20 kOhm จากสถานะปัจจุบันของเซลล์กลางไปยัง op-amp "+" จุดสรุปในวงจรของ Rocketmagnet - กล่าวคือให้เซลล์กลางมีน้ำหนัก 1 และ 8 เซลล์ใกล้เคียง น้ำหนัก 2 แล้วบิดตัวแบ่งแรงดันไฟฟ้าเพื่อให้ "เกิด" (เซลล์ตายกลางที่มี 3 เพื่อนบ้านที่อาศัยอยู่รวม = 6) และ "อยู่รอด" (เซลล์ตายกลางมีชีวิตอยู่กับ 2 หรือ 3 เพื่อนบ้านที่อยู่อาศัยรวม = 5 หรือ 7) ให้ผลของ "01"; และกรณีอื่น ๆ ทั้งหมด (ที่เซลล์กลางตายหรือตายไปแล้ว) ให้ผลลัพธ์ของ "00" หรือ "11" จากนั้นประตู XOR จะให้สถานะต่อไปของเซลล์กลาง
davidcary

1
บางสิ่งที่ฉันพบว่ากำลังทำการทดลอง: ความต้านทานไม่ถูกต้องนัก ฉันพบชุดค่าผสมที่ดีขึ้นเล็กน้อย แต่ฉันยังคงพยายามเพิ่มประสิทธิภาพ นอกจากนี้เมื่อสร้างกริดเหล่านี้กระแสจะไหลย้อนกลับผ่านตัวต้านทานแบบสรุปและทำสิ่งต่าง ๆ ให้วุ่นวาย ไดโอดบนอินเตอร์ลิงค์เป็นวิธีหนึ่งในการป้องกันสิ่งนี้
captncraig

6

อะไรที่น้อยที่สุด? ไมโครคอนโทรลเลอร์เป็นเพียงส่วนที่ 1 และสามารถผลิตผลที่มีความล่าช้าขั้นต่ำ (<1μs) ATTiny20อยู่ที่ 54 เซ็นต์เป็นไมโครคอนโทรลเลอร์ที่ถูกที่สุดที่มี 10 I / O ที่ Digikey

ตารางการค้นหาเป็นเพียงส่วนเดียวและเร็วกว่าไมโครคอนโทรลเลอร์ ลืมเรื่อง EEPROM แบบขนานพวกมันแพง ใช้ไบต์กว้างขนานแฟลช อันนี้คือ 512 kByte ซึ่งมากกว่า 2,000 เท่าที่คุณต้องการ แต่มันเป็นทางออกที่ถูกที่สุด (1 ดอลลาร์) และคุณสามารถเพิ่มฟังก์ชั่น 1 บิตได้อีก 6 บิตในราคาเดียวกัน

คุณสามารถใช้CPLDได้ เขียนฟังก์ชั่นใน VHDL หรือ Verilog เป็นหนึ่งคำสั่ง SOP (ผลรวมของผลิตภัณฑ์) ที่ยาวและให้ซินธิไซเซอร์สร้างตรรกะ

การลงทะเบียนกะคือตกลงถ้าคุณสามารถรอผล; นี่คือทางออกที่ช้าที่สุด

สุดท้ายคุณสามารถทำได้ด้วยลอจิกประตูแต่คุณจะใช้เวลามากในการลด SOP ให้อยู่ในรูปแบบที่เล็กที่สุดหากคุณต้องการใช้ขั้นพื้นฐานทั้งหมด Rocketmagnetมีความคิดที่ถูกต้องในการใช้ Adders แต่ตัวเลขของเขาถูกปิด: adder 1 บิตครึ่งให้ 2 บิตออกไม่ใช่ 3 ดังนั้นการเพิ่มเอาท์พุตของ Adders ครึ่งสองสองต้องใช้ Adders สองครึ่งสองสองให้สอง 3- ผลบิต ใช้ adder ครึ่ง 3 บิตเพื่อให้ได้ผลลัพธ์ 4 บิต การใช้โปรแกรมเสริมแบบเต็ม 1 บิตคุณจะต้องใช้แอดเดอร์ 2 บิตเพียงตัวเดียว


1

วงจรไฮบริดขนานตามลำดับเป็นไฮบริดที่มีขนาดกะทัดรัดกว่าวงจรแบบขนานล้วนๆ ตัวอย่างเช่นหากคุณปรับกฎเพื่อให้กล่อง 3x3 เปลี่ยนเซลล์เป็นศูนย์ตายหากมีเซลล์ที่มีชีวิตน้อยกว่าสามเซลล์หรือมากกว่าสี่เซลล์และเปลี่ยนเป็นเซลล์หากมีเซลล์ที่มีชีวิตสามเซลล์ (พฤติกรรมภายใต้สิ่งเหล่านี้ กฎใหม่จะตรงกับต้นฉบับ) หนึ่งสามารถลดความซับซ้อนของตรรกะโดยทำลำดับสองขั้นตอน:

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] 'ผลรวมสองบิตของตัวเลขหนึ่งบิตสามบิต
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

อาร์เรย์tempVal[x,y]มีสองบิตต่อเซลล์ การดำเนินการหลังรวมตัวเลขสามตัวดังกล่าวเพื่อสร้างค่า 0-9 (แม้ว่าค่าทั้งหมดเกินกว่าสี่จะเทียบเท่ากัน) ซึ่งสามารถนำมาใช้ในการคำนวณสถานะสด / ตายเดียวสำหรับรุ่นต่อไป

BTW ทางเลือกในการทำผลรวมทางคณิตศาสตร์ในขั้นตอนที่สองและตรวจสอบค่าจะแปลง tempVal [x, y] เป็นการแทนค่าแบบร้อนและจากนั้นตรวจสอบหนึ่งในเก้าชุดค่าที่จะให้สามอย่างชัดเจน เซลล์หรือหนึ่งในสิบสองที่จะให้สี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.