热门标签 | 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相或改成相与。 

 

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

 



推荐阅读
  • 成都服务器租赁适用于哪些网站业务部署——Vecloud专业解析
    成都,作为四川省的省会,不仅是西南地区唯一的副省级城市,也是国家重要的高新技术产业基地和商贸物流中心。Vecloud专业解析指出,成都服务器租赁服务特别适合各类网站业务的部署,尤其是需要高效、稳定和安全的在线应用。无论是电子商务平台、内容管理系统还是大数据分析,成都的服务器租赁都能提供强大的支持,满足不同企业的需求。 ... [详细]
  • 《村夜》译文与原文赏析:宋代诗人陆游的乡村夜景诗作解析 ... [详细]
  • CSS伪类详解:定义与应用
    本文将深入解析CSS伪类的定义及其应用场景。CSS伪类通过为已存在的元素在特定状态下添加特殊样式,能够动态响应用户的交互行为,从而提升网页的视觉效果和用户体验。 ... [详细]
  • 在数字图像处理中,Photoshop 的直方图是一个重要的工具,它能够精确地反映图像中不同亮度级别的分布情况。通过分析直方图,用户可以深入了解图像的曝光、对比度和色调范围,从而进行更精细的调整。直方图不仅模拟了物体表面反射光线的原理,还能帮助摄影师和设计师更好地掌握图像的明暗细节,优化视觉效果。 ... [详细]
  • 深入浅出:PHP 中的 unset() 函数解析与应用
    本文深入解析了 PHP 中的 `unset()` 函数,详细介绍了其功能和应用场景。`unset()` 函数用于释放指定的变量,语法格式为 `void unset(mixed $var[, mixed $var[, ...]])`。通过具体示例,文章展示了如何在实际开发中有效使用 `unset()` 来管理内存和变量状态,帮助开发者提高代码效率和程序性能。 ... [详细]
  • 如何在您的计算机上配置Python和PyCharm开发环境
    本文详细介绍了在Windows 10系统上配置Python和PyCharm开发环境的步骤。内容包括Python的安装与卸载、PyCharm的安装与卸载,以及如何在Windows 10中通过双击安装文件“python-3.7.2-amd64.exe”来完成Python的安装。此外,还提供了关于环境变量配置和基本设置的实用建议,帮助用户快速搭建高效的开发环境。 ... [详细]
  • 2020年美国流感病例显著下降,创历史新低水平
    在2020年10月至2021年5月期间,美国的流感感染率降至自1997年以来的历史最低点。全球范围内报告的流感病例也极为罕见,专家们普遍认为,这一现象主要归因于为防控COVID-19而广泛采取的公共卫生措施,如佩戴口罩、保持社交距离和加强个人卫生等,这些措施有效抑制了流感病毒的传播。 ... [详细]
  • Java排序算法详解:选择排序、插入排序、冒泡排序与递归实现
    本文详细解析了Java中的几种基础排序算法,包括选择排序、插入排序和冒泡排序,并探讨了递归在这些算法中的应用。选择排序通过每次找到未排序部分的最小值并将其置于已排序部分的末尾来实现;插入排序则通过逐步将每个元素插入到已排序序列的正确位置;而冒泡排序则是通过多次遍历数组,两两比较并交换相邻的元素,最终使较大的元素逐渐“冒”到数组末尾。文章还提供了具体的代码示例,帮助读者更好地理解和掌握这些算法的实现细节。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 斯坦福大学公开课:利用神经网络技术实现自动驾驶的案例分析
    斯坦福大学的公开课深入探讨了如何利用神经网络技术实现自动驾驶。课程中通过实例展示了汽车如何通过学习算法自主驾驶。具体而言,课程展示了一幅图解,其中左下角显示了汽车前方的实时路况图像,而左上角则呈现了一个水平的菜单栏,用于展示系统处理和决策的过程。这一案例详细解析了神经网络在自动驾驶中的应用,为学生提供了宝贵的实践参考。 ... [详细]
  • 如何在Windows 10中彻底禁用用户账户控制弹窗
    如何在Windows 10中彻底禁用用户账户控制弹窗 ... [详细]
  • 《唐姚合诗作〈买太湖石〉的翻译与原文赏析》 ... [详细]
  • 这是一道涉及数学计算的问题。假设步行速度为 \(a\),车速为 \(b\),总距离为 \(c\)。Teddy 的步行时间为 \(T_1\),WhereIsHeroFrom 的步行时间为 \(T_2\),总时间为 \(T\)。通过分析不同时间段内的速度变化,可以得出最优的车辆使用策略,以最小化总的旅行时间。具体来说,需要计算在不同情况下步行和乘车的时间分配,以确保整体效率最大化。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 《唐耿湋〈晚秋东游寄猗氏与解县二位明府〉译文及原文赏析》 ... [详细]
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社区 版权所有