Xây dựng một chiếc đồng hồ kỹ thuật số trong Wireworld


32

Lấy cảm hứng từ câu hỏi Game of Life này .

Wireworld mô phỏng "các electron" chảy qua "dây", cách sắp xếp đơn giản tạo ra hành vi cổng logic điển hình.

Tôi thách bạn xây dựng một chiếc đồng hồ kỹ thuật số trong máy tự động di động Wireworld. Đồng hồ của bạn phải đếm ngược từ 00:00 đến 23:59 theo cách thông thường hoặc đến 11:59 với chỉ báo AM / PM, sau đó đặt lại.

Mục nhập của bạn nên được chia thành hai phần rõ ràng. Phần A phải chứa tất cả logic không hiển thị, tất cả các phần liên quan đến việc tăng và lặp các chữ số. Phần B sẽ là màn hình và logic điều khiển nó. Kết nối duy nhất giữa hai phần này phải là 16 dây biểu thị bốn chữ số thời gian trong BCD (với một dây tùy chọn cho chỉ báo AM / PM và một dây tùy chọn cho đường đồng hồ tín hiệu nếu tín hiệu của bạn không liên tục). (EDIT: luôn luôn có thể bỏ qua dây)

Thời gian của hành vi đồng hồ nên được nhất quán. Việc mô phỏng sẽ có cùng số lượng đánh dấu cho mỗi lần chuyển đổi 1440 giữa các trạng thái. Bất kỳ điện tử nào trên 16 dây phải phát ra từ phần A cùng một lúc và bắt đầu chuyến đi của chúng song song.

Đây là một cuộc thi golf-code. Điểm của bạn là khu vực của hộp giới hạn căn chỉnh trục bao quanh phần A.

Tương tự, nếu đây là ngôn ngữ văn bản, điểm của bạn sẽ là kích thước của chức năng quản lý đồng hồ tạo ra bốn đầu ra 4 bit, chứa một vòng lặp và logic cho 4 bộ đếm, không phải là chức năng giải mã và in ra đầu ra đó.

Phần B của bạn có thể lớn hoặc nhỏ như bạn muốn. Nó chỉ được yêu cầu để có thể nhìn thấy đầu ra của trình gửi của bạn bởi vì ai đó đang chạy nó, vì không có cách nào dễ dàng để đơn giản là "gỡ lỗi" đầu ra từ mạch dây. Có nhiều mạch BCD-> 7sejection có sẵn trực tuyến. Thoải mái sử dụng bất cứ thứ gì bạn thích hoặc tự tạo nếu bạn cần một đường tín hiệu có xung nhịp và hiển thị chỉ báo AM / PM của bạn ở một tỷ lệ tương tự như các chữ số.

EDIT: Phần B bây giờ là tùy chọn. Nếu bạn chỉ có đầu ra BCD từ phần A của mình, vui lòng gửi nó. Sẽ tẻ nhạt hơn khi xác nhận đồng hồ hoạt động, nhưng tôi có thể đọc một hàng bit chỉ tốt trong một mô phỏng tạm dừng.


Đây là một mô phỏng trực tuyến nhỏ.
Phi tuyến

Tôi đã làm việc về điều này nhưng chỉ nhìn thấy nó tuần trước vì vậy tôi có thể sẽ bỏ lỡ tiền thưởng. Tôi không thể tìm thấy phiên bản 4 dây của một thế giới dây bcd-> 7 đoạn; xây dựng bộ chuyển đổi 4 thành 2 trước thiết bị 7 dây phổ biến (giống như thiết bị đi kèm với golly) có thể là cách tốt nhất. Một vấn đề với thiết bị đó là, trong khi nó trông đẹp mắt, nó chậm cập nhật, sẽ làm tăng kích thước của Phần A vì nó có thể bơm số nhanh hơn mức có thể hiển thị và phải được làm chậm một cách giả tạo.
wyldstallyns

Tôi có 150.000 tế bào làm việc Phần A mà tôi có thể chứng minh hoạt động nhưng hiện tại thiếu Phần B. tuân thủ quy tắc
wyldstallyns

Tôi không mong đợi phần B sẽ khó khăn. Các electron của bạn cách nhau bao xa?
Sparr

1
@wyldstallyns Nó đóng cửa vào 16/12/2016 03: 30: 35Z (bạn có thể di chuột qua 'ngày mai' để có thời gian chính xác). Điều tốt nhất của may mắn cho bạn. Tôi thực sự thích đồng hồ của bạn. Đó là một ý tưởng đơn giản thanh lịch và thực hiện xuất sắc. Tôi phải thừa nhận rằng tôi cũng đã rất ngạc nhiên với cuối cùng tôi đã chiếm bao nhiêu không gian. Và tôi rất muốn thấy bất kỳ cải tiến nào bạn có thể đưa ra trong bạn. Vì vậy, chúc may mắn :)
niemiro

Câu trả lời:


36

Đồng hồ chốt

Điểm số - 53,508 (trong đó chỉ có 36.828 được sử dụng tích cực do thiết kế hình chữ L)

Đồng hồ đang chạy

Ghi âm chất lượng cao - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Mẫu Golly - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCYB

Nguyên tắc hướng dẫn -

  • Vì đây là lần đầu tiên tôi sử dụng máy tự động di động, tôi đã tránh xâu chuỗi các thành phần lớn có sẵn. Một cách tiếp cận hợp lệ mà tôi không thực hiện sẽ là một bộ cộng nhị phân bắt đầu từ 0 và liên tục thêm một vào đầu ra cuối cùng, tiếp theo là bộ chuyển đổi nhị phân sang BCD, bộ khử kênh hiển thị, bộ giải mã 7 đoạn và hiển thị 7 đoạn.
  • Nó có thể để lạnh bắt đầu đồng hồ. Tôi tự áp đặt cho mình một hạn chế bổ sung rằng một đầu electron được đặt tại một tế bào dây dẫn cụ thể sẽ khởi động đồng hồ một cách chính xác. Tôi không muốn yêu cầu đồng bộ hóa thủ công cẩn thận nhiều flip-flop khác nhau và các yếu tố thời gian riêng lẻ trước khi bắt đầu mô phỏng.

Phần I: Bộ đếm phút

toán học

Đếm từ 0 đến 9 ở dạng nhị phân (đối với chữ số phút ít quan trọng nhất) diễn ra như sau -

0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001

Đọc dưới dạng cột, luồng có ý nghĩa ít nhất (luồng bit 2 ^ 0 đơn vị) đi 01010101, luồng 2 ^ 1 đơn vị đi 0011001100, luồng 2 ^ 2 đơn vị đi 0000111100 và luồng 2 ^ 3 đơn vị đi 0000000011.

Cái đầu tiên dễ dàng - chỉ cần lật 01 mãi mãi. Thứ ba là một luồng gồm bốn số 1, sáu số 0, pha được dịch chuyển bởi sáu số không. Thứ tư là một luồng gồm tám 0 và hai 1.

Thứ hai là một chút khó khăn hơn vì nó có một sự bất cân xứng khó chịu. Tuy nhiên, tôi nhận thấy rằng (trong đó là toán tử concat):

0011001100. 0011001100 = 0011001100. KHÔNG (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 00000000001111111111

(Ngẫu nhiên, như được đề cập sau này, phần lớn đồng hồ của tôi chạy trên một mã đánh dấu 60 nhịp. Sóng dài gấp đôi 00000000001111111111 là nơi cần đến mã đánh dấu 120 nhịp).

Thiết kế

Các luồng đầu ra từ trên xuống dưới đi Đơn vị phút (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3) sau đó là Hàng chục phút (2 ^ 0, 2 ^ 2, 2 ^ 1). Lưu ý rằng hai dây dưới cùng được bắt chéo.

Số phút được chú thích

  1. Đồng hồ chính 120 nhịp.
  2. Nơi để đặt một điện tử cho một khởi đầu lạnh. Không có đuôi điện tử, nó tách ra theo hai hướng, nhưng diode ngay phía trên bắt được một trong số đó tạo ra một electron đi xe đạp tốt đẹp đi xung quanh và làm tròn vòng 120 nhịp.
  3. Đồng hồ thứ cấp 12 nhịp.
  4. Cuộn dây dẫn + diode bắt đầu đồng hồ 12 nhịp phụ. Các từ không thể mô tả mức độ khó khăn của mảnh nhỏ này để đồng bộ hóa. Bạn phải đồng bộ hóa đồng hồ nhịp 120 và 60 nhịp, sau đó đồng bộ hóa trong đồng hồ giả 24 nhịp và bộ tách tần 24 nhịp, sau đó buộc lại đồng hồ 24 nhịp vào đồng hồ 120 nhịp nếu không cổng XOR không hoạt động .
  5. Thay đổi pha.
  6. Dep Lê. Một electron duy nhất trên đầu vào chạm vào đường đặt trước sau đó sau một khoảng thời gian rất cụ thể, chạm vào đường đặt lại cho chính xác một xung vào, một xung ra.
  7. Thêm bướu ở đây - trên dòng thiết lập lại, tăng độ trễ giữa thiết lập và đặt lại trên flip-flop. Mỗi bướu thêm cho một xung thêm. Flip-flop bên dưới có chín bướu thêm, do đó mười xung giữa thiết lập và thiết lập lại.
  8. Cổng XOR cho dòng 2 ^ 1 đơn vị khó khăn của tôi.
  9. Cổng AND-NOT và độ dài phần rất cụ thể có nghĩa là mỗi xung điện tử đi qua nhân đôi chính nó và tiêu diệt electron phía sau. Tần số giảm tần. Tạo đồng hồ 24 nhịp từ nguồn thứ cấp 12 nhịp.
  10. Đồng hồ thứ cấp 60 nhịp, thực sự làm hầu hết công việc. Thật dễ dàng hơn để bắt đầu đồng hồ nhanh từ tốc độ chậm hơn, vì vậy đồng hồ chậm nhất (120 nhịp) là chủ, mặc dù nó hầu như không được sử dụng. Đồng hồ 60 nhịp là trái tim của điều này.
  11. Dây phản hồi chỉ mang điện tử khi đồng hồ 60 nhịp đang tích tắc. Nó được sử dụng cùng với cổng AND-NOT để dừng đồng hồ được khởi động lại liên tục từ bản gốc 120 nhịp. Nếu không, nhiều điều khủng khiếp xảy ra & Ctrl-Z là vị cứu tinh.
  12. Các diode nơi đồng hồ 60 nhịp được bắt đầu.
  13. Toàn bộ thiết bị này là một cổng lật, cổng AND và cổng AND-KHÔNG kết hợp. Nó cho một chốt. Một xung khởi động nó, một xung dừng lại.
  14. Vòng dây để hiệu chỉnh chốt lên 10 xung, tắt 10 xung cho một trong mười xung đầu vào. Không có nó, chúng tôi nhận được 12 xung, 8 xung. Các chốt mười trên mười chốt này tạo thành các thành phần cơ bản của các khối mười phút theo cùng cách các flip-flop 6 micron (1 xung) tạo thành các thành phần cơ bản của các đơn vị phút.
  15. Xung khởi động lạnh ban đầu gây ra tất cả các loại vấn đề bao gồm cả hai nhịp lệch pha với đồng hồ khởi động. Điều này làm rối tung các chốt. Cổng AND này bắt và loại bỏ các xung đồng bộ - đặc biệt là xung bắt đầu.
  16. Đây là một phần của thiết kế tôi hơi tiếc nuối khi nhìn lại. Nó lấy một electron, tách nó thành năm và tiêu diệt năm electron phía sau, lấy 111111 đến 100000.
  17. Cái này cần một electron và khâu nó ở mặt trước. Hai giai đoạn trước là chính xác. Phải mất 100000 và tạo ra 101000. Kết hợp với phần 16, chúng tôi nhận được 111111 -> 100000 -> 101000. Nhìn lại, tôi ước tôi đã thực hiện 111111 -> 101010 -> 101000; nó sẽ đạt được hiệu quả tương tự trong không gian ít hơn.
  18. Các mẫu trên sau đó được đẩy vào chốt dưới cùng để đạt được 20 trên, 40 tắt. Điều này được phân chia, một nửa được dịch chuyển bởi 20 đơn vị, và sau đó chúng tạo thành hai luồng bit thứ tự cao trong hàng chục phút.

Phần II: Bộ đếm giờ

Giải trình

Đầu vào của bộ đếm giờ là một xung điện tử, một lần một giờ. Bước đầu tiên là giảm mức này xuống một xung điện tử, cứ sau 12 giờ một lần. Điều này đạt được bằng cách sử dụng một số nguyên thủy "chốt và bắt".

"Chốt" là một flip-flop 6 micron được kết nối với một AND-NOT và một cổng AND để tạo ra một chốt bật / tắt 6 micron. Một "lần bắt" lấy một dòng electron liên tục làm đầu vào, cho phép lần đầu tiên xuyên qua, sau đó tiêu diệt mọi điện tử khác phía sau, cho đến khi luồng kết thúc tại điểm bắt lại.

Đặt một chốt, theo sau là một lần bắt, nối tiếp, dẫn đến một điện tử trong -> bật chốt, một điện tử ra khỏi đầu kia (phần còn lại bị bắt). Sau đó, electron thứ hai vào -> tắt chốt, bắt đầu âm thầm đặt lại. Hiệu ứng ròng: electron đầu tiên đi qua, electron thứ hai bị hủy, và cứ thế tiếp tục, bất kể độ trễ giữa các electron đó là bao lâu .

Bây giờ xâu chuỗi hai "chốt và bắt" nối tiếp và bạn chỉ có một trong bốn electron đi qua.

Tiếp theo, lấy "chốt và bắt" thứ ba, nhưng lần này nhúng toàn bộ chốt thứ tư và bắt trên dòng SET lật, giữa cổng AND-NOT và SET flip-flop. Tôi sẽ để bạn suy nghĩ về cách thức hoạt động của nó, nhưng lần này chỉ có một trong ba electron đi qua, bất kể độ trễ giữa các electron đó là bao lâu .

Cuối cùng, lấy một trong bốn electron, và một trong ba, kết hợp chúng với một cổng AND và chỉ một trong mười hai electron đi qua. Toàn bộ phần này là sự lộn xộn của các đường dẫn đến phía trên bên trái của bộ đếm giờ bên dưới.

Tiếp theo, lấy electron mỗi mười hai giờ và tách lại thành một mỗi giờ, nhưng xuất ra từng dây vào một dây dẫn khác nhau. Điều này đạt được bằng cách sử dụng dây dẫn cuộn dài với mười ba điểm thoát.

Lấy các electron này - một giờ xuống các dây dẫn khác nhau và chạm vào một dòng SET lật. Dòng RESET trên cùng một flip flop sau đó được đánh bởi dây dẫn của giờ tiếp theo, tạo ra sáu mươi xung xuống mỗi dây mỗi giờ.

Cuối cùng - lấy các xung này và chuyển chúng thành bảy byte rưỡi ROM (Bộ nhớ chỉ đọc) để xuất ra các luồng bit BCD chính xác. Xem ở đây để được giải thích chi tiết hơn về ROM WireWorld: http://www.quinapalus.com/wires6.html

Thiết kế

Đồng hồ đếm giờ

  1. Một electron mỗi giờ đầu vào.
  2. Chốt đầu tiên.
  3. Bắt đầu tiên.
  4. "Chốt & bắt" được nhúng trên dòng SET "chốt và bắt" bên ngoài.
  5. Và cổng.
  6. Chốt AM / PM (bật / tắt một lần trong mười hai giờ).
  7. Mỗi vòng dây dài 6x60 = 360 đơn vị.
  8. Flip / Flop quay về phía của nó để tạo ra một hồ sơ nhỏ hơn.
  9. Bảy byte rưỡi ROM.

Ghi chú

  1. Do có một electron mỗi phút, thiết kế 6 micron, chạy mô phỏng ở sáu thế hệ mỗi phút (một thế hệ cứ sau 10 giây) cho đồng hồ thời gian thực.
  2. Dòng AM / PM cao (1) cho AM, thấp (0) cho PM. Điều này có vẻ như một cách hơi bất thường để lựa chọn, nhưng có lý do. Trong thời gian bắt đầu lạnh của đồng hồ, ban đầu dòng AM / PM thấp (0). Ngay khi dòng AM / PM được kéo lên cao (1), điều này cho thấy số đếm đã bắt đầu lúc 12:00 AM. Tất cả đầu ra trước thời điểm này nên được bỏ qua, tất cả đầu ra sau thời điểm này được coi là có ý nghĩa.

Liên kết hữu ích


thay đổi yêu cầu sao cho đầu ra luôn luôn bằng không có thể được bỏ qua. bit 4s và 8 giây trong hàng chục giờ không bao giờ được sử dụng, cũng không phải bit 8 giây trong hàng chục phút.
Sparr

Chất rắn! Kỹ thuật thực sự. Bất kỳ cổng logic nào khác sẽ hữu ích? Tôi sắp sửa vũ phu một số.
wyldstallyns

1
Điều này thật đẹp
Sparr

1
Oh tốt đau buồn đó là chỉ gần đủ bây giờ tôi buộc phải cố gắng và tôi tối ưu hóa. Tôi có các mẫu lặp lại mà tôi có thể rút ngắn để nhường chỗ cho những người khác.
wyldstallyns

3
Tôi không biết bạn hoạt động như thế nào trên meta, vì vậy điều này là để cho bạn biết rằng tôi đã đề cử câu trả lời này cho giải thưởng hay nhất của PPCG 2016 .
Peter Taylor

5

Bộ nhớ dòng trễ - 51 x 2880 = 146880

Hình ảnh

Thu nhỏ:

Hình ảnh

Đầu ra đi ra trên cùng của mỗi vòng lặp.

Tôi đặt tất cả các trạng thái trực tiếp lên dây bằng lua này, cho phép gollycác electron chuyển tiếp giữa các bit để chúng ta không phải theo dây bằng một con trỏ.

Tôi đã sử dụng phương pháp ngây thơ này để thiết lập một thanh và khóa học thế giới dây, golly và lua.

local g = golly()

local minutes_in_day = 1440 -- 60x24
local interval = 4 -- how often to send electrons

local function bcd4(num)
    num=math.floor(num)
    local t={}
    for b=4,1,-1 do
        t[b]=math.floor(math.fmod(num,2))
        num=(num-t[b])/2
    end
    return table.concat(t)
end

local function makewire(x,y1,y2)
    for y1=1,y2 do g.setcell(x,y1,3) end
end

local function makeloop(x,y,size)
    local len = size/2 - 1
    makewire(x,y+1,len); makewire(x+2,y+1,len) -- main wires
    g.setcell(x+1,y,3); g.setcell(x+1,y+len,3) -- endcape
end

local function paint(x,y,pattern)
    for v in string.gmatch(pattern,".") do
        if v=="1" then g.setcell(x, y, 1); g.setcell(x, y-1, 2) end
        x = x + 4
    end
    g.show(pattern);g.update() -- slows things down but more interesting to watch
    for i=1,interval do g.step() end
end

for x=0,63,4 do makeloop(x,0,minutes_in_day * interval) end

for hour = 0,23 do
      for minute = 0,59 do
         paint( 0, 2, bcd4(hour/10) .. bcd4(hour%10) .. bcd4(minute/10) .. bcd4(minute%10) )
      end
end

Để thử nghiệm tôi đã thêm các dây hàng đầu này và xem các mẹo của họ.

Imgur

Đây là kịch bản để thu thập 4 bộ BCD 4 dây vào nhãn cầu.

-- watches 16 wires spaced 4 apart starting at (0,-4)
local ticks = 1440 -- set to match the length of your 24 hour loop
local g = golly()
local output = ""
local nums = {  ["0000"] = "0", ["0001"] = "1", ["0010"] = "2", ["0011"] = "3", ["0100"] = "4",
                ["0101"] = "5", ["0110"] = "6", ["0111"] = "7", ["1000"] = "8", ["1001"] = "9",
                ["1010"] = "A", ["1011"] = "B", ["1100"] = "C", ["1101"] = "D", ["1110"] = "E",
                ["1111"] = "F" } -- full set in case we have errors (i did)

for i=0,ticks,1 do
   local text = ""
   for i=0,48,16 do -- set your X here, change the 0 and 48
       local word = ""
       for j=0,15,4 do
            local bit = g.getcell(i+j,-4) -- set your Y here, change -4
            if bit == 0 or bit == 3 then word = word .. "0" else word = word .. "1" end
       end
       text = text .. nums[word]
   end
   g.show(text); output = output..' '..text
   g.update(); g.step();g.step();g.step();g.step()
end
g.note(output)

Câu trả lời cuối cùng yêu cầu cắt các dòng luôn luôn bằng 0 và định tuyến phần còn lại đến các đầu vào BCD chính xác của chúng.


thay đổi yêu cầu để có thể bỏ qua các đầu ra luôn bằng không. bit 4s và 8 giây trong hàng chục giờ không bao giờ được sử dụng, cũng không phải bit 8 giây trong hàng chục phút.
Sparr

2
Đây là một thực hiện vui nhộn và tuyệt vời!
Sparr

1
Ok tôi đã bị đánh bại với một đồng hồ chức năng khác vào giờ thứ 11. Tôi sẽ tấn công các vòng lặp dài nhất và ngắn nhất bằng các thủ thuật khác nhau.
wyldstallyns

Tôi sẽ không kéo nó ra. Tôi có thể tiết kiệm 1/4 kích thước bằng cách chuyển sang xung 3 micron, nhưng nó vẫn không đủ cuộn chặt để đánh bại niemiro.
wyldstallyns
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.