目錄
任意分頻器電路設計
1、任意偶數(shù)分頻器電路設計
1.2、實驗任務
1.3、程序設計
1.3.1、代碼如下:
1.3.2、編寫仿真 TB 文件
2、任意奇數(shù)分頻器電路設計
2.1、實驗任務
2.2、程序設計
2.2.1、奇數(shù)分頻電路代碼
2.2.2、編寫仿真 TB 文件
2.2.3、仿真驗證
任意分頻器電路設計
1、任意偶數(shù)分頻器電路設計
? ? ? ?偶數(shù)分頻實現(xiàn)比較簡單,假設為 N(偶數(shù))分頻,只需計數(shù)到 N/2-1,然后時鐘翻轉(zhuǎn)、計數(shù)器清零,如此循環(huán)就可以得到 N(偶)分頻。舉個例子,比如晶振時鐘是 100Mhz 時鐘,想得到一個 25Mhz 的時鐘, 那么這個是一個 100/25=4 的四分頻設計,那么按照我們剛說的計數(shù)到 4/2-1=1,然后時鐘翻轉(zhuǎn)、計數(shù)器清零, 就可以得到一個 24Mhz 的時鐘。
1.2、實驗任務
使用 Verilog 語言設計一個任意偶數(shù)分頻電路,默認進行 4 分頻。
1.3、程序設計
? ? ? ?根據(jù)簡介介紹的分頻電路設計思路,假設為 N(偶數(shù))分頻,只需計數(shù)到 N/2-1,然后時鐘翻轉(zhuǎn)、計數(shù)清零,如此循環(huán)就可以得到 N(偶)分頻,可以通過改變參量 N 的值和計數(shù)變量 cnt 的位寬實現(xiàn)任意偶分頻,由于默認為 4 分頻,因此 N 初始值為 4。我們由此可以寫出如下代碼。
1.3.1、代碼如下:
//********************************************
module divide_2
(
input clk , // system clock 50Mhz on board
input rst_n, // system rst, low active
output reg out_clk // output signal
);
parameter N = 4 ;
reg [N/2-1:0] cnt ;
//===============================================================
// ------------------------- MAIN CODE -------------------------
//===============================================================
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt <= 0;
out_clk <= 0;
end
else begin
if(cnt==N/2-1) begin
out_clk <= ~out_clk;
cnt <= 0;
end
else
cnt <= cnt + 1;
end
end
endmodule
1.3.2、編寫仿真 TB 文件
? ? ? 只需要對時鐘以及復位信號進行激勵,代碼編寫如下:
//*************TB****************
`timescale 1ns / 1ps
module TB();
reg sys_clk ;
reg sys_rst_n;
wire out_clk ;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#200
sys_rst_n = 1'b1;
end
always #10 sys_clk = ~sys_clk;
divide_2 u_divide_2(
.clk (sys_clk ),
.rst_n (sys_rst_n ),
.out_clk (out_clk )
);
endmodule
運行后的波形如下顯示:
? ? ? 可以看出,N 初始為 4,當復位撤銷(復位信號低有效)之后,cnt 即開始計數(shù),在計數(shù)器計到 1 的時候,out_clk 進行取反操作,即得到一個四分頻時鐘,大家可以改變 N 參數(shù)看下,看下 N 參數(shù)不一樣,最終分頻的時鐘是多少。
2、任意奇數(shù)分頻器電路設計
? ? ? ?有偶數(shù)分頻就有奇數(shù)分頻,僅實現(xiàn)分頻功能來講其中的差別和實現(xiàn)方式還是很大的,奇數(shù)分頻相對于偶數(shù)分頻要復雜一些,并不是簡單的用計數(shù)器計數(shù)就可以實現(xiàn)的。
? ? ? ?奇數(shù)分頻,顧名思義,是說分頻后的頻率和分頻前的頻率比例是奇數(shù),比如 100Mhz 時鐘,進行三分頻后,就是 33.33Mhz。
? ? ? ?實現(xiàn)奇數(shù)分頻原理是分別用上升沿計數(shù)到 N/2+1,分頻后輸出時鐘進行翻轉(zhuǎn),再計數(shù)到 N/2 輸出 out_clk1,再用下降沿計數(shù)到 N/2+1,分頻后輸出時鐘再進行翻轉(zhuǎn),再計數(shù)到 N/2 輸出out_clk2,將 out_clk1 和 out_clk2 相或即可。我們可以通過修改 N 的值和計數(shù)器的位寬來實現(xiàn)其他奇數(shù)分頻。 其實 out_clk1 和 out_clk2 都已經(jīng)是奇數(shù)分頻的時鐘,只不過占空比不是 50%。
? ? ? 下面在進行奇數(shù)分頻設計之前,我們先來了解下占空比的概念。占空比指的是時鐘信號在一個周期內(nèi)高電平和低電平的比例。如下是一個 50%占空比的一個時鐘波形。
如下是一個 30%占空比的一個時鐘波形。
? ? ? ?一般高質(zhì)量的時鐘信號都是要求有 50%占空比的,50%占空比的時鐘信號對時序分析是非常有好處的。
2.1、實驗任務
使用 Verilog 語言設計一個任意奇數(shù)分頻電路,默認進行 3?分頻,要求輸出時鐘的占空比是50%。
2.2、程序設計
? ? ? ?根據(jù)簡介介紹的奇數(shù)分頻電路設計思路,我們需要新增兩個計數(shù)器,cnt_1 和 cnt_2。初始化 cnt_1 和 cnt_2 為 1,out_clk1 為 0,out_clk2 為 0。
? ? ? ?當 out_clk1 為 0 時,cnt_1 在 clk 時鐘上升沿進行計數(shù),當計數(shù)到 N/2+1 時 out_clk1 進行翻轉(zhuǎn),同時 cnt_1 賦值為初始值 1,當 out_clk1 為 1 時,cnt_1 在 clk 時鐘上升沿進行計數(shù),當計數(shù)到 N/2 時 out_clk1 進行翻轉(zhuǎn),同時 cnt_1 賦值為初始值 1。
? ? ? ?當 out_clk2 為 0 時,cnt_2 在 clk 時鐘下降沿進行計數(shù),當計數(shù)到 N/2+1 時 out_clk2 進行翻轉(zhuǎn),同時 cnt_2 賦值為初始值 1,當 out_clk2 為 1 時,cnt_2 在 clk 時鐘下降沿進行計數(shù),當計數(shù)到 N/2 時 out_clk2 進行翻轉(zhuǎn),同時 cnt_2 賦值為初始值 1。
? ? ? ?這樣 N(奇數(shù))分頻就可以通過改變參量 N 的值和計數(shù)變量 cnt 的位寬實現(xiàn)任意奇數(shù)分頻,由于默認為 3 分頻,因此 N 初始值為 3。3 分頻的 cnt_1 和 cnt_2 計數(shù)到 N/2+1 是計數(shù)到 2,小數(shù)舍棄掉, cnt_1 和 cnt_2 計數(shù)到 N/2 是計數(shù)到 1。
我們由此可以寫出如下代碼。
2.2.1、奇數(shù)分頻電路代碼
//**********任意奇數(shù)分頻*******START***************************
module divide_3
(
input clk, // system clock 50Mhz on board
input rst_n, // system rst, low active
output out_clk // output signal
);
parameter N = 3 ;
reg [N/2 :0] cnt_1;
reg [N/2 :0] cnt_2;
reg out_clk1;
reg out_clk2;
//=====================================================================
// ------------------------- MAIN CODE -------------------------------
//=====================================================================
always @(posedge clk or negedge rst_n) begin //上升沿輸出 out_clk1
if(!rst_n) begin
out_clk1 <= 0;
cnt_1 <= 1; //這里計數(shù)器從 1 開始
end
else begin
if(out_clk1 == 0) begin
if(cnt_1 == N/2+1) begin
out_clk1 <= ~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
else if(cnt_1 == N/2) begin
out_clk1 <= ~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
end
always @(negedge clk or negedge rst_n) begin //下降沿輸出 out_clk2
if(!rst_n) begin
out_clk2 <= 0;
cnt_2 <= 1; //這里計數(shù)器從 1 開始
end
else begin
if(out_clk2 == 0) begin
if(cnt_2 == N/2+1) begin
out_clk2 <= ~out_clk2;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
else if(cnt_2 == N/2) begin
out_clk2 <= ~out_clk2;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
end
assign out_clk = out_clk1 | out_clk2;
endmodule
? ? ?使用 Vivado 綜合后也可以看到電路結(jié)構(gòu),在 RTL ANALYSIS 的?Schematic 中來看下綜合的電路結(jié)構(gòu)。
? ? ? ?可以看出,cnt_1 和 cnt_2 是一個 3bit 的計數(shù)器,out_clk1 和 out_clk2 的電路結(jié)構(gòu)基本是完全相同的,只是 cnt_1 和 cnt_2 計數(shù)器變化的時鐘沿不一樣,大家可以看出 cnt_2 的寄存器的 clk 前面有一個取反的標記,表示 cnt_2 是在時鐘下降沿進行變化,然后 out_clk1 和 out_clk2 進行或操作,即得到一個 50%占空比的奇數(shù) 3 分頻時鐘。
2.2.2、編寫仿真 TB 文件
? ? ? 只需要對時鐘以及復位信號進行激勵,代碼編寫如下:
`timescale 1ns / 1ps
//
module tb_divider_3(); //仿真模塊
//輸入 reg 定義
reg sys_clk;
reg sys_rst_n;
//輸出 wire 定義
wire out_clk;
//設置初始化條件
initial begin
sys_clk = 1'b0; //初始化時鐘為0
sys_rst_n <= 1'b0; //初始復位
#200 //200個時間單位后
sys_rst_n <= 1'b1; //拉高復位
end
always #10 sys_clk = ~sys_clk;
//例化被測試模塊
divider_3 u_divider_3
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.out_clk (out_clk )
);
endmodule
2.2.3、仿真驗證
? ? ? ?測試程序在 Xilinx 的 Vivado 軟件 或者其他仿真工具運行后的波形如下顯示:
? ? ? ??可以看出,N 初始為 3,當復位撤銷(復位信號低有效)之后,cnt_1 和 cnt_2 即開始計數(shù), 當 out_clk1 為 0 時,在 cnt_1 計數(shù)器計到 2 的時候,out_clk1 進行取反操作,當 out_clk1 為 1 時,在 cnt_1 計數(shù)器計到 1 的時候,out_clk1 進行取反操作。
? ? ? ?當 out_clk2 為 0 時,在 cnt_2 計數(shù)器計到 2 的時候,out_clk2 進行取反操作,當 out_clk2 為 1 時,在 cnt_2 計數(shù)器計到 1 的時候,out_clk2 進行取反操作。
? ? ? ?我們可以看出 out_clk1 和 out_clk2 都不是 50%占空比的時鐘,大概是 30%占空比。然后 out_clk1 和 out_clk2 進行或操作,即得到一個 50%占空比的奇數(shù) 3 分頻時鐘。文章來源:http://www.zghlxwxcb.cn/news/detail-576035.html
大家可以改變 N 參數(shù)看下,看下 N 參數(shù)不一樣,最終分頻的時鐘是多少。文章來源地址http://www.zghlxwxcb.cn/news/detail-576035.html
到了這里,關于任意分頻器電路設計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!