首页 > 其他分享 >设计一个小数(分数)分频电路?

设计一个小数(分数)分频电路?

时间:2023-07-31 20:33:56浏览次数:39  
标签:分数 分频 cnt clk diff reg change 小数

请设计一个小数(分数)分频电路?

例:设计一个3.6的分频电路。

计算原理: N=M.D>1 分频   M整数部分  D小数部分

使用M分频和M+1分频 来构成 M.D分频

设M分频 A次  M+1分频 B次 可得

M*A+(M+1)*B 周期内可看作  [M*A+(M+1)*B] / (A+B)=N 分频

代值可得:

N=3.6   M=3   M+1=4

36/3=10...6  

即: 3*A+4*B=36  和 A+B=10  两式

解的 A=4  B=6

即在36个源时钟内,进行4次3分频,和6次4分频。即可得到3.6分频。

这个方法被称作”双模前置小数分频“,其最重要的核心是M分频和M+1分频这个相近频率。

一般会采用后两种平均插入的方法进行小数分频操作:即进行一次M分频,下一次进行M+1分频,再进行M分频,直到分频结束。这样做的好处:有效避免相位抖动过大。

小数分频代码&激励&仿真波形

module  Fract_div           
#(  
    parameter     NUM     =36     ,
    parameter     DIV_NUM =10
)
(
input     sys_clk       ,        
input     sys_rst_n     ,
output    div_clk
);                                     

parameter   M=NUM/DIV_NUM       ;     // M=36/10=3
parameter   W=M+1               ;    //W=M+1;  4
parameter   S=NUM-M*DIV_NUM     ;   //S=36-30=6

                                    //采用平均插入的方式
reg [7:0]  cnt_change     ;         //可变分频系数
reg [7:0]  cnt            ;         //分频计数器
reg [7:0]  cnt_diff       ;         //差值缓存
reg        div_clk_reg    ;         //输出寄存

wire [7:0] cnt_diff_0     ;         //差值 
wire       cnt_en         ;        //差值新赋值的使能信号

//     差值缓存大于 10    则差值 赋值为 差值缓存-10+6 
//     差值缓存小于 10    则差值 赋值为 差值缓存+6 
assign  cnt_diff_0 =(cnt_diff>=DIV_NUM)?cnt_diff-10+S:cnt_diff+S;
//小数分频运行逻辑如下:
// cnt_diff=0
// cnt_diff_0=6   cnt_change = 2 div_clk_reg 0 0 1  cnt==cnt_change==2 cnt_en=1  cnt_diff=6 
// cnt_diff_0=12  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=12
// cnt_diff_0=8   cnt_change = 2 div_clk_reg 0 0 1  cnt==cnt_change==2 cnt_en=1   cnt_diff=8
// cnt_diff_0=14  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=14
// cnt_diff_0=10  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=10
// cnt_diff_0=6   cnt_change = 2 div_clk_reg 0 0 1 cnt==cnt_change==2  cnt_en=1  cnt_diff=6
// cnt_diff_0=12  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=12
// cnt_diff_0=8   cnt_change = 2 div_clk_reg 0 0 1  cnt==cnt_change==2 cnt_en=1   cnt_diff=8
// cnt_diff_0=14  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=14
// cnt_diff_0=10  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=10
// cnt_diff_0=6   cnt_change = 2 div_clk_reg 0 0 1 cnt==cnt_change==2  cnt_en=1  cnt_diff=6
// cnt_diff_0=12  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=12
// cnt_diff_0=8   cnt_change = 2 div_clk_reg 0 0 1  cnt==cnt_change==2 cnt_en=1   cnt_diff=8
// cnt_diff_0=14  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=14
// cnt_diff_0=10  cnt_change = 3 div_clk_reg 0 0 0 1 cnt==cnt_change==3 cnt_en=1  cnt_diff=10

//规律 M=3 M+1=4  3*A+4*B=36  A+B=10   A=4 B=6 
//平均插入  ABABBABABB  2323323233    这样就平均插入 

//  确定分频系数 在cnt_diff_0小于10 为M-1   在cnt_diff_0大于10 为M
always@(posedge  sys_clk or negedge sys_rst_n)  begin 
    if(!sys_rst_n)
        cnt_change<=M-1;
    else if(cnt_diff_0>=10)
        cnt_change<=W-1;
    else 
        cnt_change<=M-1;
       
end 

//差值新赋值的使能信号 在分频计数器等于可变分频系数有效
assign   cnt_en=(cnt==cnt_change)?1'b1:1'b0;

//在差值新赋值的使能信号有效   差值缓存给差值
always@(posedge  sys_clk or negedge sys_rst_n) begin 
    if(!sys_rst_n)
        cnt_diff<=8'd0;
    else if(cnt_en)
        cnt_diff<=cnt_diff_0;
    else
        cnt_diff<=cnt_diff;
end 

always@(posedge sys_clk or negedge sys_rst_n) begin 
    if(!sys_rst_n)  begin 
        cnt<=8'd0;
        div_clk_reg<=1'b0;
    end 
    else if(cnt==cnt_change) begin   //计数器计数到达预设可变分频系数时 清零
        cnt<=8'd0;                
        div_clk_reg<=1'b1;           //并输出信号拉高 这里可以与下改变占空比
    end 
    else begin 
        cnt<=cnt+8'd1;
        div_clk_reg<=1'b0;          //并输出信号拉低  这里可以与上改变占空比
    end 
end
assign   div_clk=div_clk_reg;

endmodule 
`timescale 1ns/1ns 
module tb_Fract_div();
reg   sys_clk      ;
reg   sys_rst_n    ;
wire  div_clk      ;

initial  begin 
    sys_clk<=1'b0;
    sys_rst_n<=1'b0;
    #20
    sys_rst_n<=1'b1;
end 


always  #10  sys_clk <=~sys_clk;

Fract_div
#(  
    .NUM(36)   ,
    .DIV_NUM(10)
)
Fract_div_inst
(
.sys_clk   (sys_clk  )    ,
.sys_rst_n (sys_rst_n)    ,
.div_clk   (div_clk  ) 
);




endmodule 

 

其中时钟周期有3+4+3+4+4+3+4+3+4+4=36个 源时钟周期为50Mhz  即分频为50/36=1.3888Mhz  完成 3.6分频

 

可以修改激励代码中的分频参数,和设计代码中,调整占空比。

下面为 4.6分频   和 2.3分频 为例。

50/46=1.08695Mhz

46/4=10...6

4*A+5*B=46  A+B=10  解的 A=4 B=6 

平均插入排列: ABABBABABB

50/23=2.1739

23/2=10...3

2*A+3*B=23  A+B=10  解的 A=7 B=3

AABAABAAAB

 若有不对的地方,敬请指正,万分感谢。

参考资料:

1、5.3 Verilog 时钟分频 | 菜鸟教程 (runoob.com)

标签:分数,分频,cnt,clk,diff,reg,change,小数
From: https://www.cnblogs.com/yhm1314/p/17594400.html

相关文章

  • python 将十进制小数转为n进制小数
    Python将十进制小数转为n进制小数在计算机科学中,数字经常以十进制(base-10)表示。这意味着数字由10个不同的数字(0-9)组成。然而,有时我们需要将数字转换为其他进制,例如二进制(base-2)或十六进制(base-16)。在本文中,我们将重点讨论如何将十进制小数转换为n进制小数,其中n是2到36之间的任意......
  • 2023北京市属院校录取分数及市排名
    北京共有28所市属高校,其中4所院校不在本科普通批招生:北京警察学院仅在本科提前批普通A段招生;中国音乐学院和北京舞蹈学院仅在本科提前批艺术A段招生;首钢工学院目前仅在专科普通批招生。表格整理了2023年市属院校在本科普通批招生的24所院校。快来看看2023年各院校在京本科普通批招......
  • 雀魂4 分数计算
    满贯、跳满、役满、倍满 在《雀魂》中,计分是根据麻将的规则和役种来进行的。玩家在游戏中根据和牌时所达成的役种和条件,来计算得分。计分过程如下:役种计分:根据玩家和牌时所满足的役种,为和牌玩家增加相应的番数。每个役种都有对应的番数,番数越高,得分也越高。番数是麻将游......
  • 发票数字转金额大写(保留两位小数)
    数字金额转大写/***description数字转换成大写*params:val=>number*/functiontranslateNumber(val){if(!Number(val)||!val)return0letnum=0letcopyNum=[]if(String(val).includes('.')){//存在小数点的情况copyNum=S......
  • 奇分频电路如何实现? 负沿触发&非负沿触发
    请设计一个奇分频电路,占空比为50%?以下给出解答:1、带负沿触发 modulediv//带负沿触发#(parameterN=5)//定义分频参数(inputsys_clk,inputsys_rst_n,outputdiv_clk);//核心:在上下边沿的计数器......
  • java 截取小数点后面的数字
    Java截取小数点后面的数字在Java编程中,经常需要对小数进行处理,并且有时候需要截取小数点后面的数字。本文将介绍如何使用Java来实现截取小数点后面的数字,并提供相应的代码示例。方法一:使用字符串截取一种常见的方法是将小数转换为字符串,然后使用字符串的截取方法来获取小数点后......
  • python读取excel为什么是小数
    Python读取Excel为什么是小数在使用Python读取Excel文件时,经常会遇到一个问题:为什么读取的数据会以小数的形式显示,而不是原始的整数或文本呢?这个问题涉及到Python读取Excel的原理以及Excel中的数据类型的转换。Excel中的数据类型在Excel中,每个单元格都有自己的数据类型。常见的......
  • python如何生成随机两位小数
    使用Python生成随机两位小数在很多实际应用中,我们常常需要生成随机的两位小数。Python中提供了多种方法来实现这个需求。在本文中,我们将介绍两种常用的方法,分别是使用random模块和使用numpy库。方法一:使用random模块random模块是Python中用于生成伪随机数的模块,其中提供了多个生......
  • python取小数部分
    Python取小数部分在Python中,我们经常需要对浮点数进行操作,其中一个常见的需求是提取浮点数的小数部分。Python提供了多种方法来实现这个目标,本文将介绍其中几种常见的方法,并提供相应的代码示例。方法一:使用取余操作符取余操作符(%)可以用于获取一个数的小数部分。我们可以将浮点数......
  • python求小数平方
    Python求小数平方引言在Python中,要求一个小数的平方非常简单。本文将教会你如何实现这个功能。在开始之前,我们先来了解一下整个流程。下面是一张表格,展示了实现“Python求小数平方”的步骤。步骤描述步骤1输入一个小数步骤2使用相应的代码求平方步骤3输出结果......