集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 864|回复: 0

清风陪你学FPGA(3)——分频器

[复制链接]
清风403 发表于 2015-11-13 18:18:51 | 显示全部楼层 |阅读模式
本帖最后由 清风403 于 2015-11-13 18:22 编辑

        最近在面试的时候遇到了这样一个问题,那就是对一个给定的时钟进行分频,比如3分频,4.7分频等,这问题如果之前没遇到过,在面试笔试的时候可能无法第一时间想到解决方案。我总结了一下,分频器可以分为偶分频,奇分频和小数分频,今天我们主要来讨论一下偶数和奇数分频,小数分频我现在的能力不足以给大家讲解(涉及到综合的问题),以后再和大家进行讨论。
        偶分频(二分频为例):
       
        由上面这个示意图可以看出,偶分频还是比较简单的,假设是N分频,那么只需要计数到N/2-1将时钟翻转计数器清零即可,如此循环就可以得到一个偶分频。
        实现代码如下图所示:
       
        tb测试文件如下图:
       
        前仿输出波形:
       
        通过波形可以看出,偶分频已经成功,占空比是50%。

        奇分频:
        其实奇分频也可以按照偶分频来做,但是那样做的占空比不可能是50%,我们来看下图(三分频为例):
       
        根据波形可以看出,clk_out1是修改偶分频而得到的三分频,而clk_out2是我们想要得到的占空比为50%的波形。通过观察波形,clk_out2的低电平是根据clk_in的下降沿而触发的,所以我们自然想到,用always @(posedge  clk_in  or  negedge  clk_in)这个语句进行计数,N分频计数到N就给计数器清零,分频时钟翻转,那么这样到底可不可以呢?我们来做一个实验,代码如下:
       
        编译时我们发现:
       
        always语句中不能对clk_in的上升沿和下降沿同时进行捕获,所以这个方案不可行。但是根据我们的分析又必须用到这两个边沿,所以必须分别放在两个always语句中,那么如何实现呢?
        我们继续观察上面的波形,如果对clk_in的上升沿计数,则必定会出现clk_out1或者~clk_out1的波形,对clk_in的下降沿计数也是如此,我们来重新绘制一下波形:
       
        现在我们得到了一个由上升沿触发,一个由下降沿触发的波形,大家仔细看一下这两个波形和我们的输出波形有什么关系呢,其实就是clk_out3=clk_out1|clk_out2所得到的,现在我们来进行编写代码,代码如下:
       
       
        测试文件用偶分频的测试文件即可。
        前仿输出波形:
       
        后仿输出波形:
       
         我的分享也会发在我的公共号里面,有兴趣的可以扫描一下公共号加一下
       
        好了,今天的分享就到这里。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 02:37 , Processed in 0.057521 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表