1.分頻 分頻在 fpga 的設(shè)計中一直都擔(dān)任著很重要的角色,對于分頻,,我們通常都是利用計算器來計算達(dá)到想要的時鐘頻率,但是我們可以注意到一個問題,我么平時使用的計數(shù)器實現(xiàn)的分頻只能實現(xiàn)偶數(shù),假如我們需要計數(shù)分頻呢?本次筆記,,我們同樣利用計數(shù)器來實現(xiàn)任意奇數(shù)的分頻.我們看一下實現(xiàn)奇數(shù)分頻的時序圖: 上面的時序圖我們可以知道,,奇數(shù)分頻,其實就是通過主時鐘信號上沿跟下沿產(chǎn)生一對脈沖信號,,然后把兩信號相或門就可以得到奇數(shù)分頻的結(jié)果了 下面我們看一下例程: moduleDiv_clk(clk,rst_n,out_clk); inputrst_n,clk; outputout_clk; parameterN=7;//N定義幾分頻 regout_clk_1;//由時鐘上沿產(chǎn)生的信號 reg[9:0]cnt_1;//上沿時鐘信號產(chǎn)生的計數(shù)器 always@(posedgeclkornegedgerst_n) begin if(!rst_n)begin cnt_1<=1'd0;>=1'd0;><=1'd0; end="" elsebegin="">=1'd0;><=((n-1) )-1)//2="" begin="">=((n-1)><=cnt_1+1'd1;>=cnt_1+1'd1;><=1'd1; end="">=1'd1;><=n-2) begin="">=n-2)><=cnt_1+1'd1;>=cnt_1+1'd1;><=1'd0; end="" elsebegin="">=1'd0;><=1'd0;>=1'd0;><=1'd0; end="" end="" end="" regout_clk_0;//由時鐘上沿產(chǎn)生的信號="" reg[9:0]cnt_0;//上沿時鐘信號產(chǎn)生的計數(shù)器="" always@(negedgeclkornegedgerst_n)="" begin="" if(!rst_n)begin="">=1'd0;><=1'd0;>=1'd0;><=1'd0; end="" elsebegin="">=1'd0;><=((n-1) )-1)="" begin="">=((n-1)><=cnt_0+1'd1;>=cnt_0+1'd1;><=1'd1; end="">=1'd1;><=n-2) begin="">=n-2)><=cnt_0+1'd1;>=cnt_0+1'd1;><=1'd0; end="" elsebegin="">=1'd0;><=1'd0;>=1'd0;><=1'd0; end="" end="" end="" assignout_clk="out_clk_1|out_clk_0;" endmodule//---------------------`tb`timescale1ns/1ns`defineclock_period20modulediv_clk_tb();="" regclk,rst_n;="" wireout_clk;="" initialclk="1;" always#(`clock_period/2)clk="~clk;" initialbegin="" rst_n="0;" #20;="" rst_n="1;" #(`clock_period*50);="" $stop;="" end="" div_clk="" #(.n(7))="" div_clk(.clk(clk),.rst_n(rst_n),.out_clk(out_clk));endmodule="">=1'd0;> 仿真波形圖: 從波形圖可以看到我們實現(xiàn)奇數(shù)分頻的等分頻 對于偶數(shù)也能實現(xiàn)分頻,但是非等分 備注:有興趣的可以做一下任意分頻的, 即:判斷奇偶后進(jìn)行等分頻 2.倍頻 接下來我們嘗試?yán)?FPGA 的內(nèi)部的電路延遲,,來搭建一個倍頻電路(在后仿真的前提下) 當(dāng)然我們也可以使用計數(shù)器實現(xiàn)倍頻 我們看一下例程: moduleMul_clk(clk,out_clk); inputclk; outputout_clk; regclk_a,clk_b; wirerst_n; assignout_clk=clk_a|clk_b; assignrst_n=~out_clk; always@(posedgeclkornegedgerst_n) begin if(!rst_n) clk_a<=1'b0; else="">=1'b0;><=1'b1; end="" always@(negedgeclkornegedgerst_n)="" begin="" if(!rst_n)="">=1'b1;><=1'b0; else="">=1'b0;><=1'b1; endendmodule`timescale1ns/1ns`defineclock_period20modulemul_clk_tb();="" regclk;="" wireout_clk;="" initialclk="1;" always#(`clock_period/2)clk="~clk;" initialbegin="" #(`clock_period*50);="" $stop;="" end="">=1'b1;>
|
|