基于Verilog的任意分频器设计

在FPGA的学习过程中,最简单最基本的实验应该就是分频器了。由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行分频。比如如果FPGA芯片晶振的频率为50MHz,而我们希望得到1MHz的方波信号,那么就需要对晶振产生的信号进行50分频。
分频器的设计虽然是FPGA学习过程中最简单的实验,但是真正想要把分频器的来龙去脉弄清楚,还是需要花费一番功夫的。下面先介绍一下最常见的几种分频器写法:

操作方法

  • 01

    1.偶数分频器 相信大多数朋友在学习FPGA过程中接触到的第一个实验应该就是偶数分频器了,偶数分频器的设计较为简单,用一个简单的计数器就可以实现。比如要实现一个N分频(N为偶数)的分频器,可以先写一个计数器,当计数到(N/2-1)时,让输出状态翻转,并将计数器清零,这样输出的信号就是输入时钟的N分频了。具体代码如下: 偶数分频器示例,20分频即N=20,占空比50% module clk_div(clk_out, clk, rst_n); input clk, rst_n; output clk_out; reg clk_out; reg [4:0] cnt; always @(posedge clk or negedge rst_n) if(!rst_n) begin cnt <= 5'b0; clk_out <= 1'b0; end else if(cnt == 4'd9) begin cnt <= 5'b0; clk_out <= ~clk_out; end else cnt <= cnt + 1'b1; endmodule

  • 02

    2.奇数分频器 奇数分频器的设计比偶数分频器复杂一些,特别是占空比为50%的奇数分频器。如果对占空比没有明确的要求,则可以直接对上升沿计数,计数到(N-1)/2 时让输出翻转,计数到(N-1)时让输出状态再次翻转,并将计数器清零,这样就可以得到一个占空比为2:3的N分频(N为奇数)的分频器。而如果要实现50%的占空比,可以通过“错位相或”的方法实现。具体方法是用刚才的方法先通过对上升沿计数产生一个占空比为不是50%的N分频器,再用同样的方法对下降沿计数产生一个占空比也不是50%的N分频器,最后将这两个分频器的输出进行“或”运算,就可以得到占空比为50%的奇数N分频器,具体实现代码如下: 奇数分频器示例,5分频,占空比50% module div_odd(clk_out, clk, rst_n); input clk, rst_n; output clk_out; reg clk_p, clk_n; reg [4:0] cnt1, cnt2;  //注意根据实际需要调整位宽 parameter N = 5;  //此处N可以设为任意奇数 //用上升沿产生非50%占空比的分频信号clk_p always @(posedge clk or negedge rst_n) if(!rst_n) begin cnt1 <= 0; clk_p <= 0; end else if(cnt1 == 5'b10)        //cnt_p == (N-1)/2,翻转 begin cnt1 <= cnt1 + 1'b1; clk_p <= ~clk_p; end else if(cnt1 == 5'b100)        //cnt_p == N-1,翻转 begin cnt1 <= 1'b0; clk_p <= ~clk_p; end else cnt1 <= cnt1 +1'b1; //用下降沿产生非50%占空比的分频信号clk_n always @(negedge clk or negedge rst_n) if(!rst_n) begin cnt2 <= 0; clk_n <= 0; end else if(cnt2 == 5'b10)        //cnt_n == (N-1)/2,翻转 begin cnt2 <= cnt2 + 1'b1; clk_n <= ~clk_n; end else if(cnt2 == 5'b100)        //cnt_n == N-1,翻转 begin cnt2 <= 1'b0; clk_n <= ~clk_n; end else cnt2 <= cnt2 +1'b1; //相与运算,得到50%占空比的分频信号 assign clk_out = clk_p | clk_n; endmodule

  • 03

    3.半分频器(N+0.5分频) 在实际工程中,我们还经常会遇到半分频器。比如要得到2MHz的时钟信号,而系统晶振频率为25MHz,这时候就需要对系统时钟作12.5分频。那么这种半分频器又该如何实现呢?最直接的办法当然还是用计数器了,由于半整数分频无法实现50%的占空比(因为50%占空比就要求一个周期内高低电平都是6.25个系统时钟周期,这个0.25是不可能实现的),我们只能让占空比尽可能接近50%。以12.5分频为例,可以对系统时钟计数,在前6.5个周期输出低电平,后6个周期输出高电平,依次循环,就可以实现12.5分频,占空比为(6.5/12.5),接近50%。在计数时涉及到0.5个周期,因此对上升沿和下降沿都要计数。具体代码如下: 半分频器,以12.5分频为例,占空比(6.5/12.5) module clk_half(clk_out, clk1, clk, rst_n); input clk,rst_n; output clk_out,clk1; parameter N = 13; //以12.5分频为例,N=13 wire clk1; reg clk_out; reg[4:0] cnt; reg flag = 1'b0; //系统时钟clk计数器 always @(negedge clk or negedge rst_n) if(!rst_n) flag <= 1'b0; else if(cnt == 5'd6) flag <= ~flag; //在第五个时钟结束后立即将 clk1 状态翻转 assign clk1 = (flag)? ~clk:clk; //时钟 clk1 计数器,模为N always @(posedge clk1 or negedge rst_n) if(!rst_n) cnt <= 5'b0; else if(cnt == 5'd12) cnt <= 5'b0; else cnt <= cnt + 1'b1; //前6.5个周期为低电平,后6个周期为高电平, //即为12.5分频 always @(posedge clk1 or negedge rst_n) if(!rst_n) clk_out <= 1'b0; else if(cnt == 5'd0) clk_out <= 1'b0; else if(cnt == 5'd7) clk_out <= 1'b1; else clk_out <= clk_out; endmodule

(0)

相关推荐

  • 基于行为模式的产品设计

    作为设计师是否常常会困惑,明明访谈做了,数据也分析了,为什么辛苦设计的产品或功能还是没人用,行为的底层逻辑或许能给出答案.了解影响用户行为发生的关键因素,也能帮助我们在设计工作中更从容. 行为类型概述 ...

  • 【2018下半场】设计趋势之抽象设计,赶快上车

    有价值的设计总会归来 在产品设计领域,或许有人认为已经到了成熟阶段,已没有太多空间进行创新. 但事实上,由于品牌需要新鲜的东西持续吸引用户的注意力,新的设计或者对旧设计的改造依旧层出不穷.那些真正实用 ...

  • 20款覆盖全面的响应式网站设计工具

    灵活的栅格和布局,响应式的图片和智能的CSS媒体查询,构成了响应式网页的主要特征。当用户扔下沉重的笔记本电脑拿起平板,响应式的网站能够自然而然地随之适配,掏出手机也毫无压力,图片和文字都会随着特定的屏 ...

  • VR界面设计实践指南

    小编:@C7210 VR硬件设备正爆发式发展,做为UI设计师在此领域的跟进也需时时,以下这篇是关于VR界面设计的实践指南,希望对你有帮助. 一篇VR实践指导文章.Smashing Magazine好久 ...

  • 2016年网页插画设计趋势

    说插画已经彻底接管了网页设计似乎有点过,但是技术发展和用户需求使得网页插画在世界范围内流行起来,一点都不为过.从全屏式页面当中的首页Banner图到视差滚动式页面中的微妙动画,你会发现插画在这些设计作 ...

  • 正在疯狂流行的摩登复古设计风

    经常听欧美音乐的同学可能听过Peter Allen 1985年的爵士音乐<Everything old is new again>,关于流行和复古之间的关系,同样可以用这首歌的名字来描述, ...

  • 为设计师而生——导航设计总结

    一.写在前面 作为设计师想要设计出足够优秀的作品,除了拥有熟练的技能外,还需要拥有出众的创造力和审美.如果对万事万物没有足够丰富的体验和感受,没有对美的认知和体会,是很难提高层次,做出满意的设计的. ...

  • UX黑名单!有哪些常见的移动端UX设计误区需要规避?

    我们手机里面装满了各种各样的APP.安装这些应用,我们的初衷是让我们的生活更加便捷.但是当这些应用无法满足用户的需求的时候,用户自然而然会离开,并寻求更好的解决方案.一个成功的应用包含有诸多元素,而其 ...

  • 关于2017年的设计趋势,13个设计预言

    小编:@Chase Buckley  "你首先得并参与设计当下, 才能构建未来的体验."作为设计师要有一双可以捕捉到未来趋势的眼睛,展望未来,现在越来越注重用户体验.当我们将细节渗 ...