[FPGA]Verilog實現JK觸發器組成的8421BCD碼十進制計數器


概述

本文以異步時序計數器為例,用Verilog實現以\(JK\)觸發器組成的8421BCD碼十進制異步計數器,並用ModelSim軟件進行仿真驗證.

電路分析

實現8421BCD碼十進制計數器可分為同步時序和異步時序,分析方法類似,本文采用較為簡單的異步時序進行講解,關於同步時序實現方法可以參考相關資料.

下圖為異步時序實現的該計數器的邏輯電路圖.

MIfIUI.png

可以根據邏輯電路圖寫出激勵方程

\[\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\)為初始狀態,按照\((**)\)式可寫出狀態轉移表

MIfb28.jpg

可見這是一個模值為\(10\)的計數器,下面討論能否自啟動,將未使用的六個狀態一同考慮在內,可得完整的狀態轉移圖

MIf7PP.jpg

可見此電路可以自啟動.(上圖中箭頭旁的\(/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

非常簡單的仿真文件,邏輯就是一開始先按下復位鍵令電路初始化,然后開始隨着時鍾邊沿進行計數操作,波形如下圖

MITm3q.png

可見電路功能正常,驗證無誤.

參考文獻

[1] 劉培植.《數字電路與邏輯設計(第2版)》[M].北京:北京郵電大學出版社.2013.205


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM