我們都知道用fpga做偶數分頻很簡單,只需要用計數器計數到分頻係數n的一半再減去1,不斷去翻轉分頻的訊號即可得到分頻的訊號,那麼奇數奇數分頻其實也是一樣的,但是如果要得到占空比為50%的訊號,那可能就需要處理一下才可以,下圖為占空比為50%的3分頻訊號產生原理。
// 利用原始訊號的上公升沿產生乙個三分頻的訊號,此時占空比不是50%
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_pos <= 8'd0;
clk_div_p <= 1'd0;
endelse if(cnt_pos == div_max/2 - 1) begin
cnt_pos <= cnt_pos + 1'b1;
clk_div_p <= 1'b0;
endelse if(cnt_pos == div_max - 1) begin
cnt_pos <= 8'd0;
clk_div_p <= 1'b1;
endelse begin
cnt_pos <= cnt_pos + 1'b1;
clk_div_p <= clk_div_p;
endend// 利用原始訊號的下降公升沿產生乙個三分頻的訊號,此時占空比不是50%
always @(negedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_neg <= 8'd0;
clk_div_n <= 1'd0;
endelse if(cnt_neg == div_max/2 - 1) begin
cnt_neg <= cnt_neg + 1'b1;
clk_div_n <= 1'b0;
endelse if(cnt_neg == div_max - 1) begin
cnt_neg <= 8'd0;
clk_div_n <= 1'b1;
endelse begin
cnt_neg <= cnt_neg + 1'b1;
clk_div_n <= clk_div_n;
endendassign clk_div = clk_div_n | clk_div_p;
endmodule
`timescale 1ns/1ps
module div_clk_tb;
reg clk;
reg rst_n;
wire clk_div1;
wire clk_div2;
div_clk#(
.div_max(3)
)div_clk_u1
( .clk(clk),
.rst_n(rst_n),
.clk_div(clk_div1)
); div_clk#(
.div_max(5)
)div_clk_u2
( .clk(clk),
.rst_n(rst_n),
.clk_div(clk_div2)
);initial begin
clk = 1'b0;
rst_n = 1'b1;
#100;
rst_n = 1'b0;
#100;
rst_n = 1'b1;
#100000;
$stop;
end always #10 clk = ~clk;
endmodule
**結果:
本人比較菜,如果有什麼地方不對,還請各位大神指正。這個方法最後用到了組合邏輯,容易產生毛刺,如果大家有更好的方法可以前來交流。
FPGA奇數分頻
前注 設計中盡量還是要避免使用自己計數分頻得到的時鐘,去使用廠家自帶的分頻ip 如vivado中的clock wizard 偶數分頻比較簡單,這裡略過。對於不要求占空比為50 的奇數分頻,也比較簡單,直接模n計數,期間進行兩次翻轉就可以了。這裡重點介紹要求占空比為50 的奇數分頻。步驟 1.在時鐘上...
verlog任意奇數和偶數分頻
下面展示一些內聯 片。執行環境 quartus ii 13.0 module five div input clk,rst n,output reg clk div 5分頻時鐘只能用於奇數分頻 reg clk pose reg clk nege reg clk oushu parameter fen...
FPGA任意奇偶數分頻占空比50
簡單的是計數取反,奇數略有不同,分為上公升沿和下降沿計數取反然後再邏輯與即可,相當於補了半個週期 module pulsediv input clk 100m,input n rst,output reg pulseout reg 7 0 divcnt reg clkp,clkn 任意偶數分頻占空比...