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