精华内容
下载资源
问答
  •  在集成度高度发展的今天,不能靠多个晶振源来解决问题,而且一旦晶振固定那么它的灵活性和可移植性必然受到很大影响,所以一些时钟分频芯片应运而生,今天我们将举一个很有代表性的AD9522时钟分频芯片的典型应用来...
  •  在集成度高度发展的今天,不能靠多个晶振源来解决问题,而且一旦晶振固定那么它的灵活性和可移植性必然受到很大影响,所以一些时钟分频芯片应运而生,今天我们将举一个很有代表性的AD9522时钟分频芯片的典型应用来...
  • 【FPGA】时钟分频设计

    千次阅读 2015-09-19 14:38:36
    以前做的一些FPGA的一些简单设计,做个记录,比较基础。 本文是讲述时钟分频电路设计,可以分为偶数分频和奇数分频;

    时钟分频电路设计,可以分为偶数分频和奇数分频;


    偶数分频实例:

    二分频:

    // 二分频电路
    
    module clk_div2(clk_out, reset, clk_in);
    
    input reset;
    input clk_in;
    output clk_out;
    reg clk_out;
    
    always @(posedge clk_in) begin
    	if(!reset)
    		clk_out <= 0;
    	else
    		clk_out <= ~clk_out;
    end
    
    endmodule
    

    四分频:

    module clk_div4(clk_out, reset, clk_in);
    
    input clk_in;
    input reset;
    output clk_out;
    
    reg clk_out;
    
    reg [3:0] cnt;
    
    always @(posedge clk_in) begin
    	if(!reset) begin
    		cnt <= 0;
    		clk_out <= 0;
    	end
    	/* if(cnt == 1) begin */
    	else if(cnt == 1) begin
    		clk_out <= ~clk_out;
    		cnt <= 0;
    	end
    	else
    		cnt <= cnt + 1;
    	$strobe("cnt = %d", cnt);
    end
    
    endmodule
    

    规律:N分频(N为偶数),计数器计数到 N/2 - 1 时,计数清零,目标时钟电平翻转即可;

               二分频中2/2-1 = 0,因此不用判断;


    奇数分频实例:

    三分频:

    // 实现任意奇数倍分频。2015-7-10
    
    module clk_div3(clk_out, reset, clk_in);
    
    output clk_out;
    input reset;
    input clk_in;
    
    parameter N = 3; // 3分频 5分频对应改成5即可
    
    reg clk_out1;
    reg clk_out2;
    reg [N:0] cnt1;
    reg [N:0] cnt2;
    
    assign clk_out = clk_out1 || clk_out2; // 发现改成|结果也对,因为clk_out1和clk_out2都是1bit信号
    
    always @(posedge clk_in) begin
    	if(!reset) begin
    		cnt1 <= 0;
    		clk_out1 <= 0;
    	end
    	else begin
    		if(cnt1 == N-1) begin
    			cnt1 <= 0;
    			clk_out1 <= ~clk_out1;
    		end
    		else if(cnt1 == (N-1)/2) begin
    			cnt1 <= cnt1 + 1;
    			clk_out1 <= ~clk_out1;
    		end
    		else
    			cnt1 <= cnt1 + 1;
    	end
    end
    
    always @(negedge clk_in) begin
    	if(!reset) begin
    		cnt2 <= 0;
    		clk_out2 <= 0;
    	end
    	else begin
    		if(cnt2 == N-1) begin
    			cnt2 <= 0;
    			clk_out2 <= ~clk_out2;
    		end
    		else if(cnt2 == (N-1)/2) begin
    			cnt2 <= cnt2 +1;
    			clk_out2 <= ~clk_out2;
    		end
    		else
    			cnt2 <= cnt2 +1;
    	end
    end
    
    
    endmodule

    规律:

    N分频(N为奇数),要分频设计出占空比为50%的时钟方法:

    上升沿触发:cnt1计数到N-1时,cnt1清零,clk1翻转; cnt1计数到(N-1)/2时,cnt1+1, clk1翻转;

    下降沿触发:cnt2计数,方式同上!

    这样就能设计出任意倍数的奇数分频电路;


    展开全文
  • 基本要求: 1. 利用logisim自带的元器件:各种逻辑门(Gate)、触发器(Flip-Flop)、7段数码管(7-Segment Display)等实现...4. 方波信号使用Clock工具产生,自行设置电路时钟频率和分频电路,使计时贴近真实时间。
  • Verilog之分频电路设计

    2021-01-14 22:00:49
    Verilog之分频电路设计 一. 一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率较高)进行分频。比如在进行流水灯、数码管动态扫描设计时不能直接使用系统时钟(太快而肉眼无法...

    Verilog之分频电路设计

    一.
    一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率较高)进行分频。比如在进行流水灯、数码管动态扫描设计时不能直接使用系统时钟(太快而肉眼无法识别),或者需要进行通信时,由于通信速度不能太高(由不同的标准限定),这样就需要对系统时钟分频以得到较低频率的时钟。
    分频器主要分为偶数分频、奇数分频,如果在设计过程中采用参数化设计,就可以随时改变参量以得到不同的分频需要。
    在对时钟要求不是很严格的FPGA系统中,分频通常都是通过计数器的循环计数来实现的。


    偶数分频(2N)

    偶数分频更为简单,很容易用模为N的计数器实现50%占空比的时钟信号,即每次计数满(计到N/2-1)时输出时钟信号翻转。

    奇数分频(2N+1)

    奇数分频的难点就在于对50%占空比的处理,其核心思想就在于要学会利用寄存器的不同捕获边沿进行分频操作。

    将得到的上升沿触发计数的奇数分频输出信号CLK1,和得到的下降沿触发计数的相同(时钟翻转值相同)奇数分频输出信号CLK2,最后将CLK1和CLK2相或之后输出,就可以得到占空比为50%的奇数分频器。

    假设奇数分频的值为2N+1,为了实现占空比为50%的奇数分频,需要用到一个计数器和2路分频信号,第1路根据计数器的值在上升沿分频,即分别在计数器走到N-1和2N时,进行时钟信号的反转;而第2路则根据计数器的值在下降沿分频,同样是在计数器走到N-1和2N时,进行时钟信号反转。因为,一个时钟的上升沿和下降沿之间的时间差正好是50%的时钟周期,所以将两路信号进行或逻辑运算,就可以实现50%占空比的奇数分频。
    在这里插入图片描述


    //奇数分频的verilog设计实例
    module Div_three(    
        input       clk,
        input       rst_n,
        output      div_three    //以三分频来设计
    );
    
    reg     [1:0]   cnt;    //分频计数器,因为是三分频,两位00,01,10,就能表示十进制的计数0,1,2
    reg             div_clk1; //上升沿分频
    reg             div_clk2;  //下降沿分频
    always @(posedge clk or negedge rst_n)begin
        if(rst_n == 1'b0)begin   //实现复位清零    
            cnt <= 0;     
        end
        else if(cnt == 2)   //如果计数满了,则清零,没满则进行自加1的操作,实现分频计数
            cnt <= 0;
        else begin
            cnt <= cnt + 1;
        end
    end
    
    //上升沿分频
    always @(posedge clk or negedge rst_n)begin
        if(rst_n == 1'b0)begin
            div_clk1 <= 0;
        end
        else if(cnt == 0)begin   //在cnt==0时对信号进行翻转
            div_clk1 <= ~div_clk1;
        end
        else 
            div_clk1 <= div_clk1;
    end
    
    //下降沿分频
    always @(negedge clk or negedge rst_n)begin
        if(rst_n == 1'b0)begin
            div_clk2 <= 0;
        end 
        else if(cnt == 2)begin   //在cnt==2时对信号进行翻转
            div_clk2 <= ~div_clk2;
        end
        else 
            div_clk2 <= div_clk2;
    end
    //两部分的上升下降沿相或,刚好是0到2,实现三分频
    assign  div_three = div_clk2 ^ div_clk1; //上升沿与下降沿分频信号,相或输出最终 50% 占空比时钟,用或逻辑来实现奇数分频的技术
    
    endmodule 
    
    展开全文
  • CMOS分频电路设计

    2021-01-19 15:23:10
    摘要:本文讨论了用于高速串行收发系统接收端的时钟分频电路设计。通过对扭环计数器工作原理的分析,提出了一种基于类扭环计数器的分频电路,该电路可以模式可选的实现奇数和偶数分频,并达到相应的占空比。所设计...
  • 基于verilog的5分频电路设计
  • Verilog设计(二):分频电路设计

    万次阅读 多人点赞 2019-06-04 10:55:02
    分频器是FPGA中常用的设计之一,在FPGA设计中担任重要的角色(时钟对于FPGA电路系统的重要性不言而喻!)。尽管大多数设计中会广泛采用厂家集成的锁相环PLL资源进行分频,倍频和相移(每个厂商Xilinx/Alter等其开发...

    目录

    1.偶数分频

    2. 奇数分频

    3.半整数分频


            分频器是FPGA中常用的设计之一,在FPGA设计中担任重要的角色(时钟对于FPGA电路系统的重要性不言而喻!)。尽管大多数设计中会广泛采用厂家集成的锁相环PLL资源进行分频,倍频和相移(每个厂商Xilinx/Alter等其开发套件会提供各自的IP),但对对时钟要求不高的基本设计还是需要通过自行设计分频相移,可节省锁相环资源。

            提到分频,对于初学者可定就会想到利用一个计数器才基时钟下计数,通过翻转获得想要的时钟。这样的方法的确可以实现偶数分频,但是实现奇数分频的话,一个计数器可能不够,一般需要两个计数器。


    1.偶数分频

          偶数分频较奇数分频更为常见,通过一个计数器就完全可以实现了。如需要N分频(N为偶数,则N/2为整数),可通过一个计数器在待分频时钟的触发下循环奇数。当计数器从0奇数至N/2 -1时,输出时钟翻转。

    Verilog实现:

    module even(  
        clk_in    ,
        rst_n     ,
        clk_out   
    );
    
    input      clk_in;
    input      rst_n;
    output reg clk_out;
    
    parameter N=6;   //定义分频参数
    reg [3:0] cnt;
    
    always @(posedge clk_in or negedge rst_n)
    begin
     if(!rst_n) 
        begin    
           cnt     <= 4'b0000  ;
           clk_out <= 1'b0     ;
        end
     else if(cnt==(N/2-1)) 
        begin
          clk_out <= ~clk_out;
          cnt     <= 4'b0000;
        end 
     else 
        cnt<=cnt+1; 
     end
    
    endmodule
    

     


    2. 奇数分频

            首先看一下3分频的时序图:

     从时序图上可以看出,对于奇数分频,就是分别利用主时钟的上升沿触发生成一个时钟,然后用下降沿触发生成一组时钟,然后将两个时钟信号进行或运算得到奇数分频的结果。

    如果N是奇数,那么N/2非整数了(N-1/2为整数),那么该如何实现呢?

    实现方法为:

            Step1:   双沿计数器计数;

                         使用2个计数器:cnt_up和cnt_down,分别在时钟的上升沿触发计数器cnt_up和cnt_down。

            Step2:生成两个控制信号Clk_up和Clk_down;

                        cnt_up计数到(N-1)/2-1电平翻转信号Clk_up,再计数到N-1电平翻转信号Clk_up,同时cnt_down计数到(N-1)/2-1电平翻转信号Clk_down,再计数到N-1电平翻转信号Clk_down。

            Step3:  求出分频后时钟;

                   如果Clk_up和Clk_down信号与Clk_out的关系与Clk_up和Clk_down信号中高低电平比有关(占空比):

                   (1)如果高 / 低电平比例为N-1/2      : N-1/2 + 1  ,则分频时钟 clk_div = clk_up || clk_down (如图 1 所示)。

                   (2)如果高 / 低电平比例为 N-1/2 +1 :N/2        ,则分频时钟 clk_div = clk_up && clk_down(如图 2 所示)。

    module div3(
         clk     ,
         rst_n   ,
         clk_out 
        );
    
    input     clk  ,  rst_n;
    output    clk_out      ;
    
    //=======================================================================\
    //**************************Internal Signals******************************
    //=======================================================================/
    
    reg [3:0] cnt_p , cnt_n;  //clk上升沿(下降沿)触发生成的计数器cnt_p(cnt_n)
    reg       clk_p , clk_n;  //clk上升沿(下降沿)触发生成的时钟clk_p(clk_n)
    
    parameter N=5 ;          //分频参数
    
    
    //===========================================================================\
    //*****************************main code************************************
    //==========================================================================/
    
    //cnt_p 0-4
    always @(posedge clk or negedge rst_n) begin
      if(!rst_n)
           cnt_p <= 4'd0;
      else if(cnt_p == N-1)
           cnt_p <= 0;
      else 
           cnt_p <= cnt_p + 1'b1;
      end
    
     //cnt_n  0-4
    always @(negedge clk or negedge rst_n) begin 
      if(!rst_n)
           cnt_n <= 4'd0;
      else if(cnt_n == (N-1))
           cnt_n <= 0;
      else 
           cnt_n <= cnt_n + 1'b1;
      end
     
    //clk_p 
    always @(posedge clk or negedge rst_n) begin
      if(!rst_n)
          clk_p <= 1;
      else if(cnt_p == (N-1)/2-1) 
          clk_p <= ~clk_p;
      else if(cnt_p == (N-1))
          clk_p <= ~clk_p;
      end
    
    //clk_p
    always @(negedge clk or negedge rst_n) begin
      if(!rst_n)
          clk_n<=1;
      else if(cnt_n==(N-1)/2-1)
          clk_n<=~clk_n;
      else if(cnt_n==(N-1))
          clk_n<=~clk_n;
      end  
     assign clk_out=clk_n|clk_p;
    
     endmodule
    


    3.半整数分频

    半整数分频,本次以2.5分频为例子。这个主要是利用时钟的上升沿和下降沿进行计数。

     

     

    展开全文
  • 任意切换1-8分频,且无论奇分频还是偶分频,占空比均为50%,我至今仍然认为,在那种紧张且时间有限的情况下(本科大约预留15分钟),真的能设计出这种可任意切换的分频电路(之前有所准备的话可以),反正我是没写...

    今天的笔试题是某芸科技的现场笔试题,数字前端的笔试题,要求很简单,就是现场写出代码实现:

    任意切换1-8分频,且无论奇分频还是偶分频,占空比均为50%,我至今仍然认为,在那种紧张且时间有限的情况下(本科大约预留15分钟),真的能设计出这种可任意切换的分频电路(之前有所准备的话可以),反正我是没写出来,笔试归来,我花了多个小时的时间写了一个且仿真了下。

    个人认为,这个电路的设计的步骤分为两部分,

    第一:

    确定整体架构,包括输入输出:如何任意切换?我写了一个分频模块,其中一个输入为div,你输入1到8,可实现1到8的分频。

    第二:

    确定分频实现电路,分频大家都会写,实现过程可分为奇分频的实现以及偶分频的实现,这两种的实现方法是不一样的,偶分频简单,直接计数即可,奇分频需要三个步骤,第一个步骤就是计数,第二个步骤就是下降沿采样,第三个步骤就是相与或相或,具体实现方法后面再说。


    思路简述:

    上面说了这个电路的设计分为两部分,第一部分确定整体架构,其中最重要的是输入输出:

    	input clk,
    	input [3:0] div,
    	input rst_n,
    	output clk_out

    确定好输入输出之后,我们想,我们是否需要一个使能信号,当输入分频述div后,我们让某一种分频模式使能,我们有8中分频模式,总不能傻傻地设置8个使能变量吧,en1,en2,...,en8;

    当然这样很不好看,而且不利于后面程序编写,我的方式是:

    	reg [7:0] fre_en;

    每次只能使能一位,fre_en[i]使能代表i+1分频模式有效。

    通过div的值来确认某种模式使能,其实现如下:

    	localparam DIV1 = 1, DIV2 = 2, DIV3 = 3, DIV4 = 4;
    	localparam DIV5 = 5, DIV6 = 6, DIV7 = 7, DIV8 = 8;
    
    	reg [7:0] fre_en;
    
    
    	always@(posedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			fre_en <= 0;
    		end
    		else begin
    			case(div)
    				DIV1: fre_en <= 8'b0000_0001;
    				DIV2: fre_en <= 8'b0000_0010;
    				DIV3: fre_en <= 8'b0000_0100; 
    				DIV4: fre_en <= 8'b0000_1000;
    				DIV5: fre_en <= 8'b0001_0000;
    				DIV6: fre_en <= 8'b0010_0000;
    				DIV7: fre_en <= 8'b0100_0000;
    				DIV8: fre_en <= 8'b1000_0000;
    			endcase
    		end
    
    
    	end

    我们说了,分频分为奇分频和偶分频,二者都有计数的过程,但是这里想做出一点改变,因为1分频等于没分频,2分频直接对输出时钟取反即可,其他分频就和计数有关了。

    我们写一个计数器,用于其他分频模式,8分频需要计数次数最多,我们设计数器位数为4位,其实3位就够了。

    根据模式使能确定计数次数。

    //计数模块
    	reg [3:0] fre_cnt;
    	always @(posedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			fre_cnt <= 0;
    		end 
    		else begin
    			case(1'b1)
    				fre_en[0]: begin
    					;
    				end
    				fre_en[1]: begin
    					;
    				end
    				fre_en[2]: begin //3分频计数
    					if(fre_cnt < 2) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;
    				end
    				fre_en[3]: begin
    					if(fre_cnt < 3) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0; 
    				end
    				fre_en[4]: begin
    					if(fre_cnt < 4) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;
    				end
    				fre_en[5]: begin
    					if(fre_cnt < 5) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0; 
    				end
    				fre_en[6]: begin
    					if(fre_cnt < 6) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;
    				end
    				fre_en[7]: begin
    					if(fre_cnt < 7) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;  
    				end
    			endcase 
    		end
    	end

    有了计数模块,就可以设计分频实现模块了,根据分频使能来确定分频模式,不同的分频模式对应不同的分频实现方式。

    reg clk_out_r;
    	reg clk_even;
    
    	always @(posedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			clk_even <= 0;
    			clk_out_r <= 0;
    		end 
    		else begin
    			case(1'b1)
    				fre_en[0]: begin //1 分频
    					;
    				end
    				fre_en[1]: begin //2 分频
    					clk_even <= ~clk_even;
    				end
    				fre_en[2]: begin //3 分频
    					if(fre_cnt == 1) clk_out_r <= ~clk_out_r;
    					else if(fre_cnt == 2)  clk_out_r <= ~clk_out_r;
    					else clk_out_r <= clk_out_r;
    				end
    				fre_en[3]: begin //4 分频
    					if(fre_cnt == 1) clk_even <= ~clk_even;
    					else if(fre_cnt ==3) clk_even <= ~clk_even;
    					else clk_even <= clk_even;
    				end
    				fre_en[4]: begin //5分频
    					if(fre_cnt == 2) clk_out_r <= ~clk_out_r;
    					else if(fre_cnt == 4) clk_out_r <= ~clk_out_r;
    					else clk_out_r <= clk_out_r;  
    				end
    				fre_en[5]: begin // 6分频
    					if(fre_cnt == 2) clk_even <= ~clk_even;
    					else if(fre_cnt == 5) clk_even <= ~clk_even;
    					else clk_even <= clk_even;
    				end
    				fre_en[6]: begin //7 分频
    					if(fre_cnt == 3) clk_out_r <= ~clk_out_r;
    					else if(fre_cnt == 6) clk_out_r <= ~clk_out_r;
    					else clk_out_r <= clk_out_r; 
    				end
    				fre_en[7]: begin //8 分频
    					if(fre_cnt == 3) clk_even <= ~clk_even;
    					else if(fre_cnt == 7) clk_even <= ~clk_even;
    					else clk_even <= clk_even; 
    				end
    			endcase  
    		end
    	end

    解释下上面的几个reg变量以及wire变量的意义,由于考虑到奇数分频最后的输出clk_out需要一段组合逻辑,所以需要使能wire类型。

    这就导致这个分频实现模块里不能直接使用clk_out作为左值。

    用clk_even用作偶分频输出clk_out的缓冲;

    至于clk_out_r,以及clk_out_rr是为了奇分频而声明的。

    这里提一下奇分频的实现原理:(之前写过Verilog HDL 训练】第 11 天(分频电路)

    假如N为奇数,那么进行N分频,需要先设计一个占空比为(N-1)/2 : N的分频输出clk_out_r,之后用时钟下降沿采样clk_out_r得到clk_out_rr;最后将clk_out_r或上clk_out_rr即可。

    具体可参考上面引用的博文。

    至于偶分频,则需要计数一半反转一次,计数结束反转一次即可。

    好了,下面继续解决奇分频的下降沿采样问题:

    //下降沿采样模块
    	reg clk_out_rr;
    
    	always @(negedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			clk_out_rr <= 0;
    		end 
    		else begin
    			case(1'b1)
    				fre_en[0]: ;
    				fre_en[1]: ;
    				fre_en[2]: begin
    					clk_out_rr <= clk_out_r;
    				end
    				fre_en[3]: ;
    				fre_en[4]: begin
    					clk_out_rr <= clk_out_r;
    				end
    				fre_en[5]: ;
    				fre_en[6]: begin
    					clk_out_rr <= clk_out_r;
    				end
    				fre_en[7]: ;
    
    			endcase 
    
    
    
    		end
    	end
    

    最后输出分频时钟:

    //产生分频时钟	
     assign clk_out = ( fre_en[0] | fre_en[1] | fre_en[3] | fre_en[5] | fre_en[7] )? clk_even : clk_out_r | clk_out_rr;

    由于一次输入只能有一个使能位有效,所以上述assign自然明白了吧。

    大概就是这么多了,给出一个简单的仿真,文章的最后会给出完整的代码以及仿真代码。

    先给出一个仿真,假如输入div为5,则进行5分频,则:

    假如输入div为6则进行6分频:

    先5分频在1分频:

    完美切换。

    最后的最后给出完整版程序以及测试。

     


    完整版程序:

    
    //任意切换1——8分频电路设计(某芸科技),无论是奇分频还是偶分频,占空比均为50%
    
    module Fre_Div(
    	input clk,
    	input [3:0] div,
    	input rst_n,
    	output clk_out
    
    
    	);
    
    	localparam DIV1 = 1, DIV2 = 2, DIV3 = 3, DIV4 = 4;
    	localparam DIV5 = 5, DIV6 = 6, DIV7 = 7, DIV8 = 8;
    
    	reg [7:0] fre_en;
    
    
    	always@(posedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			fre_en <= 0;
    		end
    		else begin
    			case(div)
    				DIV1: fre_en <= 8'b0000_0001;
    				DIV2: fre_en <= 8'b0000_0010;
    				DIV3: fre_en <= 8'b0000_0100; 
    				DIV4: fre_en <= 8'b0000_1000;
    				DIV5: fre_en <= 8'b0001_0000;
    				DIV6: fre_en <= 8'b0010_0000;
    				DIV7: fre_en <= 8'b0100_0000;
    				DIV8: fre_en <= 8'b1000_0000;
    			endcase
    		end
    
    
    	end
    	reg clk_out_r;
    	reg clk_even;
    
    
    	always @(posedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			clk_even <= 0;
    			clk_out_r <= 0;
    		end 
    		else begin
    			case(1'b1)
    				fre_en[0]: begin //1 分频
    					;
    				end
    				fre_en[1]: begin //2 分频
    					clk_even <= ~clk_even;
    				end
    				fre_en[2]: begin //3 分频
    					if(fre_cnt == 1) clk_out_r <= ~clk_out_r;
    					else if(fre_cnt == 2)  clk_out_r <= ~clk_out_r;
    					else clk_out_r <= clk_out_r;
    				end
    				fre_en[3]: begin //4 分频
    					if(fre_cnt == 1) clk_even <= ~clk_even;
    					else if(fre_cnt ==3) clk_even <= ~clk_even;
    					else clk_even <= clk_even;
    				end
    				fre_en[4]: begin //5分频
    					if(fre_cnt == 2) clk_out_r <= ~clk_out_r;
    					else if(fre_cnt == 4) clk_out_r <= ~clk_out_r;
    					else clk_out_r <= clk_out_r;  
    				end
    				fre_en[5]: begin // 6分频
    					if(fre_cnt == 2) clk_even <= ~clk_even;
    					else if(fre_cnt == 5) clk_even <= ~clk_even;
    					else clk_even <= clk_even;
    				end
    				fre_en[6]: begin //7 分频
    					if(fre_cnt == 3) clk_out_r <= ~clk_out_r;
    					else if(fre_cnt == 6) clk_out_r <= ~clk_out_r;
    					else clk_out_r <= clk_out_r; 
    				end
    				fre_en[7]: begin //8 分频
    					if(fre_cnt == 3) clk_even <= ~clk_even;
    					else if(fre_cnt == 7) clk_even <= ~clk_even;
    					else clk_even <= clk_even; 
    				end
    			endcase  
    		end
    	end
    
    	//下降沿采样模块
    	reg clk_out_rr;
    
    	always @(negedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			clk_out_rr <= 0;
    		end 
    		else begin
    			case(1'b1)
    				fre_en[0]: ;
    				fre_en[1]: ;
    				fre_en[2]: begin
    					clk_out_rr <= clk_out_r;
    				end
    				fre_en[3]: ;
    				fre_en[4]: begin
    					clk_out_rr <= clk_out_r;
    				end
    				fre_en[5]: ;
    				fre_en[6]: begin
    					clk_out_rr <= clk_out_r;
    				end
    				fre_en[7]: ;
    
    			endcase 
    
    
    
    		end
    	end
    
    	
    //产生分频时钟
    
     assign clk_out = fre_en[0] ? clk :( (  fre_en[1] | fre_en[3] | fre_en[5] | fre_en[7] )? clk_even : clk_out_r | clk_out_rr );
    
    //计数模块
    	reg [3:0] fre_cnt;
    	always @(posedge clk or negedge rst_n) begin
    		if(~rst_n) begin
    			fre_cnt <= 0;
    		end 
    		else begin
    			case(1'b1)
    				fre_en[0]: begin
    					;
    				end
    				fre_en[1]: begin
    					;
    				end
    				fre_en[2]: begin //3分频计数
    					if(fre_cnt < 2) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;
    				end
    				fre_en[3]: begin
    					if(fre_cnt < 3) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0; 
    				end
    				fre_en[4]: begin
    					if(fre_cnt < 4) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;
    				end
    				fre_en[5]: begin
    					if(fre_cnt < 5) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0; 
    				end
    				fre_en[6]: begin
    					if(fre_cnt < 6) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;
    				end
    				fre_en[7]: begin
    					if(fre_cnt < 7) fre_cnt <= fre_cnt + 1;
    					else fre_cnt <= 0;  
    				end
    			endcase 
    		end
    	end
    
    
    
    
    
    
    endmodule
    

    测试:

    module Sim_Freq_Div(
    
        );
    	
    	reg clk;
    	reg rst_n;
    	reg [3:0] div;
    	wire clk_out;
    	
    	initial begin
    		clk = 0;
    		forever
    			#2 clk = ~clk;
    	
    	end
    	
    	
    	initial begin
    		rst_n = 0;
    		div = 5;
    		#15
    		rst_n = 1;
    		#60
    		div = 1;
    		
    	
    	end
    	
    	Fre_Div fre_div_tb(
    	.clk(clk),
    	.rst_n(rst_n),
    	.div(div),
    	.clk_out(clk_out)
    	);
    	
    	
    endmodule
    

     

     

     

     

     

    展开全文
  • 通常情况下,时钟的分频在FPGA设计中占有重要的地位,在此就简单列出分频电路设计的思考思路。 偶数分频电路:  如果要进行N倍偶数分频,可有待分频的时钟触发计数器,当计数器从0计到N/2-1时,输出时钟进行翻倍...
  • 摘要:本文讨论了用于高速串行收发系统接收端的时钟分频电路设计。通过对扭环计数器工作原理的分析,提出了一种基于类扭环计数器的分频电路,该电路可以模式可选的实现奇数和偶数分频,并达到相应的占空比。所设计...
  • 在数字逻辑电路设计中,分频器是一种基本的电路单元。通常用来对某个给定频率进行分频,以得到所需的频率。分频在FPGA的设计中一直都担任着很重要的角色,而说到分频,我相信很多人都已经想到了利用计数器计数来得到...
  • 虽然在实际工程中要产生分频时钟一般采用FPGA的时钟管理器来进行分频、倍频,通过设置一下IP核中的参数即可,这样做有很多别的方法(例如:直接用Verilog HDL设计分频电路)达不到的效果,产生时钟的质量也更好,...
  • verilog时钟分频设计

    万次阅读 多人点赞 2017-07-12 15:42:48
    分频意思是时钟模块设计最为简单。首先得到分频系数M和计数器值N。 M = 时钟输入频率 / 时钟输出频率 N = M / 2 如输入时钟为50M,输出时钟为25M,则M=2,N=1。偶分频则意味着M为偶数。 以M=4,N=2为例,我们希望...
  • 核心思路:用D触发器构成移位寄存器,输出循环序列 2倍分频 最简单,只用生成01的循环脉冲 always @ (posedge clk or...如果要求占空比为50%的9分频电路,就用下降沿的D触发器打一拍,将两个信号相或后输出即可。 ...
  • VHDL1 引言随着应用系统向高速度、低功耗和低电压方向的发展,对电路设计的要求越来越高传统集成电路设计技术已无法满足性能日益提高的整机系统的要求。同时,由于IC设计与工艺技术水平的提高,集成电路规模越
  • 分频(任意占空比、50%占空比) 偶分频(任意占空比、50%占空比)
  • 基于数字电路典型分频电路设计 摘要 本系统通过数字电路设计,可以实现确定相位且频率较为准确的10KHZ、30KHZ、50KHZ的方波输出。所有电路均通过仿真验证和实物验证,可很好的完成指标的要求。 本系统分为2个模块,...
  • 时钟分频

    千次阅读 2019-11-06 20:05:30
    本文参考《硬件架构的艺术》,主要介绍偶数分频时钟,计数分频(3,5分频),以及非整数分频(4.5分频) 1、偶数分频 偶数分频比较容易实现。实现一个N分频(N为偶数),每隔N/2个源时钟分频时钟信号翻转一次。...
  • /**********************************************************/ /***********************产生偶分频时钟*********************/ always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) clk_even ; else ...
  • 分频电路的verilog实现

    2021-04-21 16:57:38
    由偶数二分频波形可知,每次在时钟的上升沿,寄存器的状态进行翻转,就能得到二分频后的时钟。 代码如下: module div2_clk ( input clk, input rst, output clk_div ); reg clk_div_r; assign clk_div = clk_...
  • 分频电路在音响中得到了广泛的应用,它能将可以将不同频段的声音信号区分开来,分别给于放大,然后送到相应频段的扬声器中再进行重放,对音质的好坏至关重要。换句话说,使用分频器可以将高频信号送到高音扬声器中,...
  • 占空比可调的分频电路实现

    千次阅读 2019-09-02 20:45:14
    实现占空比为50%的分频电路很简单,对于偶分频电路只需将cnt计数到一半时进行输出q的翻转即可。比如8分频的输出q,只需在cnt == 3(8÷2 - 1)的时候进行翻转,因为cnt计数是从0计数到7,即0,1,2,3,4,5,6,7,其中3...
  • verilog的时钟分频与时钟使能

    千次阅读 2018-10-02 17:53:00
    时钟使能电路是同步设计的基本电路。在很多设计中,虽然内部不同模块的处理速度不同,但由于这些时钟是同源的,可以将它们转化为单一时钟处理。在ASIC中可以通过STA约束让分频始终和源时钟同相,但FPGA由于器件本身...
  • 分频电路及代码

    千次阅读 2018-08-30 20:36:44
    module cy4( input ext_clk_25m, //外部输入25MHz时钟信号 input ext_rst_n, //外部输入复位信号,低电平有效 output reg clk_12m5 //二分频时钟信号 ); always @(posedge ext_clk_25m ...
  • 如需要N分频(N为偶数,则N/2为整数),可通过一个计数器在待分频时钟的触发下循环奇数。当计数器从0奇数至N/2 -1时,输出时钟翻转。 Verilog实现: module even( clk_in , rst_n , clk_out ); input clk_in...
  • 时钟分频与时钟切换

    千次阅读 2020-07-05 21:11:34
    时钟分频与时钟切换1、时钟分频1.1 偶数分频1.2 奇数数分频1.2.1 3分频电路2、时钟切换2.1 有毛刺(glitch)的时钟切换2.2、无毛刺时钟切换case1:时钟相关:倍数关系case2:时钟相关:不相关(异步)2.3、补充方法 ...
  •  任意分频电路,相信很多人都听说过这个专业名词,好多视频上都说不建议使用计数器产生的分频时钟。其实在FPGA领域当中,由寄存器分频产生的时钟还有一个学名叫做,行波时钟。是由时序逻辑产生比如A寄存器的...
  • verilog的时钟分频与时钟使能 时钟使能电路是同步设计的基本电路。在很多设计中,虽然内部不同模块的处理速度不同,但由于这些时钟是同源的,可以将它们转化为单一时钟处理。在ASIC中可以通过STA约束让分频始终和源...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,280
精华内容 2,112
热门标签
关键字:

时钟分频电路设计