首页 > 其他分享 >数字IC手撕代码-分频器(任意奇数分频)

数字IC手撕代码-分频器(任意奇数分频)

时间:2022-09-22 11:15:20浏览次数:35  
标签:采样 分频 分频器 clk 50% 占空比 IC

  大家好我是酸菜鱼,这个系列着重讲解数字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相或改成相与。 

 

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

 

标签:采样,分频,分频器,clk,50%,占空比,IC
From: https://www.cnblogs.com/jerry-caiyu/p/16718468.html

相关文章

  • 数字IC手撕代码-分频器(任意小数分频)
    什么是分频    分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。        再简单来说,让你手撕一个四分频......
  • 数字IC手撕代码-序列检测(移位寄存器写法)
    大家好我是酸菜鱼,这个系列着重讲解数字ic或FPGA实习面试及秋招面试的高频手撕代码题。本文具体内容涉及:利用移位寄存器写序列检测。        一说到序列检测,你脑......
  • 数字IC手撕代码-序列检测(状态机写法)
    大家好我是酸菜鱼,这个系列着重讲解数字ic或FPGA实习面试及秋招面试的高频手撕代码题 具体内容涉及:        一说到序列检测,你脑子里要立马跳出两种解法,一种是状......
  • elasticsearch生成证书的两种方式
    1.elasticsearch-certgen方式注意:这种方式如果以后新增节点导致证书得重新生成并放到es所有节点2.elasticsearch-certutil方式##(1)创建证书$pwd/alidata1/admin......
  • static关键字
    static为编程语言中的一个关键字,是一种修饰符,既可以修饰变量也可以修饰方法在类中,用static声明的成员变量为静态成员变量,也称之为类变量,类变量的生命周期和类相同,在整个......
  • Java并发编程解析 | 基于JDK源码解析Java领域中并发锁之同步器Semaphore,CyclicBarrier
    苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享......
  • JAVA字符串转Unicode编码
    importjava.util.ArrayList;publicclassHello{publicstaticvoidmain(String[]args){Strings="我爱JAVA";System.out.println(s2uni......
  • Python commandline-config简洁命令行配置工具: 一个供用户以Python Dict或JSON格式编
    本文介绍了一个可以直接用pip安装的python工具包commandline-config,适合经常写python代码跑实验的研究生们,工具可以通过Python原生字典dict(支持嵌套)的形式来写实验的参数配......
  • static
    一静态局部变量静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整......
  • 有关static关键字的探究
    static为编程语言中的一个关键字,是一种修饰符,既可以修饰变量也可以修饰方法在类中,用static声明的成员变量为静态成员变量,也称之为类变量,类变量的生命周期和类相同,在整个应......