精华内容
下载资源
问答
  • Verilog奇数偶数分频讲解 以及占空比为50%的奇数分频办法
  • 奇数分频和偶数分频在FPGA中可以使用PLL很容易实现,也可以用Verilog实现奇数分频和偶数分频偶数分频相对来说比较简单,奇数分频需要利用系统时钟的上升沿和下降沿来进行分频。奇数分频和偶数分频都是以系统时钟为...

    奇数分频和偶数分频在FPGA中可以使用PLL很容易实现,也可以用Verilog实现奇数分频和偶数分频,偶数分频相对来说比较简单,奇数分频需要利用系统时钟的上升沿和下降沿来进行分频。奇数分频和偶数分频都是以系统时钟为基准,然后进行计数,具体什么时间翻转电平是有公式的,只要把公式记住,实现分频轻而易举:

    偶数分频(50%占空比):
    上升沿N/2-1翻转

    奇数分频(50%占空比):
    上升沿:上升沿(N-1)/2-1翻转
    下降沿:下降沿(N-1)翻转

    偶数分频Verilog代码:

    module clk_div_even(
    	input clk,
    	input rst_n,
    	output reg clk_div
    );
    	
    	parameter N = 8;
    
    	reg [7:0]cnt;
    	
    	always@(posedge clk or negedge rst_n)begin
    		if(!rst_n)
    			cnt <= 'd0;
    		else if(cnt == (N/2-1))
    			cnt <= 'd0;
    		else
    			cnt <= cnt + 1'b1;
    	end
    	
    	always@(posedge clk or negedge rst_n)begin
    		if(!rst_n)
    			clk_div <= 1'b0;
    		else if(cnt == (N/2-1))
    			clk_div <= ~clk_div;
    		else
    			clk_div <= clk_div;
    	end
    
    endmodule
    
    

    仿真代码(奇数分频和偶数分频共用一个,例化时候注意模块即可):

    `timescale 1ns/1ns
    module clk_div_tb;
    
    	reg clk;
    	reg rst_n;
    	
    	wire div_clk;
    	
    	clk_div clk_div_inst(
    		.clk		(clk		),
    		.rst_n	(rst_n	),
    		.div_clk	(div_clk	)
    	);
    	
    //	clk_div_even clk_div_even_inst(
    //		.clk			(clk		),
    //		.rst_n		(rst_n	),
    //		.clk_div		(div_clk	)
    //);
    	
    	initial clk = 0;
    	always#10 clk = ~clk;
    	
    	initial begin
    		rst_n = 0;
    		#200;
    		rst_n = 1;
    		#2000;
    		$stop;
    	end
    	
    endmodule
    
    

    波形仿真:
    在这里插入图片描述

    奇数分频Verilog代码:

    module clk_div(
    	input    clk,
    	input    rst_n,
    	output   div_clk
    );
    	
    	parameter N = 9;
    	
    	reg   [3:0]  cnt; 
    	reg       div_clk1;
    	reg       div_clk2;
    	
    //--------------------cnt计数-------------------//
    	always @(posedge clk or negedge rst_n)begin
    		if(rst_n == 1'b0)begin
    			cnt <= 0;
    		end
    		else if(cnt == (N-1))  //N-1
    			cnt <= 0;
    		else begin
    			cnt <= cnt + 1;
    		end
    	end
    	
    //---------------上升沿(N-1)/2-1翻转-------------//
    	always @(posedge clk or negedge rst_n)begin
    		if(rst_n == 1'b0)begin
    			div_clk1 <= 0;
    		end
    		else if(cnt == ((N-1)/2-1))begin  //(N-1)/2-1
    			div_clk1 <= ~div_clk1;
    		end
    		else 
    			div_clk1 <= div_clk1;
    	end
    	
    //----------------下降沿(N-1)翻转-----------------//
    	always @(negedge clk or negedge rst_n)begin
    		if(rst_n == 1'b0)begin
    			div_clk2 <= 0;
    		end
    		else if(cnt == (N-1))begin   //N-1
    			div_clk2 <= ~div_clk2;
    		end
    		else 
    			div_clk2 <= div_clk2;
    	end
    	
    //----------------两个时钟做异或-----------------//
    	assign div_clk = div_clk2 ^ div_clk1;
    
    endmodule 
    

    波形仿真:
    在这里插入图片描述

    展开全文
  • verilog--偶数分频

    千次阅读 2020-07-04 21:58:58
    偶数分频,M = 时钟输入频率/时钟输出频率,N = M/2 如输入时钟为50M,输出时钟为5M,则M=10,N=5。 因此只需将counter以clk为时钟驱动计数,当counter = (N-1)时,clk_out翻转进行了。 module fen( input clk...

     偶数分频,M = 时钟输入频率/时钟输出频率,N = M/2 如输入时钟为50M,输出时钟为5M,则M=10,N=5。

    因此只需将counter以clk为时钟驱动计数,当counter = (N-1)时,clk_out翻转进行了。

    module fen(        
                                 
        input clk,    
        input rst_n,    
        output reg clk_out
         
        );
    parameter N = 2;          //N=2,此时M=4,即系统四分频
        
    reg [31:0] counter;

    always @(posedge clk or posedge rst_n) begin
        if (rst_n)
            counter <= 0;
        else if (counter == N-1)
            counter <= 0;
        else 
            counter <= counter + 1;
    end

    always @(posedge clk or posedge rst_n) begin
        if (rst_n) 
            clk_out <= 0;
        else if (counter == N-1)
            clk_out <= !clk_out;
    end

    endmodule

    展开全文
  • 偶数分频 偶数分频是最简单的,N分频需要计数到(N-1),并在(N/2 - 1)和(N - 1)处更改输出的取值即可,只需要单一时钟沿计数。下面是四分频电路的实现: 代码: 奇数分频

    目录

     

    偶数分频

    奇数分频

    N+0.5分频

    任意小数分频


    偶数分频

    偶数分频是最简单的,N分频需要计数到(N-1),并在(N/2 -  1)和(N - 1)处更改输出的取值即可,只需要单一时钟沿计数。下面是四分频电路的实现:

    代码:

    module div4(
    	input	wire 	clk,
    	input	wire    rst,
    	output	reg		clk_div4
        );
    reg [1:0]	cnt;
    
    always @(posedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		cnt <= 2'b00;
    	end
    	else if (cnt == 2'b11) begin
    		cnt <= 2'b00;
    	end
    	else begin
    		cnt <= cnt + 1'b1;
    	end
    end
    
    always @(posedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		clk_div4 <= 1'b0;
    	end
    	else if (cnt == 2'b01) begin
    		clk_div4 <= 1'b1;
    	end
    	else if(cnt == 2'b11) begin
    		clk_div4 <= 1'b0;
    	end
    end
    
    endmodule

    testbench:

    module tb_4();
    reg     clk,rst;
    wire	clk_div4;
    
    initial
    begin
    	clk = 0;
    	rst = 1;
    	#5
    	rst = 0;
    end
    
    always #10 clk = ~clk;
    
    div4 inst(
    	.clk(clk),
    	.rst(rst),
    	.clk_div4(clk_div4));
    
    endmodule

     仿真波形图如下:

     可以看到原来的时钟周期为20ns,4分频后周期变为了80ns。

    奇数分频

    奇数分频比偶数分频要复杂一些,需要在时钟的上升沿和下降沿同时计数,然后结果相或得到最终的分频输出,计数得到的上升沿触发的时钟和下降沿触发的时钟都要满足高电平比低电平少一个时钟周期,高电平保持(N-1)/2个时钟周期,低电平保持(N+1)/2个时钟周期。下面是一个7分频的实现:

    module div7(
    	input	wire 	clk,
    	input	wire 	rst,
    	output 	wire	clk_div7
        );
    reg clk_pos,clk_neg;
    reg	[2:0] cnt_pos,cnt_neg;
    
    always @(posedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		cnt_pos <= 3'b000;
    	end
    	else if (cnt_pos == 3'b110) begin
    		cnt_pos <= 3'b000;
    	end
    	else begin
    		cnt_pos <= cnt_pos + 1'b1;
    	end
    end
    
    always @(posedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		clk_pos <= 1'b0;
    	end
    	else if (cnt_pos == 3'b011) begin
    		clk_pos <= 1'b1;
    	end
    	else if(cnt_pos == 3'b110) begin
    		clk_pos <= 1'b0;
    	end
    end
    
    always @(negedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		cnt_neg <= 3'b000;
    	end
    	else if (cnt_neg == 3'b110) begin
    		cnt_neg <= 3'b000;
    	end
    	else begin
    		cnt_neg <= cnt_neg + 1'b1;
    	end
    end
    
    always @(negedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		clk_neg <= 1'b0;
    	end
    	else if (cnt_neg == 3'b011) begin
    		clk_neg <= 1'b1;
    	end
    	else if(cnt_neg == 3'b110) begin
    		clk_neg <= 1'b0;
    	end
    end
    
    assign clk_div7 = clk_pos | clk_neg;
    
    endmodule
    

    testbench:

    module tb_7();
    reg     clk,rst;
    wire	clk_div7;
    
    initial
    begin
    	clk = 0;
    	rst = 1;
    	#5
    	rst = 0;
    end
    
    always #10 clk = ~clk;
    
    div7 inst(
    	.clk(clk),
    	.rst(rst),
    	.clk_div7(clk_div7));
    
    endmodule
    

    仿真波形如下:

    可以看到,原时钟周期为20ns,分频后时钟周期为140ns。

    N+0.5分频

    N+0.5分频需要时钟周期变为原来的N+0.5倍,因为有0.5出现,所以还是需要上升沿与下降沿一起用,以3.5分频为例,需要上升沿时钟和下降沿时钟按如下变化,然后相与。需要注意的占空比不是50%,一般小数分频丢不要求占空比。由下图可知,需要上升沿时钟拉高四个时钟周期,而下降沿始终需要拉低三个始终周期,前后各错开半个时钟周期。

    代码如下:

    module div_35(
    	input	wire 	clk,
    	input	wire 	rst,
    	output 	wire	clk_div35
        );
    reg clk_pos,clk_neg;
    reg	[2:0] cnt_pos,cnt_neg;
    
    always @(posedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		cnt_pos <= 3'b000;
    	end
    	else if (cnt_pos == 3'b110) begin
    		cnt_pos <= 3'b000;
    	end
    	else begin
    		cnt_pos <= cnt_pos + 1'b1;
    	end
    end
    
    always @(posedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		clk_pos <= 1'b0;
    	end
    	else if (cnt_pos == 3'b000) begin
    		clk_pos <= 1'b1;
    	end
    	else if(cnt_pos == 3'b100) begin
    		clk_pos <= 1'b0;
    	end
    end
    
    always @(negedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		cnt_neg <= 3'b000;
    	end
    	else if (cnt_neg == 3'b110) begin
    		cnt_neg <= 3'b000;
    	end
    	else begin
    		cnt_neg <= cnt_neg + 1'b1;
    	end
    end
    
    always @(negedge clk or posedge rst) begin
    	if (rst) begin
    		// reset
    		clk_neg <= 1'b1;
    	end
    	else if (cnt_neg == 3'b000) begin
    		clk_neg <= 1'b0;
    	end
    	else if(cnt_neg == 3'b011) begin
    		clk_neg <= 1'b1;
    	end
    end
    
    assign clk_div35 = clk_pos & clk_neg;
    
    endmodule

     testbench:

    module tb_35();
    
    reg     clk,rst;
    wire	clk_div35;
    
    initial
    begin
    	clk = 0;
    	rst = 1;
    	#5
    	rst = 0;
    end
    
    always #10 clk = ~clk;
    
    div_35 inst(
    	.clk(clk),
    	.rst(rst),
    	.clk_div35(clk_div35));
    endmodule
    

     仿真波形图如下:

    可以看到原时钟频率为20ns,分频后时钟频率为70ns。

    任意小数分频

    任意小数分频实现起来比较麻烦,首先需要确定分子和分母, 如5.3分频,5.3=53/10,53/10 =5...3,因此需要5(商)分频和8(余数+商)分频组合起来。然后解下面的方程组确定需要几个5分频,几个8分频。a+b=10,5a+8b=53;解得a=9,b=1,也就是说需要9个5分频和1个8分频。具体为什么这么做我也不是很懂,只把代码和结果贴在下面:

    module div_53(
    
                      output reg   clkout,
                      input        rstn,
                      input        refclk,
                      input [31:0] fenzi,//fenzi/fenmu must equal or more than 2
                      input [31:0] fenmu //fenzi/fenmu must equal or more than 2
    );
       reg [2:0]                   rstn_syn;
       reg [31:0]                  cnt;
    
       //1. reset synchronization;
       //2. indicate that refclk is already stable
       always @(posedge refclk) begin
          rstn_syn[0] <= rstn;
          rstn_syn[1] <= rstn_syn[0];
          rstn_syn[2] <= rstn_syn[1];
       end
    
       //1. main algorithm
       always @(posedge refclk or negedge rstn_syn[2]) begin
          if(!rstn_syn[2]) cnt <= 0;
          else begin
             if(cnt < fenzi) cnt <= cnt + fenmu;
             else cnt <= cnt + fenmu - fenzi;
          end
       end
    
       //1. base the above algorithm, deduce clkout
       always @(posedge refclk or negedge rstn_syn[2]) begin
          if(!rstn_syn[2]) clkout <= 0;
          else begin
             if(((cnt > (fenzi>>1)) || (cnt == (fenzi>>1))) && (cnt < fenzi)) clkout <= 1;
             else clkout <= 0;
          end
       end
    endmodule

    testbench:

    module tb();
       reg refclk;
       initial begin
          refclk = 0;
       end
       always #0.2 refclk = !refclk;
    
       reg rstn;
       initial begin
          rstn = 0;
          #100;
          rstn = 1;
       end
    
       reg [31:0] fenzi;
       reg [31:0] fenmu;
       reg        enable_clkFracDiv;
       initial begin
          fenzi=32'd53;
          fenmu=32'd10;
          enable_clkFracDiv=0;
          #200;
          enable_clkFracDiv=1;
       end
    
       div_5 clkFracDiv(
                             /*output reg   */.clkout (clkout),
                             /*input        */.rstn   (rstn && enable_clkFracDiv ),
                             /*input        */.refclk (refclk),
                             /*input [31:0] */.fenzi  (fenzi ),//fenzi/fenmu must equal or more than 2
                             /*input [31:0] */.fenmu  (fenmu ) //fenzi/fenmu must equal or more than 2
                             );
    endmodule

    仿真波形如下:

    虽然可以实现原时钟53个时钟,输出10个时钟,但会发生时钟周期抖动,并且并不是5分频和8分频组成的。不懂。 

    展开全文
  • #偶数N分频 利用计数器,当计数到N/2-1时计数清零,输出时钟翻转 以4分频为例: module div_4(clk,rst,clk_out); input clk,rst; output reg clk_out; reg cnt; always@(posedge clk or negedge rst) begin ...

    #偶数N分频
    利用计数器,当计数到N/2-1时计数清零,输出时钟翻转
    以4分频为例:

    module div_4(clk,rst,clk_out);
    	input clk,rst;
    	output reg clk_out;
    	reg cnt;
    	
    	always@(posedge clk or negedge rst)
    	begin
    		if(rst)
    			{cnt,clk_out}<=0;
    		else if(cnt==1)
    		begin 
    			clk_out<=~clk_out;
    			cnt<=0;
    		end
    		else
    			cnt<=cnt+1;
    	end
    endmodule				

    #奇数N分频(占空比50%)
    上下时钟边沿检测(分别得到两个占空比不是50%的N分频,高电平时间为(N-1)/2),要想得到50分频,差半个时钟,而上下边沿结果正好相差半个时钟,相或即可得到结果),做一样的操作,先模N计数,然后计数到1和1+(N-1)/2时输出时钟翻转,结果相或得出N分频。

    module(clk,rst,clk_out);
    	input clk,rst;
    	output reg clk_out;
    	reg clk1,clk2;
    	reg [1:0]cnt1,cnt2;
    	//上升沿5分频
    	always@(posedge clk or negedge rst)
    	begin 
    		if(!rst)
    			{clk1,cnt1}<=0;
    		else if(cnt1==4)
    			cnt1<=0;
    		else
    		begin
    			cnt1<=cnt1+1;
    			if(cnt1==1||cnt1==3)
    				clk1<=~clk1;
    		end
    	end
    	//下降沿5分频
    	always@(negedge clk or negedge rst)
    	begin
    		if(!rst)
    			{clk2,cnt2}<=0;
    		else if(cnt2==4)
    			cnt2<=0;
    		else
    		begin
    			cnt2<=cnt+1;
    			if(cnt2==1||cnt2==3)
    				clk2<=~clk2;
    		end
    	end
    	
    	assign clk_out=clk1|clk2;
    endmodule
    展开全文
  • 任意分频 奇数偶数分频

    千次阅读 2017-08-12 13:58:19
    任意分频的方法从网上看了有不少东西,主要有奇数分频,偶数分频,再就是任意分频。  1、先说一下任意分频,任意分频的方法类似于DDS的产生方法,Fo/Fclk = fword / 2^N; N为计数器位宽,位宽越大,计数器越精确,...
  • FPGA中的分频器-偶数分频

    千次阅读 2019-05-10 10:17:22
    分频器是FPGA常用的一种时序电路,在各种的小项目中应用的尤为常见,今天李老湿哦给大家讲讲分频器之偶数分频。 基本原理:**偶数倍分频是最简单的一种分频模式,完全可通过计数器计数实现。如要进行N倍偶数分频,...
  • 偶数分频代码,参数化设计,这里的偶数分频只使用了一个计数器,通过计数在分频后的前半个周期和后半个周期电平去反之后就得到了一个偶数分频模块,这个代码的移植性应该很强。 module odd_div( input i_sys_clk , ...
  • FPGA分频器设计(偶数分频、奇数分频)

    千次阅读 多人点赞 2021-01-13 16:54:42
    时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频、分频信号;另一种则是使用硬件描述语言构建一个分频电路。 分频器的设计通常分为以下三类:奇数分频器、偶数分频器及...
  • 假设为 N(偶数分频,只需计数到 N/2-1,然后时钟翻转、计数清零,如此循环就可以得到 N(偶)分频,可以通过改变参量 N 的值和计数变量 cnt 的位宽,实现任意偶分频, 我们由此可以写出如下代码: module Even_...
  • 对于偶数分屏,如四分频,我们可以发现其分频后的时钟的跳变,无论是上升沿还是下降沿都是统一在原始时钟信号的上升沿如clk1, 或者是下降沿如clk2。如下图所示; 因此对于偶数分频,我们可以用一个计数器来实现...
  • 该代码可以实现任意的奇数偶数分频
  • 偶数分频,奇数分频,倍频
  • 偶数分频

    2019-11-03 19:34:47
    //偶数分频 //分频是将频率降低,也就是时间周期增加,就波形而言,就是实现了N倍的clk module div_even( input wire clk, input wire rst_n, output reg clkout //分频后的时钟输出 ); //可通过修改N的值实现...
  • 分频比较简单,假设为N(偶数分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频,可以通过改变参量N的值和计数变量cnt的位宽实现任意偶分频。代码如下: DUT:以4分频为例, ...
  • 任意偶数分频电路

    2013-05-31 12:00:42
    VHDL实现任意偶数分频电路,直接在Ise里运行就行
  • 占空比1:1的2、4、8分频 偶数分频Cyclone4E FPGA设计Verilog逻辑源码Quartus工程文件, Quartus软件版本11.0, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 module fengping_1(clk_50M,f_2...
  • //1152分频 //2N分频都可以套用 //只需要改动counter寄存器的位数以及把反转的条件改为对应的N-1 module div_1152(clk,rst,f); input clk,rst; output f; reg f; reg [10:0] counter; always@(posedge clk or ...
  • 偶数分频,重点是写一个计数器和一个分频器,分频器要注意翻转的时间,在N/2-1和N-1的时候翻转 //写一个八分频代码 module divider8( input clk, input rst_n, output dividerclk ); reg [2:0] count_n; ...
  • 偶数分频.txt

    2019-05-23 15:14:19
    此代码为10分频,验证可用,如果需要改为其他分频,只要把计数器改为N/2-1就行
  • VHDL实现的偶数分频

    2009-05-28 10:03:55
    VHDL实现的偶数分频,带工程文件,仿真通过
  • 任意的verlog奇数和偶数分频 /****************** 作者:robetwu 时间:2020/7/9 运行环境:Quartus II 13.0 *******************/ module Five_div( input clk,rst_n, output reg clk_div//5分频时钟只能用于奇数...
  • FPGA偶数分频

    2019-03-14 16:49:57
    module even_div ( clk, rst_n, clkout ); input wire clk; input wire rst_n; output reg clkout; parameter N=4; parameter WIDITH=3; reg [WIDITH-1:0]cnt; always@(posedge clk or negedge rst_n) beg...
  • 偶数分频 // 偶数N分频 // 计数器位宽 X module div( input clk, input rst_n, output out_clk); reg out_clk; reg [X:0] cnt; always @(posedge clk or negedge rst_n) if(!rst_n) begin cnt ; out_clk ; else if...
  • 奇数偶数分频电路(占空比50%)

    千次阅读 2020-06-25 17:41:52
    数字电路中经常会遇到需要将时钟信号进行分频,一般分为奇数分频和偶数分频,同时对占空比的要求也不一样,常见的是需要保持占空比仍为50%。本文通过Verilog代码实现简单的分频电路。文末附上所有代码和仿真波形。 ...
  • 1.简单的二分频module half_clk(reset, clk_in, clk_out); input clk_in, reset; output clk_out; reg clk_out;always @(posedge clk_in) begin if(!reset) clk_out = 0; else clk_out = ~clk_out; end endmodule2....
  • 相关文章: Verilog设计(二):分频电路设计 https://blog.csdn.net/qq_26652069/article/details/90759052 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)...D触发器实现二分频电路(D触发器构成的2分...
  • 大家看看这个东西,我觉得很有用的。里面包含了测试的波形,对于初学者来说是好东西

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,590
精华内容 636
关键字:

偶数分频