Nhận số bit thiết lập trong logic kỹ thuật số


9

Như một bài tập, tôi đang cố gắng thiết kế một triển khai Trò chơi cuộc sống của Conway theo logic kỹ thuật số đơn giản. Tôi có thể làm toàn bộ bằng cách giảm thiểu chức năng 9 biến, nhưng tôi tưởng tượng rằng nó vẫn sẽ khá lớn. Một trong những yếu tố cốt lõi của thuật toán là xác định có bao nhiêu trong số 8 hàng xóm của bạn 'còn sống'.

Cho 8 đầu vào, cách dễ nhất để xác định có bao nhiêu được đặt? Đặc biệt tôi cần một đầu ra cao khi 2 được đặt và một đầu ra cao khi 3 được đặt.

Ý tưởng chính của tôi bây giờ bao gồm một thanh ghi thay đổi PISO, bộ đếm và bộ giải mã 3: 8, nhưng tôi rất cần một bộ vi điều khiển để điều khiển tất cả điều đó. Nó không có vẻ phức tạp như vậy của một chức năng. Có thể ROM 256x2 cũng hoạt động tốt, nhưng các tìm kiếm của tôi không tìm thấy bất kỳ phần nào trong số đó.

Tôi biết rằng bất kỳ pic nào có 10 IO đều có thể làm điều này một cách tầm thường, nhưng tôi muốn thực hiện nó theo cách tối thiểu nhất có thể.

Câu trả lời:


13

Bạn có thể tìm thấy các thuật toán khác nhau trong việc khai sáng đếm bit nhanh . Hai cái cuối cùng: Đếm song song tiện lợi và Đếm MIT HAKMEM có thể dễ dàng chuyển đổi thành cổng. Xem trang này để được giải thích tốt về cách thức hoạt động.

Bạn có thể làm điều này bằng cách sử dụng phần cứng cổng. Sử dụng bốn bộ cộng 1 bit để thêm các cặp bit với nhau. Điều này cung cấp cho bạn bốn số 3 bit. Thêm chúng theo cặp bằng hai bộ cộng 3 bit. Điều này cung cấp cho bạn hai số 4 bit để thêm bằng cách sử dụng một bộ cộng 4 bit duy nhất. Điều này để lại cho bạn một giá trị 5 bit, nhưng bạn có thể bỏ qua bit trên cùng. Sau đó sử dụng hai bộ so sánh 4 bit để kiểm tra các giá trị 2 và 3.

Đối với số phần tối thiểu, tại sao không làm điều đó Analog?

Tạo một bộ chia điện áp với một điện trở trên cùng và 8 đầu vào của bạn được kết nối với đáy bằng 8 điện trở song song. Sau đó, chỉ cần sử dụng hai bộ so sánh được đặt để phát hiện các mức điện áp mà 2 hoặc 3 bit sẽ tạo ra. Đó chỉ là 6 phần:

Máy dò bit

Mạng 8 điện trở sẽ tạo ra điện áp trong khoảng từ 0v (đối với bộ 0 bit) đến 5v (đối với bộ 8 bit). 2 bit sẽ tạo ra 0,5v. 3 bit sẽ tạo ra 1,56v.

  • Với 0 hoặc 1 bit, đầu ra sẽ là 00.
  • Với 2 hoặc 3 bit, đầu ra sẽ là 01.
  • Với 4 bit trở lên, đầu ra sẽ là 11.

Thêm:

Cảm ơn DavidCary cho một gợi ý tuyệt vời. Sau khi tính toán rất nhiều, tôi nghĩ rằng tôi đã tìm thấy một bộ điện trở hoạt động, nhưng bạn nên kiểm tra cẩn thận các tính toán của tôi trước. Ở đây tôi đang sử dụng các bộ so sánh với các đầu ra cống mở và tôi nghĩ rằng tôi đã quản lý để làm cho nó có một đầu ra duy nhất. Thấp có nghĩa là chết vòng tiếp theo, Cao có nghĩa là sống vòng tiếp theo.

Trò chơi vòng đời 2 của Conway

Điều tuyệt vời là mạch này chỉ có hai thành phần hơn mạch kia. Chúng đều là điện trở sê-ri E8, vì vậy nên có thể nắm bắt được. Ngoài ra, R6 nên có giá trị cao hơn, như 4,7k hoặc thứ gì đó.


4
+1 chỉ vì câu trả lời của bạn không phải là "Sử dụng vi điều khiển". Đó dường như là chế độ mặc định ở đây.
Sói Connor

@FakeName: Tham chiếu đầu tiên là các giải pháp phần mềm. Tất nhiên bạn không phải thực hiện chúng trên vi điều khiển, bạn cũng có thể sử dụng siêu máy tính :)
Federico Russo

@FedericoRusso - Tôi đã đưa ra các tài liệu tham khảo cho các giải pháp phần mềm cung cấp một số thông tin chi tiết về cách anh ấy có thể triển khai nó trong phần cứng.
Rocketmagnet

3
Có lẽ: Thêm "điện trở tổng hợp" thứ 9 20 kOhm từ trạng thái hiện tại của ô trung tâm vào điểm tổng hợp op-amp "+" trong mạch của Rocketmagnet - tức là tạo cho ô trung tâm trọng số 1 và 8 ô lân cận trọng lượng là 2. Sau đó điều chỉnh bộ chia điện áp để "sinh" (tế bào chết trung tâm với 3 hàng xóm sống; sum = 6) và "sống sót" (tế bào chết trung tâm còn sống với 2 hoặc 3 hàng xóm sống, sum = 5 hoặc 7) cho kết quả đầu ra là "01"; và tất cả các trường hợp khác (trong đó tế bào trung tâm chết hoặc vẫn chết) cho kết quả đầu ra là "00" hoặc "11". Sau đó, một cổng XOR cho trạng thái tiếp theo của ô trung tâm.
davidcary

1
Một vài điều tôi đã tìm thấy khi thực hiện một số thử nghiệm: các điện trở không hoàn toàn đúng. Tôi tìm thấy một vài kết hợp tốt hơn nhưng tôi vẫn đang cố gắng tối ưu hóa. Ngoài ra, khi tạo ra một lưới trong số này, dòng điện sẽ chảy ngược qua các điện trở summimg và làm mọi thứ rối tung lên. Điốt trên các liên kết là một cách để ngăn chặn điều này.
captncraig

6

μ

Bảng tra cứu cũng chỉ là 1 phần và nhanh hơn vi điều khiển. Quên về EEPROM song song, chúng đắt tiền. Sử dụng Flash song song rộng byte . Cái này là 512 kByte, gấp 2000 lần so với những gì bạn cần, nhưng nó là giải pháp rẻ nhất (1 đô la). Và bạn có thể thêm 6 hàm 1 bit khác với cùng giá.

Bạn cũng có thể sử dụng CPLD . Viết hàm trong VHDL hoặc Verilog dưới dạng một câu lệnh dài (Sum Of Products) dài và để bộ tổng hợp tạo logic.

Thanh ghi thay đổi là OK nếu bạn có thể chờ kết quả; đây là giải pháp chậm nhất

Cuối cùng, bạn có thể làm điều đó với các cổng logic , nhưng bạn sẽ mất rất nhiều thời gian để giảm SOP xuống dạng tối thiểu nếu bạn muốn đi tất cả các cơ bản. Rocketmagnet có ý tưởng đúng khi sử dụng các bộ cộng, nhưng các số của anh ta bị tắt: bộ cộng một nửa bit cho ra 2 bit chứ không phải 3. Vì vậy, việc thêm đầu ra của bộ cộng một nửa hai yêu cầu hai bộ cộng nửa bit, cho hai 3- kết quả bit. Sử dụng bộ cộng nửa bit 3 bit để có kết quả 4 bit. Sử dụng bộ cộng đầy đủ 1 bit, bạn sẽ chỉ cần một bộ cộng 2 bit.


1

Mạch song song lai có khả năng nhỏ gọn hơn nhiều so với mạch song song thuần túy. Ví dụ: nếu bạn điều chỉnh các quy tắc sao cho hộp 3x3 sẽ biến ô ở trung tâm chết nếu có ít hơn ba ô sống hoặc nhiều hơn bốn và biến nó thành sống nếu có chính xác ba ô sống (hành vi theo các ô này quy tắc mới sẽ khớp với bản gốc), người ta có thể đơn giản hóa logic bằng cách thực hiện một chuỗi hai bước:

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] 'Tổng hai bit của ba số một bit
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

Mảng tempVal[x,y] có hai bit trên mỗi ô; phép toán sau kết hợp ba số như vậy để tạo ra một giá trị 0-9 (mặc dù tất cả các giá trị vượt quá bốn là tương đương), sau đó có thể được sử dụng để tính toán trạng thái sống / chết một bit cho thế hệ tiếp theo.

BTW, một cách khác để thực hiện tổng số học trong giai đoạn thứ hai và kiểm tra giá trị sẽ là chuyển đổi tempVal [x, y] thành biểu diễn một nóng, và sau đó kiểm tra rõ ràng một trong chín kết hợp các giá trị sẽ mang lại ba các tế bào, hoặc một trong mười hai sẽ mang lại bốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.