热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于数字IC的手动编写任意奇数分频器代码

本文详细探讨了数字IC设计中手动编写的任意奇数分频器代码。分频技术是指通过特定算法生成一个新时钟信号,其频率为原有时钟信号频率的某个奇数倍分之一。在数字IC或FPGA的实习和面试中,分频器的设计是一个常见的高频考题。本文不仅介绍了分频的基本原理,还提供了详细的代码实现步骤,帮助读者更好地理解和掌握这一关键技术。

  大家好我是酸菜鱼,这个系列着重讲解数字ic或FPGA实习面试及秋招面试的高频手撕代码题。

什么是分频

        分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。

  再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。

 

   如上图所示,就是一个四分频电路的波形,四分频后,新的clk_out的频率是原来的1/4,也即周期是原来的4倍,从图中可以看到,clk每过4个周期,clk_out过1个周期。

奇数分频 

  先易后难,拿三分频举例再推广到任意奇数分频。怎么写一个三分频呢?一个占空比不是50%的三分频是好写的,同样利用一个cnt变量对上升沿计数来实现。比如实现占空比为1/3的三分频,那么只要数一个上升沿,输出高电平,数两个上升沿输出低电平就能解决。 

 

 

  代码如上,除去rstn信号操作外,其实写一个三分频就几行,容易出错的点是:什么时候把 clk_out 拉高,什么时候把 clk_out 拉低,才能实现题目要求的占空比?!

        最不容易出错的方法,就是自己画波形,画出波形后,自己多演算几个周期,刚开始写要画画波形,之后熟练了可能在脑子里过一下就知道写多少,所以还不熟悉的情况下不要偷懒,画波形,就像下面贴出的波形图一样,写出计数器 cnt 的值以及对应的波形走势就不会出错。 

那么如何实现一个占空比50%的三分频呢?

        答:将一个占空比1/3 上升沿采样的三分频和一个占空比1/3下降沿采样的三分频结果,做或运算。

        什么意思?怎么想到这样做的?下面来解答!

        任何奇数 2N-1 (除1分频外)分频都可以表示由 N-1个高电平周期和 N个低电平周期组成。(占空比最接近50%,但小于50%)

        写两个这样的分频器,一个上升沿采样的分频器——div1,一个下降沿采样的分频器——div2,在相同 cnt 判断切换高低电平的条件下,就一定有 div1 领先(或滞后)于 div2 半个参考周期,这样他们相与后会使得新的结果还是 2N-1 分频,但是高电平周期变为 N-1+1/2,低电平周期变为 N-1/2,从而高低电平持续时间相等,实现50%占空比的任意奇数分频器。  

 

 

如上图所示,从上往下分别为,原始时钟信号clk,或运算结果 clk_out,上升沿采样七分频信号 clk_out1,下降沿采样七分频信号 clk_out2。(assign clk_out = clk_out1 | clk_out2)

        下面就以七分频为例,写一个占空比为50%的奇数分频器。 

 

 testbench: 

 

 

到此,我们就实现了任意50%占空比的奇数分频器,总结一下。说了那么多我们已经可以独立写出任意合理占空比的偶数分频器,以及任意50%占空比的技术分频器。但是,如果让手撕一个不是50%占空比的奇数分频器怎么办??

        我在看2022数字IC秋招面经的时候,就看到有个人面试被问了一个非常规占空比的奇数分频器,比如 3/10占空比的五分频, 5/18占空比的九分频?怎么做呢。

        其实聪明的人已经想到了,这个和上面实现50%任意奇数分频器的原理是类似的,但是采用与运算。用占空比为 2/5 上升沿采样的信号和 2/5占空比下降沿采样的信号相与,这样由于下降沿采样信号滞后上升沿采样信号半个参考周期。

        所以相与后,占空比就为 2/5 - 1/10 = 3/10 ,示意图如下: 

 

  明白了这个原理,那么同样的道理5/18占空比的九分频也不在话下了。

        下面给出 5/18 占空比的九分频代码:

代码:

 

 

testbench: 

 

   5/18占空比的九分频就是用上升沿采样的3/9占空比九分频 和下降沿采样的3/9占空比九分频相与,最后结果为3/9-1/18 = 5/18 占空比。具体修改只需要改cnt判断数值以及把clk_out 的赋值从clk_out1,clk_out2相或改成相与。 

 

 具体波形如上,和我们的分析一致,任意占空比的小数分频手撕代码到此结束。 

 



推荐阅读
  • 本文探讨了Windows 10 64位系统的实际使用体验,并与Windows 7进行了详细对比,旨在帮助用户了解两者之间的主要差异及选择合适的操作系统。 ... [详细]
  • HBase 数据复制与灾备同步策略
    本文探讨了HBase在企业级应用中的数据复制与灾备同步解决方案,包括存量数据迁移及增量数据实时同步的方法。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 解决Win10系统显示模糊问题的方法
    Windows 10作为一款深受用户喜爱的操作系统,提供了丰富的个性化设置选项,让每位用户都能根据个人偏好定制系统界面。然而,在进行个性化设置的过程中,有时会出现显示模糊的情况,影响用户体验。本文将详细介绍如何有效解决Win10系统显示模糊的问题。 ... [详细]
  • 拨打电话时遇到‘正在通话’或无人接听的情况解析及解决方法
    当您尝试联系他人时,可能会遇到电话提示‘正在通话’或是虽然接通但无人应答的情况。本文将详细解释可能的原因,并提供相应的解决策略。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • 如何在PyCharm中配置Python脚本的默认模板
    本文介绍如何在PyCharm中设置Python脚本的默认模板,以便每次创建新的.py文件时自动填充预设内容,提高开发效率。 ... [详细]
  • 当需要确保对象的状态在创建后不可更改时,使用记录(Record)类型是一个理想的选择。本文探讨了如何通过记录类型实现对象的不可变性,并提供了一个简单的示例来说明其用法。 ... [详细]
  • 本文详细介绍了FLV播放器的构建过程,包括如何解析FLV标签并将这些标签传递给解码器,以及如何在Qt环境中注册共享指针的信号和槽机制。 ... [详细]
  • 团支部的概念及其职能
    本文详细介绍了团支部的基本概念、组织结构以及其在共青团体系中的重要职能。 ... [详细]
  • 在开发一个网页音乐播放器时遇到问题,需要从不同源读取MP3文件的ID3标签信息,包括流派、歌手和歌曲名称等。尝试使用PHP未果后转而考虑使用JavaScript进行跨域读取,但不清楚具体配置方法,寻求技术指导。 ... [详细]
  • 探索《冯诺依曼传》:天才与时代的交响
    本文深入探讨了《冯诺依曼传》,通过分析这位20世纪杰出科学家的生平,揭示其对现代科技及理论科学的深远影响。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
author-avatar
卜土杠烟2502932477
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有