verilog分频计数器分频原理怎么写

基于Verilog的双数、奇数、半整数分频以及任意分频器设计 - Verilog当前位置:& &&&基于Verilog的双数、奇数、半整数分频以及任意分频基于Verilog的双数、奇数、半整数分频以及任意分频器设计&&网友分享于:&&浏览:0次基于Verilog的偶数、奇数、半整数分频以及任意分频器设计在FPGA的学习过程中,最简单最基本的实验应该就是分频器了。由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行分频。比如如果FPGA芯片晶振的频率为50MHz,而我们希望得到1MHz的方波信号,那么就需要对晶振产生的信号进行50分频。
分频器的设计虽然是FPGA学习过程中最简单的实验,但是真正想要把分频器的来龙去脉弄清楚,还是需要花费一番功夫的。下面先介绍一下最常见的几种分频器写法:& 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_
reg [<span style="color: #:<span style="color: #]
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt &= <span style="color: #'b0;
clk_out &= <span style="color: #'b0;
else if(cnt == <span style="color: #'d9)
cnt &= <span style="color: #'b0;
clk_out &= ~clk_
else cnt &= cnt + <span style="color: #'b1;
endmodule&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_
reg clk_p, clk_n;
reg [<span style="color: #:<span style="color: #] cnt1, cnt2;
//注意根据实际需要调整位宽
parameter N = <span style="color: #;
//此处N可以设为任意奇数
//用上升沿产生非50%占空比的分频信号clk_p
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt1 &= <span style="color: #;
clk_p &= <span style="color: #;
else if(cnt1 == <span style="color: #'b10)
//cnt_p == (N-1)/2,翻转
cnt1 &= cnt1 + <span style="color: #'b1;
clk_p &= ~clk_p;
else if(cnt1 == <span style="color: #'b100)
//cnt_p == N-1,翻转
cnt1 &= <span style="color: #'b0;
clk_p &= ~clk_p;
else cnt1 &= cnt1 +<span style="color: #'b1;
//用下降沿产生非50%占空比的分频信号clk_n
always @(negedge clk or negedge rst_n)
if(!rst_n)
cnt2 &= <span style="color: #;
clk_n &= <span style="color: #;
else if(cnt2 == <span style="color: #'b10)
//cnt_n == (N-1)/2,翻转
cnt2 &= cnt2 + <span style="color: #'b1;
clk_n &= ~clk_n;
else if(cnt2 == <span style="color: #'b100)
//cnt_n == N-1,翻转
cnt2 &= <span style="color: #'b0;
clk_n &= ~clk_n;
else cnt2 &= cnt2 +<span style="color: #'b1;
//相与运算,得到50%占空比的分频信号
assign clk_out = clk_p | clk_n;
endmodule3.半分频器(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 = <span style="color: #; //以12.5分频为例,N=13
wire clk1;
reg[<span style="color: #:<span style="color: #]
reg flag = <span style="color: #'b0;
//系统时钟clk计数器
always @(negedge clk or negedge rst_n)
if(!rst_n) flag &= <span style="color: #'b0;
else if(cnt == <span style="color: #'d6) flag &= ~
//在第五个时钟结束后立即将 clk1 状态翻转
assign clk1 = (flag)? ~clk:
//时钟 clk1 计数器,模为N
always @(posedge clk1 or negedge rst_n)
if(!rst_n) cnt &= <span style="color: #'b0;
else if(cnt == <span style="color: #'d12) cnt &= 5'b0;
else cnt &= cnt + <span style="color: #'b1;
//前6.5个周期为低电平,后6个周期为高电平,
//即为12.5分频
always @(posedge clk1 or negedge rst_n)
if(!rst_n) clk_out &= <span style="color: #'b0;
else if(cnt == <span style="color: #'d0) clk_out &= 1'b0;
else if(cnt == <span style="color: #'d7) clk_out &= 1'b1;
else clk_out &= clk_
网上还有许多其他大神写的半分频程序,比如:&4.任意分频——基于相位累加原理
相位累加器主要用在直接数字频率合成器(DDS)中,其中的几个主要的参数为输入频率fc,输出频率fo,计数器位宽N,频率控制字K(即计数器递增步长)。它们之间的关系为:fo=(fc*K)/(2^N)。假设输入频率fc为50MHz,计数器位宽N为32,要产生1kHz的信号,则K=(fo*2^N)/fc=85.9*fo=85900。当计数值小于等于((2^N)/2)时,输出低电平,当计数值大于((2^N)/2)时,输出高电平,依次循环,就可以产生占空比为50%的1kHz信号了。据此可以设计如下程序:&任意分频示例,输出1kHz,占空比50%
/***************************************
晶振频率 fc = 50MHz
输出频率 fo = 1kHz(根据需要可以设为任意值)
控制参数 K
= (fo*2^N)/fc
参数 N = 2^32,(32为计数器的位宽)
****************************************/
module div_free(clk_out, clk, rst_n);
input clk, rst_n;
output clk_
reg [<span style="color: #:<span style="color: #]
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt &= <span style="color: #;
else cnt &= cnt + <span style="color: #'d85900;
//计数器步长 K
always @(posedge clk or negedge rst_n)
if(!rst_n)
clk_out &= <span style="color: #'b0;
else if(cnt & <span style="color: #'h7FFF_FFFF)
clk_out &= <span style="color: #'b0;
else clk_out &= <span style="color: #'b1;
12345678910
12345678910
12345678910 上一篇:下一篇:没有了文章评论相关解决方案 12345678910 Copyright & &&版权所有怎么用verilog实现1&#47;2分频?从2HZ到4HZ_百度知道温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
给自己一份好心情,让世界对着我微笑,给别人一份好心情,让生活对着我微笑!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1250)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Verilog实现时钟的奇数分频',
blogAbstract:'偶数倍分频通过计数器便可以实现,对于奇数倍分频,实现方法为:产生N计数(N为奇数),在任意计数(&1 & &N)时翻转,实现占空比不为50%的N分频时钟。若是需要产生占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数到某一个值',
blogTag:'分频',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'给自己一份好心情,让世界对着我微笑,给别人一份好心情,让生活对着我微笑!',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 计数器内外分频区别 的文章

 

随机推荐