0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

最为常见的分频器分4种分析

FPGA之家 来源:博客园 作者:super_star123 2021-06-13 17:11 次阅读

分频器是用的最广的一种FPGA电路了,我最初使用的是crazybingo的一个任意分频器,可以实现高精度任意分频的一个通用模块,他的思想在于首先指定计数器的位宽比如32位,那么这个计数器的最大值就是2^32=4294967296,

假设系统时钟为50MHz,那么假如要想实现输出频率为fout,那么可以使用的频率控制字为:

K满足关系:

ad35649a-c5fc-11eb-9e57-12bb97331649.png,那么设计计数器在每个时钟上升沿累加的值为K,当计数值为2^31时,clkout=1;否则clkout=0.最终即可以实现任意频率的输出,精度的计算方法为当K=1时,可以得到clkout=0.0116415321826934814453125Hz,也即是说可以输出的最小频率为0.011Hz

此外我们最为常见的分频器分为以下4种分析:

1.偶数分频

最简单,要想得到分频系数为N的频率输出,设定一个计数器,这个计数器从零开始加1,当加到N/2-1时计数器清零,或者clkout翻转,以此循环,即可实现偶数倍分频。

2.奇数分频(分占空比不确定以及占空比50%)

方法一:分频系数为N,占总比不确定:以三(N)分频为例,上升沿触发计数,计数器计数到1(N-1)/2时输出时钟翻转,计数到2(N-1)时再次翻转。代码为产生1/11占空比为十一分频时钟:在计数值为9和10时均反转时钟,是产生抽样脉冲的有效方法:

always @(posedge clk or posedge rst) begin

if(rst)begin //复位

cnt《=0;

clk_div11《=0;

end

elseif(cnt==9) begin

clk_div11《=~clk_div11; //时钟翻转

cnt《=cnt+1; //继续计数

end

elseif(cnt==10) begin

clk_div11《=~clk_div11; //时钟翻转

cnt《=0; //计数清零

end

else

cnt《=cnt+1;

end

占空比50% ,则可以在上面的基础上,加上一个下降沿触发计数,然后将上升沿和下降沿产生的时钟进行相或运算,即可得到奇数分频输出。

reg clk1;

reg[1:0]cnt1;

always@(posedge clk or posedge rst) begin

if(rst)begin //复位

cnt1《=0;

clk1《=0;

end

elseif(cnt1==1) begin

clk1《=~clk1; //时钟翻转

cnt1《=cnt1+1; //继续计数

end

elseif(cnt1==2) begin

clk1《=~clk1; //时钟翻转

cnt1《=0; //计数清零

end

else

cnt1《=cnt1+1;

end

reg clk2;

reg[1:0]cnt2;

always@(negedge clk or posedge rst) begin

if(rst)begin //复位

cnt2《=0;

clk2《=0;

end

elseif(cnt2==1) begin

clk2《=~clk2; //时钟翻转

cnt2《=cnt2+1; //继续计数

end

elseif(cnt2==2) begin

clk2《=~clk2; //时钟翻转

cnt2《=0; //计数清零

end

else

cnt2《=cnt2+1;

end

assign clk_div3=clk1 | clk2; //或运算

方法二:对进行奇数倍n分频时钟,先进行n/2分频,然后在二分频得到(这部分先讲半整数分频)

亲测有效代码:

module ModuloN_Cntr(input clk,rst,output clk_out);

reg [1:0]cnt1;

reg [1:0]cnt2;

reg temp1,temp2;

always@(posedge clk or negedge rst)

begin

if(~rst)

begin

cnt1《=0;

temp1《=0;

end

else

begin

if(cnt1==2)

begin

temp1《=1;

cnt1《=0;

end

else

begin

cnt1《=cnt1+1;

temp1《=0;

end

end

end

always@(negedge clk or negedge rst)

begin

if(~rst)

begin

cnt2《=0;

temp2《=0;

end

else

begin

if(cnt2==2)

begin

temp2《=1;

cnt2《=0;

end

else

begin

cnt2《=cnt2+1;

temp2《=0;

end

end

end

assign clk_out=temp1|temp2;

endmodule

仿真波形:

3.半整数分频

半整数指的是N+0.5分频器设计:先进行模N+1计数,计数到N时输出时钟赋值为1,然后当计数到0时,输出时钟赋值为0,因此保持计数值为N的时间为半个时钟周期即为设计的关键,从中可以发现,计数器是在时钟的上升沿计数,那么我们可以让时钟在计数值为N时,将计数触发时钟翻转,时钟的下降沿变为上升沿,因此计数值为0,所以每产生一个N+0.5分频时钟周期,触发时钟都要翻转一次,以2.5分频为例程序如下:

//异或运算

assignclk_in=clk^clk_div2;

//模3计数器

reg clk_out;

reg [1:0]cnt;

always@(posedge clk_in or posedge rst) begin

if(rst)begin //复位

cnt《=0;

clk_out《=0;

end

elseif(cnt==1) begin

clk_out《=~clk_out; //时钟翻转

cnt《=cnt+1; //继续计数

end

elseif(cnt==2) begin

clk_out《=~clk_out; //时钟翻转

cnt《=0; //计数清零

end

else

cnt《=cnt+1;

end

//2分频

reg clk_div2;

always@(posedge clk_out or posedge rst) begin

if(rst) clk_div2《=0; //复位

else clk_div2=~clk_div2;

end

那么5.5分频呢:

代码:通用的这里N=5;

module ModuloN_Cntr(clk,clk_div,temp1,temp2);//N+0.5

input clk;

output clk_div;

reg[31:0]cnt1=0;

reg[31:0]cnt2=0;

output reg temp1,temp2;

initial begin temp1=0;temp2=1;end //首先进行初始化,temp1=0;temp2=1

parameter N=5; //设定分频系数为N+0.5

always @(posedge clk) //temp1上升沿跳变

begin

if(cnt1==2*N) //2*N

begin cnt1[31:0]《=32‘d0;end

else begin cnt1[31:0]《=cnt1[31:0]+32’d1;end

if(cnt1==32‘d0) begin temp1《=1;end //高电平时间为N+1;

if(cnt1==N+1) begin temp1《=0;end //低电平时间为N;

end

always@(negedge clk) //temp2下降沿跳变

begin

if(cnt2==2*N) //2*N

begin cnt2[31:0]《=32’d0;end

else begin cnt2[31:0]《=cnt2[31:0]+32‘d1;end

if(cnt2==32’d0) begin temp2《=0;end //低电平时间为N;

if(cnt2==N) begin temp2《=1;end //高电平时间为N+1;

end

assign clk_div=temp1&&temp2; //逻辑与

endmodule

//如果要进行N+0.5分频

//思路:总的来说要进行N+1+N=2N+1次分频

//在时钟的上升沿和下降沿都进行跳变

//上升沿进行占空比为N+1比N的时钟temp1;

//下降沿进行占空比为N比N+1的时钟temp2;

//最后div=temp1&&temp2 即可得到所需要的半整数分频

仿真波形:

4.任意小数分频

小数分频器的实现方法有很多中,但其基本原理都一样的,即在若干个分频周期中采取某种方法使某几个周期多计或少计一个数,从而在整个计数周期的总体平均意义上获得一个小数分频比。一般而言,这种分频由于分频输出的时钟脉冲抖动很大,故在设计中的使用已经非常少。但是,这也是可以实现的。以8.7倍分频为例,本文仅仅给出双模前置小数分频原理的verilog代码及其仿真图(如图6),具体原理可以参考刘亚海的《基于FPGA的小数分频器的实现》以及毛为勇的《基于FPGA的任意小数分频器的设计》。

//8分频

reg clk_div8;

reg[2:0]cnt_div8;

always@(posedge clk or posedge rst) begin

if(rst)begin //复位

clk_div8《=0;

cnt_div8《=0;

end

elseif(cnt_div8==3‘d7) begin

clk_div8《=1; //置1

cnt_div8《=0;

end

elseif(cnt_div8==3’d0) begin

clk_div8《=0; //置0

cnt_div8《=cnt_div8+1;

end

else

cnt_div8《=cnt_div8+1;

end

//9分频

reg clk_div9;

reg[3:0]cnt_div9;

always@(posedge clk or posedge rst) begin

if(rst)begin //复位

clk_div9《=0;

cnt_div9《=0;

end

elseif(cnt_div9==3‘d8) begin

clk_div9《=1; //置1

cnt_div9《=0;

end

elseif(cnt_div9==3’d0) begin

clk_div9《=0; //置0

cnt_div9《=cnt_div9+1;

end

else

cnt_div9《=cnt_div9+1;

end

//控制信号

parameterDiv8Num=3;

reg ctrl;

reg[3:0]AddValue;

always@(posedge clk or posedge rst) begin

if(rst)begin //复位

ctrl《=0;

AddValue《=10-7;

end

elseif(AddValue《10) begin

ctrl《=0;

AddValue《=AddValue+Div8Num;

end

else begin

ctrl《=1;

AddValue《=AddValue-10;

end

end

//选择输出

reg clk_out;

always @(ctrlor posedge clk or posedge rst) begin

if(rst) clk_out《=0; //复位

elseif(ctrl) clk_out《=clk_div8;

elseclk_out《=clk_div9;

end

4、总结分频器是FPGA的基础,而且在FPGA逻辑电路设计的时候是经常使用的,希望大家对以上的整数倍分频和半整数倍分频能熟练掌握

原文标题:关于分频器的FPGA实现整理思路

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21328

    浏览量

    593265
  • 分频器
    +关注

    关注

    43

    文章

    433

    浏览量

    49319

原文标题:关于分频器的FPGA实现整理思路

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    分频器的作用 分频器的功率是不是越大越好

    分频器是一种电子设备,用于将输入信号分成不同频率的输出信号。其主要作用是将原始输入信号分离成多个频率范围内的信号,以供不同的电路进行处理。分频器广泛应用于通信、测量和音频系统中。 分频器的主要
    的头像 发表于 02-01 11:19 764次阅读

    CAN时钟分频器在CANbus模块上不执行任何操作的原因?

    我一直在使用 dsPIC33CH128MP506 进行一些 CANbus 通信。 它能够进行CAN-FD,并且有两个独立的波特率分频器,用于标称波特率和数据波特率。它们是:C1NBTCFGH 内
    发表于 01-22 06:36

    如何实现一种占空比为50%的奇数分频器设计呢?

    在进行数字电路设计的过程中,分频器是设计中使用频率较高的一种基本设计之一
    的头像 发表于 11-07 17:29 988次阅读
    如何实现一种占空比为50%的奇数<b class='flag-5'>分频器</b>设计呢?

    FPGA学习-分频器设计

    分频器设计 一:分频器概念 板载时钟往往 是 有限个( 50MHZ/100MHZ/24MHZ/60MHZ… ),如果在设计中需要其他时钟时,板载时钟不满足时,需要对板载时钟进行分频 / 倍频,目的
    的头像 发表于 11-03 15:55 575次阅读
    FPGA学习-<b class='flag-5'>分频器</b>设计

    Sigma-Delta小数分频PLL中的分频器该怎么做?

    文献给出的分频器结构如图1所示。该分频器最高输入频率(f~in~)为16.3GHz,也就是一个周期只有(T~in~,T ~in~ = 1/ f~in~)61.3ps。
    的头像 发表于 10-31 12:54 950次阅读
    Sigma-Delta小数<b class='flag-5'>分频</b>PLL中的<b class='flag-5'>分频器</b>该怎么做?

    模拟IC设计原理图3:数字分频器的原理和电路原理图

    学完了寄存器,我们就可以基于寄存器设计除存储外具有实用功能的电路了。在这里我们来讨论一下,数字分频器
    的头像 发表于 10-30 15:30 1400次阅读
    模拟IC设计原理图3:数字<b class='flag-5'>分频器</b>的原理和电路原理图

    倍频器和分频器的主要作用

    倍频器和分频器是两种常见的频率转换电路,它们的用途有一定的不同之处。
    的头像 发表于 07-14 09:27 944次阅读

    分频器常见用途

    分频器是一种电子设备,其主要作用是将输入信号的频率降低到较低的频率。它通过将输入信号分为若干个等分的周期,每个周期输出一个脉冲或波形,从而实现对输入信号频率的降低。
    的头像 发表于 07-14 09:26 884次阅读

    使用IC555和IC4013构建的分频器电路

    曾经遇到过这样一种情况,即您只有一个特定频率的信号源,需要获取多个频率的信号。如果是,这种电路可能是您需要在设计中使用的电路。上述电路是一个分频器,能够通过一定的因素对输入时钟频率进行分频。该分频器
    的头像 发表于 07-02 11:47 878次阅读
    使用IC555和IC4013构建的<b class='flag-5'>分频器</b>电路

    029lan的pwm预分频器设置最少要为1吗,即2分频,设为0时没有输出是为什么?

    如题,这样一来,pwm的时钟哪怕是来自HCLK(029不支持PLL作为pwm时钟)最高50MHZ,经预分频器最少2分频的话,时钟最高只有25Mhz了?M0518pwm的预分频器可以设为0,不
    发表于 06-19 08:14

    在Verilog HDL中使用分频器的8位计数器的设计

    电子发烧友网站提供《在Verilog HDL中使用分频器的8位计数器的设计.zip》资料免费下载
    发表于 06-15 10:14 0次下载
    在Verilog HDL中使用<b class='flag-5'>分频器</b>的8位计数器的设计

    171 分频器电路怎么看?配合实物不难明白#硬声创作季

    分频器
    或许
    发布于 :2023年06月05日 17:54:15

    请叫大神帮我画出分频器电路图

    买了一个国产某jbl品牌的音箱,感觉唱歌声音发闷,不好听。分频器照片在这,拜托,谁能帮我画出电路图,我分析一下,红色白色蓝色黑色一边的4颗线接4个高音喇叭的,看起来这
    发表于 06-01 22:41

    FPGA分频器的设计方法

    FPGA分频器是一种常用于数字信号处理、通信系统、雷达系统等领域的电路,其作用是将信号分成多个频段。
    发表于 05-22 14:29 1210次阅读
    FPGA<b class='flag-5'>分频器</b>的设计方法

    基于51单片机的分频器1(计数器实现)例程源代码

    基于51单片机的分频器1(计数器实现)例程源代码
    发表于 05-18 09:54 2次下载