常用數字二倍頻電路介紹
由一個同或門與一個時鐘上升沿有效的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語言描述電路
-
常用方法
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 後仿真結果(必須用後仿真)
-
在脈衝頻率不足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