4.1 介紹
偶數時鐘分頻很好實作,使用一個計數器累加到一定值再清零,同時翻轉電平就可以了,本章主要講的是奇數分頻和小數分頻,
4.2 同步整數分頻器
使用Moore狀態機可以輕松的實作同步整數分頻,需要幾分頻就有幾種狀態,但是如果是奇數分頻,那么輸出就不可能為50%占空比,

如圖使用了一個七個狀態的Moore狀態機實作了7分頻,其中4個狀態輸出為0,3個狀態輸出為1,顯然占空比不為50%
4.3 具有50%占空比的奇數整數分頻
1、以期望輸出頻率的一半產生兩個正交相位時鐘(90°相位差),
2、將兩個波形異或得到輸出頻率,
對于整奇數N分頻:
1、創建一個計數到N-1的計數器,
2、使用兩個T觸發器,并且第一個觸發器當計數到0使能,第二個觸發器計數到(N+1)/2使能,
3、TFF1由上升沿觸發,TFF2由下降沿觸發,兩個觸發器的輸出都是2N分頻的時鐘,
4、異或得到最終輸出,


`timescale 1ns / 1ps module div3( input clk_in, input rst_n, output clk_out ); reg [3:0]count; reg div1,div2; always @(posedge clk_in or negedge rst_n) begin if(~rst_n) count <= 'd0; else begin count <= (count<2)?(count + 1'b1):'d0; end end always @(posedge clk_in or negedge rst_n) begin if(~rst_n) div1 <= 1'b0; else if(count == 0) div1 <= ~div1; end always @(negedge clk_in or negedge rst_n) begin if(~rst_n) div2 <= 1'b0; else if(count == 2) div2 <= ~div2; end assign clk_out = div1 ^ div2; endmodule
testbench
`timescale 1ns / 1ps module tb_div3(); reg clk_in; reg rst_n; wire clk_out; initial begin clk_in = 0; rst_n = 0; #100 rst_n = 1; end always #10 clk_in = ~clk_in; div3 u0( .clk_in(clk_in), .rst_n(rst_n), .clk_out(clk_out) ); endmodule
仿真波形

4.4 非整數分頻(非50%占空比)
4.4.1 具有非50%占空比的1.5倍分頻

`timescale 1ns / 1ps module div1_5( input clk_in, input rst_n, output reg clk_out ); wire clk_div3; wire clk_mux; assign clk_mux = clk_div3 ? clk_in : ~clk_in; always @(posedge clk_mux or negedge rst_n) begin if(~rst_n) clk_out <= 1'b0; else clk_out <= ~clk_out; end div3 u0( .clk_in(clk_in), .rst_n(rst_n), .clk_out(clk_div3) ); endmodule
仿真波形

該電路綜合可能出現問題,因為多路器的兩個輸入端延時并不相等,可能輸出產生毛刺,參考時鐘頻率越高,出錯的可能性也越大,
4.4.2 4.5倍分頻計數器的實作(非50%占空比)
本方法可以使輸出時鐘不含毛刺,概括的講,這種方法是在9個原始時鐘內等間隔產生兩個脈沖,
1、使用復位值為0_0000_0001的9位移位暫存器,在每個時鐘上升沿回圈左移一位,
2、產生第一個脈沖,下降沿移動第一位,并將移動后的結果和第一位、第二位進行或操作,
3、產生第二個脈沖,第五位和第六位半周期時移動,并與第六位進行或操作,
注意這里每一個脈沖都是三個信號相或得到的,這樣做的目的是防止兩個信號同時變化出現競爭冒險現象,

`timescale 1ns / 1ps module div4_5( input clk_in, input rst_n, output clk_out ); reg [8:0]count; reg count1_shift,count5_shift,count6_shift; always @(posedge clk_in or negedge rst_n ) begin if(~rst_n) count <= 'd1; else count <= {count[7:0],count[8]}; end always @(negedge clk_in or negedge rst_n ) begin if(~rst_n)begin count1_shift <= 1'b0; count5_shift <= 1'b0; count6_shift <= 1'b0; end else begin count1_shift <= count[1]; count5_shift <= count[5]; count6_shift <= count[6]; end end assign clk_out = count[1]|count1_shift|count[2]|count5_shift|count[6]|count6_shift; endmodule
仿真波形

4.5 N分頻的替換方法
以上電路都假設輸入時鐘占空比50%,否則小數分頻輸出會出現抖動,整數分頻器也會有不同占空比,
基于查找表的組合反饋電路可以產生不含毛刺的時鐘,
4.5.1 1.5分頻的查找表實作

這里不是三分頻嗎,為啥說實作了一個1.5分頻?
Google了一下發現作者電路沒給全,完整電路如下,


這樣就比較好懂了,電路也比較簡單,就懶得寫代碼了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539733.html
標籤:其他
上一篇:利用云服務器發布專案
下一篇:線段簡化的幾種演算法
