[FPGA]Verilog实现JK触发器组成的8421BCD码十进制计数器

概述

本文以异步时序计数器为例,用Verilog实现以JK触发器组成的8421BCD码十进制异步计数器,并用ModelSim软件进行仿真验证.

电路分析

实现8421BCD码十进制计数器可分为同步时序和异步时序,分析方法类似,本文采用较为简单的异步时序进行讲解,关于同步时序实现方法可以参考相关资料.

下图为异步时序实现的该计数器的逻辑电路图.

MIfIUI.png

可以根据逻辑电路图写出激励方程

(*){J0=K0=1J1=Q3n¯,K1=1J2=K2=1J3=Q1nQ2n,K3=1

()式带入JK触发器的特征方程可得该电路的状态方程

(**){Q0n+1=Q0n¯CPQ1n+1=Q3n¯Q1n¯QnnQ2n+1=Q2n¯Q1nQ3n+1=Q3n¯Q2nQ1nQ0n

设定Q3nQ2nQ1nQ0n=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

posted @   方清欢  阅读(9180)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示