[FPGA]Verilog实现JK触发器组成的8421BCD码十进制计数器
概述
本文以异步时序计数器为例,用Verilog实现以触发器组成的8421BCD码十进制异步计数器,并用ModelSim软件进行仿真验证.
电路分析
实现8421BCD码十进制计数器可分为同步时序和异步时序,分析方法类似,本文采用较为简单的异步时序进行讲解,关于同步时序实现方法可以参考相关资料.
下图为异步时序实现的该计数器的逻辑电路图.
可以根据逻辑电路图写出激励方程
将式带入触发器的特征方程可得该电路的状态方程
设定为初始状态,按照式可写出状态转移表
可见这是一个模值为的计数器,下面讨论能否自启动,将未使用的六个状态一同考虑在内,可得完整的状态转移图
可见此电路可以自启动.(上图中箭头旁的和非本例内容,可忽略)
至此该电路的逻辑已经基本摸清,下面可以开始用代码实现了.
代码实现
首先给出同步复位触发器的实现代码
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现