學會正反器之後,我們該應用一下了吧!之前提到正反器是一種有記憶的電路,透過這種電路,我們可以有不同的初始狀
態。而我們要介紹的計數器就是其中一種應用。
以 0 ~ 7 計數器來說明。如果以純組合電路來實作,第一秒後,計數器顯示 1 ,但是下一秒他又會是 1 ,因為每次電路結束,計數器就會被初始化為 0 ,而不是接續著計數。因此計數器仰賴正反器來記錄前一個數值,如此就可以實現不同功能的計數器。
今天我們介紹兩種計數器:Johnson Counter, Ring Counter 。這兩種計數器並不是像我們認知的計數器一樣,從 1 開始,接著 2, 3, ...,而是遵照內部訂定的的規則來計數,我覺得是很特別的應用。
這種計數器的中文是「詹森計數器」,但我還是習慣以英文來稱呼他。先來看看他的電路圖吧!(圖片來源:Javatpoint)
從圖上可以看到 Johnson Counter 的規則其實沒有很複雜,簡單來說就是不斷地往右位移 (shift right) ,而最右邊的位元則是反轉之後放到最左邊的位置。假設四位元初始狀態為 0000 ,那麼下一個狀態為 1000, 1100, ...,最後又會回到 0000。
Johnson Counter 的實作方式大致可以分成兩種:
第一種方式我認為是較困難的,因為我們首先要對正反器的原理有基本的認識,再者在引用模組時,時常發生因觀念不清導致語法錯誤的問題,需要花更多時間來完成。第二種方式就簡單多了!無需太多數位邏輯的概念就可以完成,這也是 Verilog 的強大之處。不過,之後再實作時,我糊欸選用第一種方式,較具有挑戰性。、
這種計數器叫做「環形計數器」。而種計數器的規則就如其名,不斷將數值做「向右的邏輯位移」(logical right shift) ,就像環形一般。假設四位元初始狀態為 0010 ,那麼下一個狀態就是 0001, 1000, 0100, 0010,如此不斷循環下去。先來看一下電路圖吧! (圖片來源:Wikipedia)
其實 Ring Counter 跟 Johnson Counter 極相似,不同之處只在於最後一個正反器的輸出是否需要加一個 Not-Gate ,僅此而已。因此做法近乎相同,我們會在下一篇實作這兩種計數器。
這兩種計數器其實是比較特別的計數器,其實計數器還有許多種,如: mod-N 計數器。mod-N 計數器就是平常常見的計數器,可以從 0 數到 N-1 ,共經過 N 個數。另外計數器為了求更加彈性,我們會新增更多功能,如:enable, reset 等。計數器也可分成同步計數器和非同步計數器,取決於時脈的設定。因此計數器千變萬化,大家可以試著設計不同的計數器!