數字二倍頻電路

常用數字二倍頻電路介紹

在這裏插入圖片描述
由一個同或門與一個時鐘上升沿有效的D觸發器(連接成翻轉器)組成,其中clk_in爲外部輸入時鐘週期信號,clk_out爲二倍頻輸出信號。下圖爲其輸入輸出波形。
在這裏插入圖片描述
在t0時刻:(穩定狀態)
clk_in爲低電平,D觸發器爲復位狀態(即Q=0、Q#=1),這樣Q#與clk_in經"同或門"後爲低電平(異出爲0),此時爲初始穩定狀態,如下圖所示:

當t1時刻到來時:(並非穩定狀態)
clk_in時鐘變爲高電平,此時D觸發器尚未翻轉,“同或門"另一輸入引腳亦仍爲高電平,則"同或門"輸出轉變爲高電平(同出爲"1”),同時此輸出作爲有效時鐘上升沿觸發D觸發器翻轉,則有Q=1、Q#=0,如下圖所示:

當t2時刻到來:(穩定狀態)

之後每次輸入信號變化一次,則重複一次穩定狀態、不穩定狀態、穩定狀態的變化。從D觸發器翻轉輸出至"同或門"輸出變化那一段時間,稱爲延時(Tdelay),在這個電路里也就是高電平寬度。在74系列邏輯器件中,這個延時值大約爲幾十個納秒(ns),在可編程邏輯(FPGA/CPLD中)則只有幾個納秒,可以通過在這個延時鏈路上插入多個緩衝器來增加高電平的寬度(也就是佔空比)。

Verilog HDL語言描述電路

  1. 常用方法

    module frequency_multiplier
    (
    	input clk,
    	 output out_clk
    );
    reg         temp_mul;
    assign      out_clk = ~(clk ^ ~temp_mul);
    
    always @(posedge out_clk)
    begin
    	temp_mul <= ~temp_mul ;
    end
    endmodule
    

    modelsim 後仿真結果(必須用後仿真
    在這裏插入圖片描述

  2. 在脈衝頻率不足100k(步進電機控制頻率<<500k)的情況下還可以採用高頻檢測輸入脈衝信號的上升沿和下降沿加延時5us實現倍頻功能

    module frequency_multiplier
    (
    	input          clk,
    	 input          rst_n,
    	 input          clk_in,
    	output         clk_out,
    	output wire pos_edge,
    	output wire neg_edge,
    	 output wire both_edge,
    	output         ref_clk
    );
    assign  ref_clk = clk_in;
    
    reg     clkin_r0, clkin_r1;                  // 狀態寄存器
    always @ (posedge clk or negedge rst_n)begin
    	 if (!rst_n) begin
    			clkin_r0 <= 1'b0;
       		 	clkin_r1 <= 1'b0;
    	end
    	 else begin
        		clkin_r0 <= clk_in;
        		clkin_r1 <= clkin_r0;
    	end
    end
    wire    clkin_sign;
    //wire    pos_edge,neg_edge,both_edge;
    
    assign pos_edge  = (~clkin_r1)& ( clkin_r0);
    assign neg_edge  =   clkin_r1 & (~clkin_r0);   
    assign both_edge =   clkin_r1 ^   clkin_r0;  // 雙邊沿檢測,或pos_edge|neg_edge
    assign clkin_sign = ~both_edge;
    
    reg [31:0] counter;
    always @(posedge clk or negedge clkin_sign)
    begin
    	if (!clkin_sign)
       		 counter  <= 0;
    	else if (counter >= 32'd1000)            //檢測到沿後延時5us
     	   counter     <= 32'd1000;
    	 else
      	  counter  <= counter + 1;
    end
    
    assign clk_out =(counter == 32'd1000)? 0 : 1;
    
    endmodule
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章