1.分頻器
計(jì)數(shù)器是對(duì)于時(shí)鐘信號(hào)進(jìn)行計(jì)數(shù),板載晶振的時(shí)鐘頻率是固定的,有時(shí)候需要進(jìn)行分頻和倍頻才能滿足需要
開(kāi)發(fā)板上只有一種晶振,只有一種頻率的時(shí)鐘,想要通過(guò)對(duì)與固定時(shí)鐘進(jìn)行分頻或者是倍頻的方式得到各個(gè)模塊所需的時(shí)鐘頻率,得到比固定時(shí)鐘快的時(shí)鐘通過(guò)倍頻,得到比固定時(shí)鐘慢的時(shí)鐘通過(guò)分頻
- 分頻和倍頻都有兩種方式:第一種是通過(guò)鎖相環(huán)(PLL),另外一種是編寫(xiě)verilog代碼
- 分頻器是數(shù)字系統(tǒng)設(shè)計(jì)中最常見(jiàn)的基本電路之一,所謂分頻就是把輸入信號(hào)的頻率變成成倍數(shù)地低于輸入頻率的輸出信號(hào)
- 分頻器原理是將輸入的信號(hào)做為計(jì)數(shù)脈沖,計(jì)數(shù)器的輸出端口的脈沖是按一定頻率輸出的,就可以看作是輸出端口的分頻
- 分頻器分為偶數(shù)分頻器和奇數(shù)分頻器,分頻器和計(jì)數(shù)器非常類(lèi)似,有時(shí)可以認(rèn)為是同一種東西
2.FPGA實(shí)現(xiàn)
- 實(shí)現(xiàn)對(duì)于固定時(shí)鐘6分頻的電路
2.1 模塊框圖和波形圖
2.2 RTL
module divider_six(
input wire sys_clk,
input wire sys_rst_n,
output reg clk_out
);
reg [1:0] cnt;
// cnt變量
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 2'd0;
else if(cnt == 2'd2)
cnt <= 2'd0;
else
cnt <= cnt + 2'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_out <= 1'b0;
else if(cnt == 2'd2)
clk_out <= ~clk_out;
else
clk_out <= clk_out;
endmodule
- 創(chuàng)建項(xiàng)目,編譯代碼
2.3 Testbench
`timescale 1ns/1ns
module tb_divider_six();
reg sys_clk;
reg sys_rst_n;
wire [1:0] clk_out;
// 初始化時(shí)鐘和復(fù)位信號(hào)
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#20;
sys_rst_n = 1'b1;
end
// 模擬時(shí)鐘信號(hào)
always #10 sys_clk = ~sys_clk;
// 模塊的實(shí)例化
divider_six divider_six_inst(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.clk_out (clk_out)
);
endmodule
- 加載仿真代碼,進(jìn)行仿真設(shè)置之后進(jìn)行仿真
2.4 上板驗(yàn)證
- 將信號(hào)輸出到擴(kuò)展IO口,通過(guò)示波器進(jìn)行觀察波形
- 重新進(jìn)行編譯,連接板卡(下載器和電源)
- 添加sof文件,進(jìn)行程序下載
- 連接示波器
2.5 優(yōu)化
- 這種做法是不嚴(yán)謹(jǐn)?shù)?在低速系統(tǒng)中不易察覺(jué),在高速系統(tǒng)中就容易出現(xiàn)問(wèn)題,通過(guò)這種分頻的方式表面上是對(duì)系統(tǒng)時(shí)鐘進(jìn)行了分頻產(chǎn)生了新的低頻時(shí)鐘,上述得到的分頻時(shí)鐘,實(shí)際上與真正的分頻時(shí)鐘是有不同的;
- 在FPGA當(dāng)中凡是時(shí)鐘信號(hào)都要連接到全局時(shí)鐘網(wǎng)絡(luò),全局時(shí)鐘網(wǎng)絡(luò)也叫做全局時(shí)鐘樹(shù),是FPGA廠商專(zhuān)門(mén)針對(duì)時(shí)鐘路徑進(jìn)行設(shè)計(jì)的,能夠使時(shí)鐘信號(hào)到達(dá)各個(gè)寄存器的時(shí)間盡可能相同,減少時(shí)序問(wèn)題的產(chǎn)生,上面產(chǎn)生的分頻信號(hào)沒(méi)有連接到全局時(shí)鐘網(wǎng)絡(luò)上,但是外部晶振產(chǎn)生的時(shí)鐘信號(hào),通過(guò)管腳連接到了專(zhuān)用時(shí)鐘引腳上,自然連接到了FPGA全局時(shí)鐘網(wǎng)絡(luò)中
- 在系統(tǒng)時(shí)鐘工作下的信號(hào)比在上述分頻信號(hào)工作下的信號(hào)更能在高速工作下保持穩(wěn)定,如何對(duì)上述代碼進(jìn)行改進(jìn)?使用時(shí)鐘標(biāo)志信號(hào)cnt_flag
module divider_six(
input wire sys_clk,
input wire sys_rst_n,
// output reg clk_out
output reg clk_flag;
);
reg [2:0] cnt;
// cnt變量
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 2'd0;
else if(cnt == 3'd5)
cnt <= 3'd0;
else
cnt <= cnt + 3'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_flag <= 1'b0;
else if(cnt == 3'd4) // flag信號(hào)是在計(jì)數(shù)最大值減一的時(shí)候產(chǎn)生一個(gè)周期脈沖
clk_flag <= 1'b1;
else
clk_flag <= 1'b0;
// 按照之前產(chǎn)生的分頻時(shí)鐘給變量a賦值
reg a ;
always @(posedge clk_out or negedge sys_rst_n) // 使用產(chǎn)生的分頻時(shí)鐘clk_out
if(sys_rst_n == 1'b0)
a <= 1'b0;
else
a <= a + 1'b1;
// 時(shí)鐘標(biāo)志位產(chǎn)生的分頻時(shí)鐘對(duì)于變量進(jìn)行賦值
always@(posedge sys_clk or sys_rst_n) // 仍然使用系統(tǒng)時(shí)鐘,更加穩(wěn)定
if(sys_rst_n == 1'b0)
a <= 1'b0;
else if(cnt_flag == 1'b1)
a <= 1'b1;
endmodule
`timescale 1ns/1ns
module tb_divider_six();
reg sys_clk;
reg sys_rst_n;
wire [2:0] clk_flag;
// 初始化時(shí)鐘和復(fù)位信號(hào)
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#20;
sys_rst_n = 1'b1;
end
// 模擬時(shí)鐘信號(hào)
always #10 sys_clk = ~sys_clk;
// 模塊的實(shí)例化
divider_six divider_six_inst(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.clk_flag (clk_flag)
);
endmodule
產(chǎn)生一個(gè)用于標(biāo)記 6 分頻的 clk_flag 標(biāo)志信號(hào),這樣每?jī)?clk_flag 脈沖之間的頻率就是對(duì) sys_clk 時(shí)鐘信號(hào)的 6 分頻,但是計(jì)數(shù)器計(jì)數(shù)的個(gè)數(shù)我們需增加一些,如圖 18-4 所示需要從 0~5 共 6 個(gè)數(shù),否則不能實(shí)現(xiàn) 6 分頻的功能。和方法 1 對(duì)比可以發(fā)現(xiàn),相當(dāng)于把 clk_out 的上升沿信號(hào)變成了 clk_flag 的脈沖電平信號(hào)cnt_flag 是一樣的道理),為后級(jí)模塊實(shí)現(xiàn)相同的降頻效果。**雖然這樣會(huì)多使用一些寄存器資源,不過(guò)不用擔(dān)心我們的系統(tǒng)是完全可以承擔(dān)的起的,而得到的好處卻遠(yuǎn)遠(yuǎn)大于這點(diǎn)資源的使用,能讓系統(tǒng)更加穩(wěn)定。在后級(jí)模塊中需要使用低頻時(shí)鐘的情況,我們就可以不用 clk_out 這種信號(hào)作為時(shí)鐘了,而是繼續(xù)使用 sys_clk 系統(tǒng)時(shí)鐘來(lái)作為時(shí)鐘,但讓其執(zhí)行語(yǔ)句的條件以 clk_flag 信號(hào)為高電平的時(shí)候有效。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-459081.html
2.6 分頻數(shù)和占空比
若要實(shí)現(xiàn)N分頻(N為偶數(shù))占空比為50%,只需在計(jì)數(shù)器計(jì)數(shù)到N-1(重新從0開(kāi)始計(jì)數(shù)),在小于N/2-1時(shí)輸出低電平,輸出N/2-1時(shí)輸出高電平。而要改變占空比的,則調(diào)整比較器比較的值。(盡量不要在一個(gè)module內(nèi)用作后級(jí)時(shí)鐘輸入,但可以用于其他module的時(shí)鐘輸入)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-459081.html
到了這里,關(guān)于12-分頻器 -偶分頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!