概述
前言:
本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。
目录如下:
1.数字IC手撕代码-分频器(任意偶数分频)
2.数字IC手撕代码-分频器(任意奇数分频)
3.数字IC手撕代码-分频器(任意小数分频)
4.数字IC手撕代码-异步复位同步释放
5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)
6.数字IC手撕代码-序列检测(状态机写法)
7.数字IC手撕代码-序列检测(移位寄存器写法)
8.数字IC手撕代码-半加器、全加器
9.数字IC手撕代码-串转并、并转串
10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)
11.数字IC手撕代码-有限状态机FSM-饮料机
12.数字IC手撕代码-握手信号(READY-VALID)
13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)
14.数字IC手撕代码-泰凌微笔试真题
15.数字IC手撕代码-平头哥技术终面手撕真题
16.数字IC手撕代码-兆易创新笔试真题
17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)
18.数字IC手撕代码-双端口RAM(dual-port-RAM)
...持续更新
为了方便可以收藏导览博客: 数字IC手撕代码-导览目录
目录
什么是分频
偶数分频
代码
testbench
波形
什么是分频
分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。
再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。
如上图所示,就是一个四分频电路的波形,四分频后,新的clk_out的频率是原来的1/4,也即周期是原来的4倍,从图中可以看到,clk每过4个周期,clk_out过1个周期。
同理三分频也一样,但是奇数分频会比偶数分频复杂一些,在奇数分频部分会讲。
偶数分频
我们先来讲偶数分频。逐步加大难度,先说二分频,怎么实现二分频呢?
答:检测参考时钟,每一个上升沿到来时,新的时钟翻转一次。即:
always @ (posedge clk or negedge rstn)
if (!rstn)
clk_out <= 1'b0; // 复位置零
else
clk_out <= !clk_out; // 否则q信号翻转
从图中可以看到,clk_out每过两个clk时钟上升沿就flip-flop一次,这样一个clk_out的周期就是clk周期的两倍,也即实现了二分频。
那如果是任意偶数分频呢,这就得数经过了多少上升沿,如果是四分频,那就每过两个时钟上升沿(两周期),新信号flip-flop一次,flip-flop两次为新信号的一个周期,即是周期是原时钟的四倍。同理,8分频就是每数4个上升沿,flip-flop一次,以此类推,可以实现任意偶数分频了。
下面拿8分频举例,贴出代码以及testbench:
代码
testbench
波形
从波形我们可以看到,clk每过4个时钟上升沿,clk_out 翻转一次,和设计的一样,在RTL文件中的 number 是可以修改的,可以改成任意偶数从而实现任意偶数分频(改为2也行,即每次时钟上升沿到来时,if语句一直满足,clk_out 翻转一次,每次时钟上升沿翻转一次,就是我们之前提到的二分频。)注意翻转的时间点是number/2-1!因为当cnt 是从0开始计数的,
当cnt == 3 时(八分频举例),cnt被重置到0,持续一个clk。
检测到上升沿,cnt再持续一个clk,cnt=1。
再检测到上升沿,cnt再持续一个clk,cnt=2。
再检测到上升沿,cnt再持续一个clk,cnt=3。
再检测到上升沿,此时cnt=3,cnt又被置零。
更加直观一些可以把cnt作为div_8这个module的输出信号,查看cnt随时间的变化值,找感觉。
占空比分析:我们上面写的任意偶数分频代码的占空比都是50%,实际上面试手撕代码不会让你50%占空比,那怎么办?
答:进行计数,对于一个八分频,开始就把时钟设为高电平,我用cnt 计数到两个时钟上升沿后再把它拉低,计数到7后cnt 拉低 时钟拉高,这样就实现了两个周期高,六个周期低,占空比为2/8 即 25% 的八分频。
最后
以上就是现代西装为你收集整理的数字IC手撕代码-分频器(任意偶数分频)什么是分频 偶数分频 的全部内容,希望文章能够帮你解决数字IC手撕代码-分频器(任意偶数分频)什么是分频 偶数分频 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复