分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

这篇具有很好参考价值的文章主要介绍了分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分频器定义:

        在数字系统的设计中经常会碰到需要使用多个时钟的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频、分频信号;另一种则是使用硬件描述语言构建一个分频电路。

        分频器的设计通常分为以下三类:奇数分频器、偶数分频器及小数分频器

偶分频:

        假设原来的时钟为clk,N(N为偶数)分频之后的时钟为clk_N,则N分频就是把原来的N个时钟周期变成现在的一个时钟周期。

分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

        上图为8分频时序变化,8分频的时钟周期变为原来的分频前时钟的8倍,高电平占中时钟周期的一半,为50%占空比。

2.1verliog

根据上图可以编写任意偶数N分频Verilog代码如下:

        对于实现占空比为50%的N倍偶数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N>>1)-1再次进行一次时钟翻转。

2.1.1  复位之后先是低电平都是高电平的分频器

else  if(cnt ==((N>>1)-1) || cnt==(N-1))  		//N/2个时钟周期翻转一次
		clk_N <= ~clk_N;        //计满则输出反转

 2.1.2复位之后先是高电平再是低电平的分频器

//N分频电路设计
module divider_N                //模块名
(
	input		sys_clk,	    //时钟(设定为 50MHz)
	input		sys_rst_n,	    //复位信号(n 表示低电平有效)
	
	output	reg	clk_N		    //输出N分频信号
);
 parameter N==8;//例如N=8
reg [6:0]	cnt;                //reg 定义  
 
//计数模块
//从0计数到N-1共计N个时钟周期
always@(posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)
		cnt <= 7'd0;			//复位清零
	else if(cnt == (N-1))		//从0开始计数,所以需要 -1
		cnt <= 7'd0;			//计满则清零
	else
		cnt <= cnt + 7'd1; 		//没记满就一直计数
end
 
//N分频时钟输出模块
//满足计数条件则对N分频时钟进行反转
//N分频时钟每隔N/2个周期反转一次,所以N分频的周期即为N个时钟周期
always@(posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)                  
		clk_N <= 1'b0;          //复位清零
	else  if(cnt ==0 || cnt==((N>>1)-1))  		//N/2个时钟周期翻转一次
		clk_N <= ~clk_N;        //计满则输出反转
    else
        clk_N <= ~clk_N;        //未计满则保持

end

endmodule

        以上两类在实际运用中并无区别,只不过在牛客网一些测试题中进行了区分。

2.1.3:关于计数器的问题,若复位时刻恰在时钟的上升沿,由于FPGA的并行性质,上升沿采样时的rst_n==0, 因此该时钟周期的cnt==0,rst_n==1。

        

分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

 上图就可以很好的解释,复位之后计数器的初始值为0,在时钟的上升沿,cnt立即变为(陡变)cnt==1。

这就说明假如复位信号提前,cnt实际上是从cnt==1开始计数的。

奇分频:

        奇分频的含义即为分频数如:3、5、7、9之类奇数数字的分频器,由于奇数无法被2整除,例如在7分频中,奇数分频就会出现占空比为50%的7分频器,高低电平各占3.5个周期。

50%占空比奇分频实现方法

        对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。

        同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。

        两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。

`timescale 1ns/1ns

module odo_div_or
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_outN
    );

//*************code***********//

    reg clk_neg, clk_pos;
    reg [5:0] cnt;
    
    always@(posedge clk_in or negedge rst) begin//计数器
        if(~rst)
            cnt <= 0;
        else
            cnt <= cnt==(N-1)? 0: cnt+1;
    end
    
    always@(posedge clk_in or negedge rst) begin//上升沿翻转
        if(~rst)
            clk_pos <= 0;
        else
            clk_pos <= (cnt==((N-1)>>1)||cnt==(N-1))? ~clk_pos: clk_pos;
    end
    
    always@(negedge clk_in or negedge rst) begin//下降沿翻转
        if(~rst)
            clk_neg <= 0;
        else
            clk_neg <= (cnt==((N-1)>>1)||cnt==(N-1))? ~clk_neg: clk_neg;
    end

    assign clk_outN = clk_neg|clk_pos;
//*************code***********//
endmodule


        

任意占空比奇分频:

        对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。

这样就得到了一个占空比为为(N-1)/2 /N的奇分频时钟。


任意小数分频

                假设输出clk_out是输入clk_in的N分频。首先要将分频系数N化为分数形式,比如3.4→34/10​。本题中,8.7可以化为87/10。这意味着在87个clk_in周期内输出10个clk_out周期就可以实现分频。

分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

 

        然后采用若干种(一般是两种)整数分频在87个原周期clk_in内产生10个新时钟周期clk_out。整数分频的分频系数有很多种选择,但要尽可能接近,提高clk_out的均匀度。一般推荐在小数分频系数N的附近选取。因为8<N<9,所以两个整数分频系数是8和9。接着要计算87个clk_out周期分别有多少个是8分频和9分频的。设每10个clk_out中有x个8分频输出和y个9分频输出,则可列出如下方程:

分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

 

可得x=3,y=7。也就是3个8分频和7个9分频一组,循环输出,就等效于8.7分频。 最后安排组内8分频和9分频的位置。这里的方法也不固定,不过本题要求3个8分频先输出,再输出7个9分频,如下图。

分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

 

        3个8分频先输出,再输出7个9分频

`timescale 1ns/1ns

module div_M_N(
 input  wire clk_in,
 input  wire rst,
 output wire clk_out
);
parameter M_N = 8'd87; 
parameter c89 = 8'd24; // 8/9时钟切换点
parameter div_e = 5'd8; //偶数周期
parameter div_o = 5'd9; //奇数周期
//*************code***********//
reg [7:0] cnt;

reg [4:0] cnt1,cnt2;

reg clk1, clk21, clk22;

wire clk_2;


always@(posedge clk_in or negedge rst)//89计数器
    if(!rst)
        cnt<=0;
    else 
        cnt<= (cnt==(M_N-1))? 0: cnt+1;


always@(posedge clk_in or negedge rst)//计数器
    if(!rst)
        cnt1<=0;
    else if(cnt<=c89)
        cnt1<=(cnt1==5'd7)? 0 : cnt1+1;
    else
        cnt1<=0;

always@(posedge clk_in or negedge rst)//偶数8分频
    if(!rst)
        clk1<=0;
    else 
        if(cnt1 == 3'b0 || cnt1 == div_e / 2)
            clk1<=~clk1;
        else
            clk1<=clk1;
    
always@(posedge clk_in or negedge rst)//奇数分频计数器
    if(!rst)
        cnt2<=0;
    else if(cnt>=c89)
        cnt2<=(cnt2==5'd8)? 0 : cnt2+1;
    else
        cnt2<=0;


always@(posedge clk_in or negedge rst)//奇数分频
    if(!rst)
        clk21<=0;
    else
        if(cnt2 == 4'b0 || cnt2 == (div_o - 1'b1) / 2)
            clk21<=~clk21;
        else
            clk21<=clk21;


assign clk_out = (cnt <= c89 )? clk1 : clk21;

            

//*************code***********//
endmodule

         以上就是任意偶数分频器,奇数分频器,小数分频器的知识点,其简单来说都是计数器+时钟翻转电路的两部分组成。

        以上代码N经过替换之后是可以直接使用的,希望大家可以多多点赞支持。文章来源地址https://www.toymoban.com/news/detail-422836.html

到了这里,关于分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    目录 一、前言 二、偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三、奇数分频 3.1 占空比非50%奇数分频 3.2 占空比50%奇数分频 3.3 Verilog代码 3.4 Testbench 3.5 仿真结果 四、小数分频 4.1 双模前置分频法 4.2 Verilog代码 4.3 Testbench 4.4 仿真结果 五、半整

    2024年02月04日
    浏览(45)
  • Verilog-实现时钟分频(1KHZ、奇、偶分频,占空比为50%)

    代码如下 1khz分频代码 1khz分频-testbench 仿真图如下 通过计数器实现,进行N倍偶数分频,通过时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,以此循环下去。(占空比为50%) ,以下代码实现8分频,可根据实际需求改变参数输出需要的时钟。 代码如下 偶

    2024年02月08日
    浏览(48)
  • FPGA学习——实现任意倍分频器(奇数/偶数倍分频器均可实现)

    在FPGA(可编程逻辑门阵列)中,分频器是一种用于将时钟信号的频率降低的电路或模块。它可以根据输入的时钟信号生成一个较低频率的输出时钟信号。 常见的分频器可以按照固定比例来进行分频,例如将输入时钟频率除以2、除以4等。因此,如果输入时钟信号的频率为10

    2024年02月05日
    浏览(38)
  • 任意分频器电路设计

    目录 任意分频器电路设计 1、任意偶数分频器电路设计 1.2、实验任务 1.3、程序设计 1.3.1、代码如下: 1.3.2、编写仿真 TB 文件 2、任意奇数分频器电路设计 2.1、实验任务 2.2、程序设计 2.2.1、奇数分频电路代码 2.2.2、编写仿真 TB 文件 2.2.3、仿真验证        偶数分频实现比较

    2024年02月16日
    浏览(33)
  • IC面试常考题 Verilog三分频电路设计(占空比50%,三分之一,三分之二)

    实现三分频电路最简单的是: 利用计数器实现。 时序图分析(本人比较懒,平常科研忙,所以直接手画时序图了,懒得用软件画了): 直接上图分析:利用计数器每隔三个周期信号翻转一次,同时在不同的计数下翻转得到的同步信号 clk_1和clk_2,再利用异或即可实现出一个

    2024年02月16日
    浏览(43)
  • 12-分频器 -偶分频

    计数器是对于时钟信号进行计数,板载晶振的时钟频率是固定的,有时候需要进行分频和倍频才能满足需要 开发板上只有一种晶振,只有一种频率的时钟,想要通过对与固定时钟进行分频或者是倍频的方式得到各个模块所需的时钟频率,得到比固定时钟快的时钟通过 倍频 ,得到比固

    2024年02月06日
    浏览(40)
  • verilog---分频器设计

    //设计分频器 将50MHZ信号分频产生1HZ的秒脉冲,输出信号占空比为50%。 //设计思路:用计数器设计,N分频:当计数到(N/2)-1个数时,输出时钟翻转一次 //50*10^6次分频:计数到24 999 999(需要25bit)时,输出信号翻转。 //无法用vmf仿真,因为endtime最大为10us,实际最少需要1000000u

    2024年02月04日
    浏览(34)
  • VHDL实现分频器

    目录 设计要求: 实现代码: 生成元件图形: 模拟仿真结果:​ 整体项目资源在:VHDL分频器-占空比50%-将FPGA板上的50Mhz的信号分频为1hz时钟信号-嵌入式文档类资源-CSDN文库 设计要求:                 将系统时钟50MHz 分频为1Hz 的时钟信号                 占

    2024年02月12日
    浏览(34)
  • 时钟分频器

    8倍时钟分频器是一种电路或设备,用于将输入时钟信号的频率分成原来的1/8。它可以在数字电子系统中用于将高频时钟信号降低到较低的频率,以满足特定的系统需求。 在这个电路中,CLK是输入的时钟信号,CLK_OUT是输出的时钟信号。通过适当的电路设计,8倍时钟分频器将输

    2024年02月16日
    浏览(41)
  • 06 分频器设计

    实现分频一般有两种方法,一种方法是直接使用 PLL 进行分频,比如在 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性,无法得到频率很低的时钟信号,比如输入 100Mhz 时钟,很多PLL 都无法得到 1Mhz 以下的时钟信号。另外一种方

    2024年02月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包