一、原因
由于項(xiàng)目需要,整個(gè)工程需要在100kHz的時(shí)鐘下運(yùn)行,F(xiàn)PGA的clk:50MHz
二、方案分析
采用IP核得到分頻時(shí)鐘
clocking wizard

問題:MMCM和PLL都不能實(shí)現(xiàn)分頻到100KHz這么低的頻率
MMCM最小頻率4.687MHz
PLL最小頻率6.25MHz

自己寫一個(gè)簡單的分頻模塊
分頻模塊如下:
module divi_fre #(parameter DIVNUM=500,parameter WIDTH=9)(
input clk,
input rst_n,
output reg divi_clk
);
reg [WIDTH-1:0] counter;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
counter <= 'd0;
end
else begin
counter <= counter + 1'b1;
if(counter==DIVNUM/2-1)
counter <= 'd0;
end
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
divi_clk <= 1'b0;
end
else begin
if(counter == DIVNUM/2-1)begin
divi_clk <= ~divi_clk;
end
end
end
endmodule
問題:自己寫的分頻模塊直接使用是不可以的,需要在約束文件中進(jìn)行時(shí)序約束
自寫分頻模塊時(shí)鐘時(shí)序約束
(1)打開implemented Design
查看分頻模塊的原理圖



找到輸出divi_clk


可以看到divi_clk_reg寄存器的C端口連接的是輸入CLK(50MHz),Q端口連接的是divi_clk(100KHz)
(2)約束文件編寫
create_clock -period 20.000 -name clk1 [get_ports clk]
create_generated_clock -name clk2 -source [get_pins u_divi_fre/divi_clk_reg/C] -divide_by 500 [get_pins u_divi_fre/divi_clk_reg/Q]
clk1對應(yīng)50MHz
20ns--->50MHz, get_ports對應(yīng)clk
注:clk1和clk2只是隨意取的名字,沒有影響
clk2對應(yīng)100kHz
-divide_by后跟的是計(jì)算得到的分頻值,50_000_000/100_000=500
-source后跟輸入時(shí)鐘,上面說到了divi_clk_reg寄存器的C端口連接的是輸入CLK,注意這個(gè)定位到寄存器的時(shí)序約束需要從頂層一層一層傳下來到管腳
[get_pins u_divi_fre/divi_clk_reg/Q]就輸出的divi_clk了文章來源:http://www.zghlxwxcb.cn/news/detail-469743.html
其實(shí)應(yīng)該直接get_ports到clk和divi也是可以的,但是因?yàn)槲耶?dāng)時(shí)沒這么寫,后面改改文章來源地址http://www.zghlxwxcb.cn/news/detail-469743.html
到了這里,關(guān)于Vivado自寫分頻模塊的分頻時(shí)鐘的約束條件編寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!