分频的verilog语言实现.doc_第1页
分频的verilog语言实现.doc_第2页
分频的verilog语言实现.doc_第3页
分频的verilog语言实现.doc_第4页
分频的verilog语言实现.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

分频的Verilog实现1. 分频:在实际应用中,自己设计的开发板上不会去装多个晶振来产生不同频率的时钟信号,这就要我们在已有的基础上自己来创造设计电路中所需要的时钟信号来,有时候所需要的频率并不是在已有的频率上直接进行简单的整数分频就可以得到的,有时需要进行小数的分频。2. 在分频的过程中,偶数分频并不困难,若要进行2N次分频的话,只需要计数到N的时候,波形进行翻转就行了,或者在最后一级加一个2分频也可以实现。下面是我写的一个偶数分频的代码:module div2n(rst,clk,cnt,clk_2n);/偶数次分频input rst,clk;output clk_2n,cnt;reg 3:0 cnt;/刚开始没有定义计数的位宽仿真的时候老是出现输出为0的现象,看似很简单的程序搞的有些纠结啊reg clk_2n;always (posedge clk )beginif(rst) /若复位信号为高电平则计数清零和输出清零begin cnt=0;clk_2n=0;endelse if(cnt=3)/进行8分频,这里的cnt取不同的值进行其他的分频,若计数到达4时从0开始的输出电平翻转begin clk_2n=clk_2n;cnt=0;endelse cnt=cnt+1;endendmodule功能仿真波形以及后仿真波形如下:从后仿真中可以明显的看出输出时钟信号和输入的标准信号有延迟时间,在计数寄存器中出现了相邻两个数之间的竞争,但是没有出现在时钟的上升沿,不会引起最后实现的错误!奇数分频:若奇数分频中不考虑占空比的话,分频代码可以按照偶数分频的思路来写,但是大多数情况下需要考虑的是使占空比设计为50%。若要进行奇数次的分频而且要求占空比为50%可以采用:用两个计数器,一个由输入时钟下降沿触发,一个由输入时钟的上升沿触发,最后将两个计数器的输出进行相或,就可得到。程序代码:module div7(rst,clk,cout1,cout2,cout);input clk,rst;output cout1,cout2,cout;reg 2:0 m,n;/定义两个中间的计数变量wire cout;reg cout1,cout2;assign cout=cout1|cout2;/将上升沿和下降沿的输出相或得到占空比为50%的波形always (posedge clk)/上升沿触发begin if(rst) begin cout1=0;m=0;end/当rst为1时复位else if(!rst) begin if(m=6) begin m=0;end/计数到达7时计数复位else m=m+1;/其他情况计数器正常计数if(m=2) cout1=cout1;/计数到达3时翻转else if(m=5) cout1=cout1;/计数器达到6时再翻转endendalways (negedge clk)/下降沿触发,情况同上begin if(rst) begin cout2=0;n=0;endelse if(!rst) begin if(n=6) begin n=0;endelse n=n+1;if(n=2) cout2=cout2;else if(n=5) cout2=cout2;endendendmodule最后仿真波形:时序仿真波形为:半整数分频:半整数分频N.5的分频。设计的思想是:比如说要实现2.5分频可以先设计一个模3计数器,再设计一个脉冲扣除电路,加在模3计数器之后,每来3个脉冲就扣除半个脉冲,即可实现分频系数为2.5的半整数分频,采用类似的方法,可以实现任意半整数分配器。脉冲扣除是输入频率与2分频输出异或的结果。大致的思路可用下图来分析:clk1=1模N计数器2分频clk2 clkoutclkin5.5分频代码为module xfp(clkin,clr,clkout);input clkin,clr;output clkout;reg clkout,clk1;wire clk2;integer count;xor xor1(clk2,clkin,clk1);/将输出2分频时钟与clk2/6分频时钟相异或得到5.5分频always (posedge clkout or negedge clr)/输出时钟2分频begin if(clr)begin clk1=1b0; endelse clk1=clk1;endalways (posedge clk2 or negedge clr)/将时钟clk2 6分频begin if(clr)begin count=0;clkout=1b0; endelse if(count=5)/改变count的值可实现不同模的分频begin count=0;clkout=1b1;endelse begin count=count+1;clkout=1b0;endend endmodule当然仿真波形比较的简单,只给出功能仿真波形,从波形图中很容易的可以看出是5.5分频,若要改成其他的N.5分频只需将代码中count的赋值就可以了。小数分频:在实际应用中,还会遇到小数分频。总结实现小数分频可以采用两种方法,方法一是:用数字锁相环实现,先利用锁相环电路将输入时钟倍频,然后再利用分频器对新产生的高频信号进行分频得到需要的时钟频率。比如要实现5.7分频,可以先将输入的时钟10倍频,然后再将倍频后的时钟57分频,这样就可以得到精确的5.7的小数分频。方法二是先设计两个不同分频比的整数分频器,然后通过控制两种分频比出现不同次数来获得所需要的小数分频值来实现小数分频。分频比可以表示为N=M/P,其中N表示分频比,M表示分频器输入脉冲数,P表示分频器输出脉冲数。当N为小数分频比时,又可以表示为N=K+10-nX,式中K,n和X都为正整数,n表示为小数的位数。由以上两式可得M=( K+10-nX)P,令P=10n,有M=10nk+X,即在进行10nK分频时多输入X个脉冲。下面给出8.1分频电路的代码module rxs(clk_in,rst,clk_out);/8.1小数分频(89+91)/(9+1)input clk_in,rst;output clk_out;reg clk_out;reg 3:0 cnt1,cnt2;always (posedge clk_in or posedge rst)begin if(rst) begin cnt1=0;cnt2=0;clk_out=0;end/复位清零else if(cnt19) /9次8分频beginif(cnt27) begin cnt2=cnt2+1;clk_out=0;endelse begin cnt2=0;cnt1=cnt1+1;clk_out=1;endendelse begin /1次9分频if(cnt28) begin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论