当前位置: 首页 > backend >正文

FPGA前瞻篇-计数器设计与实现实例

这是本篇文章的设计目标如下所示:
这个 Counter 模块是一个LED 闪烁计数器,设计目标是:
当输入时钟 clk 为 50 MHz 时,每 0.5 秒翻转一次 LED 灯状态。

随后我们开始补充理论知识。

        计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路。下面我们以一个 3 位计数器来学习下计数器的基本组成和相关知识,首先我们画出 3 位计数器的电路结构图。

我们以 F1 F2 F3 代表 3 D 触发器,两个异或门 G1 G2 1 个与门 G3 来进行说明计数器是如何工作的。一般触发器是有复位信号(图中没有画出),在上电复位之后,电路上电的 Q0 Q1 Q2 初始状态是 000,下面我们来看下这三个D 触发器此时的输入信号是什么。
我们先看 F1 F1 的输入信号 D ,是由 Q0 反馈回来的,我们已知此时的 Q 0 ,那么 ` Q 就是 1 ,这个 1 反馈给 F1 输入信号 D ,此时 F1 的输入信号就是 1
下面我们再来看 F2 F2 的输入信号是 Q0 Q1 的值经过一个异或门之后得到的,我们已知此时的 Q0 是 0 Q1 也是 0 ,那么这两个 0 经过异或门逻辑处理(异或门两个输入信号值相同输出 0 ,不同输出 1 )后就是 0 了,因此 F2 的输入信号也是 0
再看 F3,F3 的输入信号是由 Q0 和 Q1 经过一个与门之后的输出值,与 Q2 的值相异或得到的,我们来看,Q0 和 Q1 都是 0,两个 0 相与,输出肯定还是 0,这个输出的 0,再与 Q2 的值相异或,根据异或门的规律,两个输入现在都是 0,那么异或门的输出也是 0,F3 的输入此时就是 0。
到这里,我们已经分析出了 F1 F2 F3 这三个触发器此时的输入值了,下面我们就可以根据 D 触发器的逻辑规律知道下一刻电路的输出值了,现在我们给 CLK 端口一个上升沿,也就是 CLK 0 变为 1 了,那么 3 个边沿 D 触发器将会同时触发,当 CLK 这个时钟信号的上升沿到来时, D 触发器的输入值将会被锁存,根据逻辑规律,下一刻 3 D 触发器的输出值就分别为 1 0 0 。这里如果我们把 Q2 的值当
做二进制数的最高位,把 Q0 的值当做二进制数的最低位,那么现在计数器所输出的值,就是二进制数 001,也就是十进制的 1 。计数器接收到第一个时钟信号的上升沿后,计数器就输出二进制数 001 ,依次类推,如果第二个时钟信号的上升沿到来时,这个时候计数器将会输出二进制数 010 ,也就是十进制数 2 , 每当电路多到来一个时钟上升沿,计数器就会作加 1 运算。当电路计到第 8 个脉冲时,电路状态将由 111 又变为 000 ,完成一个循环周期,所以该电路也称为模 8 同步加法计数器。所谓同步就是指该电路中的四个边沿型 D 触发器共用一个时钟脉冲 CLK ,当时钟上升沿到来时,它们能够同时触发。
时钟沿数Q2Q1Q0二进制值F3_D输入F2_D输入F1_D输入
初始000000001
↑1001001010
↑2010010011
↑3011011100
↑4100100011
↑5101101110
↑6110110101
↑7111111000
↑8000000001
...

Q0, Q1, Q2 分别是 F1, F2, F3 的输出;

F1_D输入 = ~Q0,即直接来自 Q0 的反向;

F2_D输入 = Q0 ^ Q1

F3_D输入 = (Q0 & Q1) ^ Q2

接下来就是程序设计了,如下所示:

信号名类型说明
clkinput时钟信号(假设为50 MHz)
rst_ninput异步低电平复位信号
ledoutput reg控制LED状态,高亮或熄灭

这个 Testbench 的目标是:

Counter 模块提供时钟和复位信号;

观察 LED 信号是否按照设计(每经过一定计数周期翻转)工作;

进行一次完整的仿真,并在仿真 1ms 后结束。

接着我们回到Vivado,如下所示仿真效果可见。

http://www.xdnf.cn/news/5625.html

相关文章:

  • Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)
  • Mosaic数据增强技术
  • 大规模k8s集群怎么规划
  • Spring IoCDI
  • matlab simulink双边反激式变压器锂离子电池均衡系统,双目标均衡策略,仿真模型,提高均衡速度38%
  • 大语言模型训练的两个阶段
  • 神经网络是如何工作的
  • Linux 文件权限管理
  • 【Leetcode】系列之206反转链表
  • 工具篇-如何在Github Copilot中使用MCP服务?
  • 进程相关面试题20道
  • Python中操作Neo4j图数据库
  • JMV 优化过程是什么?有什么效果?为什么要升级垃圾收集器?
  • 数据结构与算法——单链表01
  • Spark处理过程-转换算子和行动算子(四)
  • React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程
  • 图形化编程如何从工具迭代到生态重构?
  • HAProxy + Keepalived + Nginx 高可用负载均衡系统
  • NVIDIA Quantum-2 QM9700系列利用400G infinniband扩展数据中心智能开关
  • 高并发场景下的BI架构设计:衡石分布式查询引擎与缓存分级策略
  • MySQL 分页查询优化
  • ultralytics框架计算大中小目标检测精度
  • uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
  • matlab 读取数字高程模型DEM并可视化
  • 进程和线程
  • Node和npm初学
  • HTTPS全解析:从证书签发到TLS握手优化
  • 算法-单调栈
  • 【Linux笔记】——进程信号的产生
  • arduinoIDE核心库更新导致的ESP32开发板神秘接口更换和三方库冲突