FPGA-计数器

news2024/9/19 7:26:44

前言

之前一直说整理点FPGA控制器应用的内容,今天就从计数器这个在时序逻辑中比较重要的内容开始总结一下,主要通过还是通过让一个LED闪烁这个简单例子来理解。

寄存器

了解计数器之前先来认识一下寄存器。寄存器是时序逻辑设计的基础。时序逻辑能够避免组合逻辑存在的竞争和冒险问题,使电路系统更加稳定。而寄存器的基础是D触发器。

  • D触发器:
    在一个脉冲信号的变化沿(上升或下降沿),将信号从输入端送到输出端。且若脉冲的边沿一直没有出现,即使输入信号变化,输出信号也一直不变。同时寄存器拥有复位与清零功能。
  • 下面以使用FPGA通过寄存器“点亮一个LED灯”的信号变化为例说明:首先理解一下几个概念同步复位,异步复位,延一拍
    同步复位
    所谓同步,就是和工作时钟同步进行,如下图的蓝色框里面,当复位信号(rst_n)拉低后,输出信号(led_out)只有在工作时钟信号(clk)的上升沿时来回拉低复位。
    在这里插入图片描述
    异步复位
    和同步复位略有不同,异步复位不关注工作时钟是否到达变化沿(上升或者下降)。如下图蓝色框框中,当复位信号(rst_n)被拉低,输出信号(led_out)立刻被拉低,而不同于上面的还要等待工作时钟的上升沿到来后再变化。
    在这里插入图片描述
    延一拍
    如下图蓝色框框里面,输入信号(key_in)在复位后第一个时钟的上升沿到来时拉高,但是此时输出信号(led_out)并没有跟着变化。在组合逻辑中,这种变化时是同步的。这就涉及到一个叫“延一拍”的术语。
    首先理解下两个“时间”:
    建立时间(Tsu):触发器的时钟信号上升沿到来之前,数据稳定不变的最小时间。
    保持时间(Th):触发器的时钟信号上升沿到来之后,数据稳定不变的最小时间。
    在进行时序逻辑仿真时,如果时钟和数据是对齐的,默认当前时钟采集到的数据为在该时钟上升沿前一时刻的值。也可以理解为仿真寄存器按照建立时间最大(一个时钟周期),保持时间最小(0)来进行。(在进行组合逻辑仿真时,数据变化大部分时候都是和时钟直接对齐的)。
    在这里插入图片描述
  • FPGA通过D触发器实现“点亮LED灯”:
    软件平台:Quartus II开发软件
    硬件平台:EP4CE10F17C8征途Mini FPGA开发板
    编写同步触发器代码和仿真代码后得到以下仿真结果。可以观察到:复位信号变为高电平和时钟上升沿是对齐的。由于“延一拍”,此时采集到的复位信号时上升沿前一时刻的低电平值(0),寄存器处于复位状态,输出led_out保持低电平。
    在下一个时钟上升沿到来之前,复位信号变为了高电平(1),输入为高电平,输出为高电平。通过打印文件也可以看出:输出信号(led_out)和输入信号(key_in)存在着“延一拍”的关系。输入数据在前一个时钟的上升沿变化,输出数据不变,而在下一刻时钟的上升沿变化。
    在这里插入图片描述
    在这里插入图片描述

计数器

  • 作用
    对脉冲的个数进行计数,通过计数器的计数值精确计算各种信号之间的时间关系,通过计数器精确控制各个信号的变化和持续时间等。
  • 实例
    使用计数器让LED每隔1s闪烁一次(亮0.5s,熄灭0.5s):
    设计思路:
    核心:什么时候开始计数,什么时候清零。(开始计数可以默认没有什么条件,只要复位撤销,时钟沿来到即可。清零:以50Mhz时钟为例,一个周期为20ns,也就是1s时间内计50000000个数,从0开始计数,也就是0-49999999。)
    提炼出来也就是1s内让电平翻转一次,也就是计数到一半的时候(24999999)电平翻转一次。可以据此来绘制波形变化图:
    其中N=24999999,复位信号(rst_n)一直有效时,计数器(cnt)计到N就清零,同时输出信号(led_out)取反。实现LED闪烁的效果。
    在这里插入图片描述
    仿真波形:
    在这里插入图片描述
    不知道为啥计数没显示出来。
    上面是不带标志信号的计数器,还有一个带有标志信号的计数器,波形图如下图所示:
    相较于上面那个波形,这里多了一个标志信号(cnt_flag),这个脉冲信号指示计数器计数到N-1,当计数到N-1的时候,输出信号先不翻转,一个时钟周期,输出信号再取反。这里这个标志信号计数到N或者N-1时候都行,但计数到N-1更精准,在参考书中说这里给出的脉冲标志信号的作用是节约逻辑资源,同时也能够让代码更加清晰简洁。
    在这里插入图片描述
    编写RTL代码,仿真,全编译后上板测试
    LED闪烁效果:
    在这里插入图片描述
    在这里插入图片描述

FPGA编译与上板验证流程:

设计波形
新建工程
编写RTL代码
查看RTL视图
编写仿真文件
仿真设置
Modelsim仿真观察
添加引脚约束
全编译
JTAG下载网表到开发板(切忌带电插拔JTAG接口)
程序固化

小结

今天主要是参考野火的这块Mini FPGA开发板的一些资料对时序逻辑设计中的这个计数器进行了一些梳理与总结。计数器的核心思想自己总结其实就是将时间顺序量化后再发挥其作用。因为自己后面还需要用FPGA来实现好几个还比较复杂的大工程,所以这个系列慢慢也会写一些文章。文中用到的一些代码并没有贴出来。可以参考野火这块板子官方提供的一些资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android C++系列:Linux信号(三)

可重入函数 不含全局变量和静态变量是可重入函数的一个要素可重入函数见man 7 signal在信号捕捉函数里应使用可重入函数在信号捕捉函数里禁止调用不可重入函数例如:strtok就是一个不可重入函数,因为strtok内部维护了一个内部静态指针,保存上一 次切割到的位置,如果信号的捕捉…

android Invalid keystore format

签名的时候提示:Invalid keystore format. 点击info查看更多日志 再点击一次 stactrace 查看更多提示 提示:javaio异常 基本是jdk版本的问题,高jdk版本打的key,在低版本jdk开发环境上无法使用。 查看自己的key信息 keytool -list -v -keys…

Redis实现用户会话

1.分布式会话 (1)什么是会话 会话Session代表的是客户端与服务器的一次交互过程,这个过程可以是连续也可以是时断时续的。曾经的Servlet时代(jsp),一旦用户与服务端交互,服务器tomcat就会为用户创建一个session&#…

【C++】深入理解函数重载:C语言与C++的对比

文章目录 前言1. 函数重载:概念与条件1.1 什么是函数重载1.2 函数重载的条件1.3 函数重载的注意点 2. 函数重载的价值2.1 书写函数名方便2.2 类中构造函数的实现2.3 模板的底层实现 3. C语言与C的对比3.1 C语言不支持函数重载的原因3.2 C支持函数重载的原因 4. Linu…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号(重要): 1、在mysql没啥区别 2、在pgsql中,实际字符串用单引号,双引号相当于mysql的,用来包含关键字; -- 单引号,表示user_name的字符串实际值 insert into t_user(user_nam…

AP ERP与汉得SRM系统集成案例(制药行业)

一、项目环境 江西某医药集团公司,是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今,企业经营一直呈现稳健、快速发展的态势, 2008 年排名中国医药百强企业前 20 强,2009年集团总销售额约38亿元人民币…

vscode搭建PyQt + Quick开发环境

VScode搭建PyQt Quick开发环境 目录 环境准备 🔔安装必要的Python包 🔔🔎 PyQt5和PySide2的区别💾 安装PyQt5💾 安装PySide2 配置VScode 🔔💻 安装扩展 代码示例 🔔✔ Python调用Qt…

【JavaScript 算法】滑动窗口:处理子数组问题

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现示例问题1:最长无重复字符子串示例问题2:长度最小的子数组注释说明: 三、应用场景四、总结 滑动窗口(Sliding Window)是一种高效解决数组…

Java多线程-----线程安全问题(详解)

目录 🍇一.线程安全问题的引入: 🍒二.线程安全问题产生的原因: 🍌三.如何解决线程安全问题: 🎉1.synchronized关键字: 🦉sychronized关键字的特性: ✨2.volatile关键字: &#…

03 Git的基本使用

第3章:Git的基本使用 一、创建版本仓库 一)TortoiseGit ​ 选择项目地址,右键,创建版本库 ​ 初始化git init版本库 ​ 查看是否生成.git文件(隐藏文件) 二)Git ​ 选择项目地址&#xff0c…

数据隔离级别查询一致导致重复退款

Transactionalpublic void updateAfsState() {String no "500001880002";OrderReturn orderReturnDb orderReturnModel.getOrderReturnByAfsSn(no);log.info("1.该售后单状态:{}" , orderReturnDb.getState());if(orderReturnDb.getState().e…

【人工智能】机器学习 -- 贝叶斯分类器

目录 一、使用Python开发工具,运行对iris数据进行分类的例子程序NaiveBayes.py,熟悉sklearn机器实习开源库。 1. NaiveBayes.py 2. 运行结果 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库,使用贝叶斯分类器…

vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口

1、如果路由的mode是history模式的要加上框框里的哪句,然后配置下面的location router location / {root /usr/local/app/dist/; #vue文件dist的完整路径try_files $uri $uri/ router;index index.html index.htm;}#error_page 500 502 503 504 /50x.html;lo…

缓存弊处的体验:异常

缓存(cache),它是什么东西,有神马用,在学习内存的时候理解它作为一个存储器,来对接cpu和内存,来调节cpu与内存的速度不匹配的问题。 缓存,一个偶尔可以听到的专业名词,全…

深入理解FFmpeg--软/硬件解码流程

FFmpeg是一款强大的多媒体处理工具,支持软件和硬件解码。软件解码利用CPU执行解码过程,适用于各种平台,但可能对性能要求较高。硬件解码则利用GPU或其他专用硬件加速解码,能显著降低CPU负载,提升解码效率和能效。FFmpe…

Leetcode双指针法应用

1.双指针法 文章目录 1.双指针法1.1什么是双指针法?1.2解题思路1.3扩展 1.1什么是双指针法? 双指针算法是一种在数组或序列上操作的技巧,实际上是对暴力枚举算法的一种优化,通常涉及到两个索引(或指针)从两…

ubuntu 安装图形化界面

前言: 如果在首次安装操作系统的时候是最小化安装,可以参照本文进行安装 安装图形化界面软件包 下载源最好提前换成国内源 sudo apt-get install ubuntu-desktop设置图形化启动 sudo systemctl set-default graphical.target重启系统 reboot验证&…

《Techporters架构搭建》-Day02 集成Mybatis-plus

集成Mybatis-plus Mybatis-plus集成Mybatis-plus步骤小结 Mybatis-plus Mybatis-plus官网 MyBatisPlus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它引入了一些新的特性&…

免费的数字孪生平台助力产业创新,让新质生产力概念有据可依

关于新质生产力的概念,在如今传统企业现代化发展中被反复提及。 那到底什么是新质生产力?它与哪些行业存在联系,我们又该使用什么工具来加快新质生产力的发展呢?今天我将介绍一款为发展新质生产力而量身定做的数字孪生工具。 新…

java学校--Object类方法--toString

第一点解析: 全类名就是包名加类名 getClass().getName()是得到其包名和类名如图,包名是com.hspedu.object_类名是Monster。 Integer.toHexString(hashCode());是得到其…