對於完全不懂或者稍微懂一些數字電路的人來說,其實我的建議是:不需要去仰慕那些別人做出來的什麼什麼觸發器,什麼什麼譯碼器。你所需要的,不是在遊戲裏造出一個運算器,而是做出一些實用的東西來!
而實用的東西,其實用到的電路並不難,關鍵是創意和想法。
比如這篇教程是我在官方論壇上看到的一篇非常不錯的教程,作者由淺入深給大家展示鎖存器(Latch)的用處。教程的最後做出的一個實例是在聯機時可以使用的一個交易室,簡單而且實用。
我是學工科的,對於數字電路不能說有多在行,但是好歹也學過,也算略知一二,很多東西都忘了,這樣的教程對我來說是非常實用而且有啟發性的。所以決定給大家翻譯一下,意在告訴大家,不要被電路嚇著了,讓我們一起來做一些簡單實用但是有創意的東西!
PS:貼吧也是我發的~
[GUIDE] LATCHES AND FLIP-FLOPS (WITH USEFUL EXAMPLES!)
這篇教程主要是要教大家如何使用鎖存器(Latch),同時也可以讓大家在這個貼子裏展示你所製作的任何時序邏輯電路。而如果你要找基礎的電路教程,可以看這裏:
鎖存器(Latch)是什麼?鎖存器是一種非常簡單的存儲單元。一個鎖存器可以存儲一個二進製值(1或0)。
在Starbound裏麵使用的是一個D鎖存器,它有2個輸入端和1個輸出端。
D:D代表數據(Data)。你輸入的是什麼決定了輸出的就是什麼。
Enable:Enable決定了D端有沒有連接上輸出端。當Enable為開(1),輸出的值就等於輸入的值。當Enable為關(0),輸出的值就被固定在它之前的狀態了,此時D端不再起任何作用。
如果你願意,你可以把Enable想象為像開關一樣在控製D端和輸出端。嚴格來說這是不正確的,但也不失為一個不錯的比喻。
(譯者注:記住這個結論!這是基礎!!)
(圖注:1=閉合,即開狀態,0=打開,即關狀態;為防止混淆,以下翻譯全部稱1為開,0為關——譯者注)
對於那些想要了解技術原理的人,這是D鎖存器在邏輯電路中的實現。C代表控製(Control),也就是Enable。
還有兩個輸出端,考慮到Starbound隻有正輸出端Q,你並不需要去理解這張圖之後再去使用鎖存器。
(譯者注:【Q】和【Q非】輸出是互補關係,一個是1,另一個一定是0,所以隻需要一個輸出端就行)
我知道你一定在想:“這真是極好的!但是我到底該怎麼去用這玩意?”
好問題!鎖存器有很多的用處,這裏就有幾個基礎的例子。
鎖定陷阱 Locking Trap
鎖存器最簡單也是最常用的用途就是“鎖住”某樣東西,我用一個陷阱來當例子。
如果我走上一個壓力板,Enable端和D端同時被激活,同時陷阱也被激活。當我從壓力板上下來的時候,陷阱還是會繼續保持激活狀態——這是因為Enable端和D端同時被關掉了,輸出端被固定在激活狀態。(這就是鎖住了,譯者注)
重置(reset)按鈕用於關閉陷阱。按鈕被連接到Enable端,可以使輸出端的狀態變為關。
如果你用一個按鈕去代替壓力板,這就是一個偷懶的辦法來製造一個開關裝置,而不使用控製台。之後我們會看到,如何來製造一個一鍵切換開關。
振蕩器(2-clock[2周期])
這個電路使用一個非門反饋回路和一個開關(一個Impervium控製台)來創建一個振蕩器。(注意不是壓力板,這是個控製台console,如果你還不能造這個東西,完全可以其他控製台代替,比如猴子的電腦,而眾所周知,在SB中console其實就是一個開關,譯者注)
當開關打開的時候,輸入端將會在開與關之間快速閃爍。當開關關閉的時候,輸出端狀態就固定住了。你可以用這個來讓燈閃爍,製造一個偽隨機擲硬幣的裝置,等等…
你可以把奇數個非門串聯在一起,創建一個反饋延遲,來減緩震蕩頻率。
如果你想更多了解時鍾信號,可以看後麵關於時鍾說明。
D觸發器 D-Flip-flop
鎖存器屬於電平敏感,意思就是隻要當Enable端為打開狀態的時候,輸出就可以被改變。
而觸發器則是邊沿敏感,意思就是當時鍾信號改變的時候,輸出狀態改變(在時鍾輸入的上升沿和下降沿,取決於類型)。這對於製作狀態機、計數器和寄存器非常有用。
(譯者注:為了讓大家不被大片的專有名詞給嚇著了,我來解釋一下:數字電路中把低電平定義為0,高電平定義為1,從0到1的過程被稱為上升沿,反之被稱為下降沿。具體來說,一個按鈕從未激活到激活的過程,就叫上升沿,反之叫下降沿。
如下所示的觸發器就是一個下降沿觸發的D觸發器。當Clock端(時鍾信號)從開變為關的時候,輸出狀態將會改變。這大概是最簡單的觸發器了,隻需要兩個鎖存器和一個非門。注意clock端連接著兩個點。
下一個例子裏麵我們將會用到這個觸發器。
(譯者補充:作者在這個例子用的是開關,效果是,當且僅當clock端的開關由開狀態變為關狀態時,輸出端狀態才會改變,並且隻會變成和D端相同的狀態。
這裏有個衍生:如果你把開關換成2個壓力板,會發現結果變得直觀而且很有意思!當從右往左走經過2個壓力板的時候,輸出保持為開,然後再從從左往右返回的時候,輸出變為關。一個實用的應用就是,進門自動開門/燈,出門自動關門/燈。如果要改變順序的話,隻要簡單把兩個壓力板的連接反一下就行。
用按鈕操縱的開關 Pushbutton Toggle
雖然Impervium控製台(Impervium consoles)好棒好棒的,不過有時候你會因為某些原因而想要用按鈕來開關某樣東西,但是按鈕發射的是一個脈衝信號,那我們怎麼用按鈕來製作一個開關裝置呢?
有一個辦法就是使用我們剛才介紹過的觸發器,不同的是還要加入一個我們之前在振蕩器中用過的非門。
這樣就創建了一個狀態機,其輸出狀態與它之前的狀態相反:
Q[n] = NOT( Q[n-1] )
按鈕就是這個狀態機的時鍾信號,每按一下按鈕就會引入一個脈衝信號,用來更新狀態。
如果我們使用一個鎖存器,在有按鈕脈衝的時候,輸出狀態會改變好幾次。由於觸發器是邊沿敏感,隻有在每次脈衝的時候才會更新,所以我們需要的是一個觸發器,而不是一個鎖存器。
交易室 Trading Room
Eht和我用按鈕開關做了一個交易室。Starbound目前還沒有用於交易機製,所以我想,製作一個不依賴於信譽係統的交易方式會很有意思。下麵是它的工作原理:
1. 兩個玩家從各自的一邊進入房間,然後關上他們身後的門。門隻能從內側來控製。
2. 左邊的玩家在上麵,而右邊的玩家在下麵,兩個人都各自在兩扇門之間扔下一個物品。當另一個玩家也已經扔下他的物品的時候,你需要站到壓力板上,表示你已經做好準備來完成交易了。
3. 兩個玩家都需要站在各自的壓力板上,以便讓站在上方的玩家按一下那個按鈕,這會切換所有門的狀態(使用了2個切換狀態機)。這樣就可以防止你接觸到你所扔下的物品,同時讓你可以去撿起對方玩家扔下的物品。兩個玩家交換了位置,從另一個玩家的那扇門出去。
關於振蕩器(亦稱時鍾)的說明
你可以用不同於之前的鎖存器時鍾的方法來創建時鍾。
一個相當緩慢的時鍾就是定時器元件(遊戲自帶的Timer,譯者注),它大約每秒閃爍一次。你可以在輸入端輸入1來凍結它的狀態。
最快的振蕩器就是把非門首尾相連。我們可以叫它1-clock[單周期](從Minecraft術語那偷來的),因為每次閃爍之間隻有一個非門的延遲。
把奇數個非門串聯在一起,就可以創建3-clock[3周期]、5-clock[5周期],以此類推,很明顯這些會慢3倍和5倍。使用偶數個則會創建一個穩定的回路,這是沒用的。
Kudos to MeMyselfAnDie for how to control odd-numbered clocks. It hadn't occurred to me in the first version of this note.(恕我無能,這句實在不知道什麼意思……MeMyselfAnDie似乎是官方論壇上的某個人)
如果你想要偶數周期的時鍾,利用與門添加一個使能電路:
如果你想要一個非常非常緩慢而且可控的時鍾,最好的辦法就是用觸發器。把前麵的“按鈕開關”裏的按鈕換成計時器(timer),然後把輸出端連接到另一個按鈕開關的clock端,將可以慢兩倍,繼續連接直到最後變得足夠慢。做出來的這個裝置叫做二進製計數器,我已經在這個帖子裏貼出了一個4位二進製計數器。
(這張圖位於原帖12L)
這個方法遠比慢時鍾更高效,因為隨著門數量的增加,緩慢程度會呈幾何增長,而不是鏈式的線性變化。