Starbound 暫存器和觸發器 基礎實例教學

6 1 月

廣告

作者:♂天空の遺跡

來源:starbound吧

 

前言:

對於完全不懂或者稍微懂一些數位電路的人來說,其實我的建議是:不需要去仰慕那些別人做出來的什麼什麼觸發器,什麼什麼解碼器。你所需要的,不是在遊戲裡造出一個運算器,而是做出一些實用的東西來!

而實用的東西,其實用到的電路並不難,關鍵是創意和想法。
比如這篇教程是我在官方論壇上看到的一篇非常不錯的教程,作者由淺入深給大家展示暫存器(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,所以只需要一個輸出端就行)

我知道你一定在想:“這真是極好的!但是我到底該怎麼去用這玩意?”
好問題!暫存器有很多的用處,這裡就有幾個基礎的例子。

 

暫存器最簡單也是最常用的用途就是“鎖住”某樣東西,我用一個陷阱來當例子。

如果我走上一個壓力板,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位元二進位計數器。

這個方法遠比慢時鐘更高效,因為隨著門數量的增加,緩慢程度會呈幾何增長,而不是鏈式的線性變化。

我希望你會喜歡這篇教程。如果你對我所寫的有什麼疑問,或者對於我之後教程的建議,回復就可以了。

 

 


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。