概述
本文以異步時序計數器為例,用Verilog實現以\(JK\)觸發器組成的8421BCD碼十進制異步計數器,並用ModelSim軟件進行仿真驗證.
電路分析
實現8421BCD碼十進制計數器可分為同步時序和異步時序,分析方法類似,本文采用較為簡單的異步時序進行講解,關於同步時序實現方法可以參考相關資料.
下圖為異步時序實現的該計數器的邏輯電路圖.
可以根據邏輯電路圖寫出激勵方程
\[\begin{cases}J_0=K_0=1\\J_1=\overline{Q_3^n},K_1=1\\J_2=K_2=1\\J_3=Q_1^nQ_2^n,K_3=1\end{cases}\tag{*} \]
將\((*)\)式帶入\(JK\)觸發器的特征方程可得該電路的狀態方程
\[\begin{cases}Q_0^{n+1}=\overline{Q_0^n}\cdot CP\\Q_1^{n+1}=\overline{Q_3^n}\overline{Q_1^n}Q_n^n\\Q_2^{n+1}=\overline{Q_2^n}Q_1^n\\Q_3^{n+1}=\overline{Q_3^n}Q_2^nQ_1^nQ_0^n\end{cases}\tag{**} \]
設定\(Q_3^nQ_2^nQ_1^nQ_0^n=0000\)為初始狀態,按照\((**)\)式可寫出狀態轉移表
可見這是一個模值為\(10\)的計數器,下面討論能否自啟動,將未使用的六個狀態一同考慮在內,可得完整的狀態轉移圖
可見此電路可以自啟動.(上圖中箭頭旁的\(/0\)和\(/1\)非本例內容,可忽略)
至此該電路的邏輯已經基本摸清,下面可以開始用代碼實現了.
代碼實現
首先給出同步復位\(JK\)觸發器的實現代碼
module JK
(input CK
,input RST
,input J
,input K
,output reg Q
);
always@(negedge CK)
if(RST)
Q<=0;
else
case({J,K})
2'b00:Q<=Q;
2'b01:Q<=1'b0;
2'b10:Q<=1'b1;
default:Q<=~Q;
endcase
endmodule
接下來通過例化模塊可輕松地實現邏輯電路,通過之前推導地邏輯表達式,編寫代碼如下
module Cnt8421
(input CK
,input RST
,output[3:0]Q
);
JK FFI(CK,RST,1,1,Q[0]);
JK FFII(Q[0],RST,~Q[3],~Q[3],Q[1]);
JK FFIII(Q[1],RST,1,1,Q[2]);
JK FFIV(Q[0],RST,Q[1]&Q[2],Q[3],Q[3]);
endmodule
至此已完成電路功能實現.
下面進行仿真驗證,仿真文件如下
`timescale 1 ns/ 1 ns
module Cnt8421_vlg_tst;
reg CK=0,RST=1;
wire[3:0]Q;
Cnt8421 UUT(CK,RST,Q);
initial#1 RST=0;
always#1 CK<=~CK;
endmodule
非常簡單的仿真文件,邏輯就是一開始先按下復位鍵令電路初始化,然后開始隨着時鍾邊沿進行計數操作,波形如下圖
可見電路功能正常,驗證無誤.
參考文獻
[1] 劉培植.《數字電路與邏輯設計(第2版)》[M].北京:北京郵電大學出版社.2013.205