目錄
偶數(shù)分頻器電路設(shè)計(jì)
1、偶數(shù)分頻器電路簡介
2、實(shí)驗(yàn)任務(wù)
3、程序設(shè)計(jì)
方法1:
3.1、8分頻電路代碼如下:
3.2、仿真驗(yàn)證
3.2.1、編寫 TB 文件
3.2.2、仿真驗(yàn)證
方法2:
4、計(jì)數(shù)器進(jìn)行分頻
4.1、仿真測試
偶數(shù)分頻器電路設(shè)計(jì)
? ? ? ?分頻器在邏輯設(shè)計(jì)中一直都擔(dān)任著很重要的角色,分頻器一般包括計(jì)數(shù)分頻和偶數(shù)分頻。實(shí)現(xiàn)偶數(shù)分頻可通過一個(gè)簡單計(jì)數(shù)器實(shí)現(xiàn),而如果需要三分頻,五分頻,七分頻等奇數(shù)分頻,一個(gè)計(jì)數(shù)器是不夠的。我們先來看下偶數(shù)分頻。
1、偶數(shù)分頻器電路簡介
? ? ? ?實(shí)現(xiàn)分頻一般有兩個(gè)方法,一個(gè)方法是直接使用 PLL 進(jìn)行分頻,比如 FPGA 或者 ASIC 設(shè)計(jì)中,都可以直接使用 PLL 進(jìn)行分頻,但是這種分頻倍數(shù)有時(shí)候受限于 PLL 本身的特性,比如輸入 100Mhz 時(shí)鐘,很多 PLL 都實(shí)現(xiàn)不了分頻到 1Mhz 的時(shí)鐘,這個(gè)就是 PLL 本身特性限制的。還有一種實(shí)現(xiàn)方法就是直接使用邏輯實(shí)現(xiàn),即使用代碼實(shí)現(xiàn)分頻設(shè)計(jì)。我們本節(jié)介紹的是使用代碼進(jìn)行設(shè)計(jì)分頻器。本節(jié)我們先看下偶數(shù)分頻設(shè)計(jì)。
? ? ? ? 偶數(shù)分頻,顧名思義,是說分頻后的頻率和分頻前的頻率比例是偶數(shù),比如 100Mhz 時(shí)鐘,進(jìn)行二分頻后,就是 50Mhz。
? ? ? ?實(shí)現(xiàn)偶數(shù)分頻可通過一個(gè)簡單計(jì)數(shù)器實(shí)現(xiàn),而如果需要三分頻,五分頻,七分頻等奇數(shù)分頻,一個(gè)計(jì)數(shù)器是不夠的。
? ? ? ?偶數(shù)分頻實(shí)現(xiàn)比較簡單,假設(shè)為 N(偶數(shù))分頻,只需計(jì)數(shù)到 N/2-1,然后時(shí)鐘翻轉(zhuǎn)、計(jì)數(shù)器清零,如此循環(huán)就可以得到 N(偶)分頻。舉個(gè)例子,比如晶振時(shí)鐘是 100Mhz 時(shí)鐘,想得到一個(gè) 25Mhz 的時(shí)鐘, 那么這個(gè)是一個(gè) 100/25=4 的四分頻設(shè)計(jì),那么按照我們剛說的計(jì)數(shù)到 4/2-1=1,然后時(shí)鐘翻轉(zhuǎn)、計(jì)數(shù)器清零,就可以得到一個(gè) 24Mhz 的時(shí)鐘。
2、實(shí)驗(yàn)任務(wù)
使用 Verilog 語言設(shè)計(jì)一個(gè)任意偶數(shù)分頻電路,默認(rèn)進(jìn)行 8 分頻。
3、程序設(shè)計(jì)
? ? ? ? 偶數(shù)分頻器:2分頻設(shè)計(jì),只需要使用基準(zhǔn)時(shí)鐘在第1個(gè)時(shí)鐘周期輸出高電平(或低電平),在第2個(gè)時(shí)鐘周期輸出相反電平,如此反復(fù)即可。
? ? ? ?同理,4分頻設(shè)計(jì):使用基準(zhǔn)時(shí)鐘在第1、2個(gè)時(shí)鐘周期輸出高電平(或低電平),在第3、4個(gè)時(shí)鐘周期輸出相反電平,如此反復(fù)即可。
? ? ? ?同理,8分頻設(shè)計(jì):使用基準(zhǔn)時(shí)鐘在第1、2、3、4個(gè)時(shí)鐘周期輸出高電平(或低電平),在第5、6、7、8個(gè)時(shí)鐘周期輸出相反電平,如此反復(fù)即可。
? ? ? ? 由此可以推導(dǎo)出偶數(shù)分頻設(shè)計(jì)的一般方法:假設(shè)為N分頻,只需設(shè)計(jì)一個(gè)計(jì)數(shù)器從0計(jì)數(shù)到 N/2-1(一共N/2個(gè)基準(zhǔn)時(shí)鐘),然后將輸出分頻時(shí)鐘翻轉(zhuǎn)、計(jì)數(shù)器清零,如此循環(huán)就可以得到 N分頻。
? ? ? ?根據(jù)簡介介紹的分頻電路設(shè)計(jì)思路,假設(shè)為 N(偶數(shù))分頻,只需計(jì)數(shù)到 N/2-1,然后時(shí)鐘翻轉(zhuǎn)、計(jì)數(shù)清零,如此循環(huán)就可以得到 N(偶)分頻,可以通過改變參量 N 的值和計(jì)數(shù)變量 cnt 的位寬實(shí)現(xiàn)任意偶分頻,由于默認(rèn)為 8 分頻,因此 N 初始值為 8。由此可以寫出如下代碼。
方法1:
3.1、8分頻電路代碼如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/05/13 14:45:37
// Design Name:
// Module Name: divider_8
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
//
//偶數(shù)分頻器:2分頻設(shè)計(jì),只需要使用基準(zhǔn)時(shí)鐘在第1個(gè)時(shí)鐘周期輸出高電平(或低電平),
//在第2個(gè)時(shí)鐘周期輸出相反電平,如此反復(fù)即可。
//同理,4分頻設(shè)計(jì):使用基準(zhǔn)時(shí)鐘在第1、2個(gè)時(shí)鐘周期輸出高電平(或低電平),
//在第3、4個(gè)時(shí)鐘周期輸出相反電平,如此反復(fù)即可。
//同理,8分頻設(shè)計(jì):使用基準(zhǔn)時(shí)鐘在第1、2、3、4個(gè)時(shí)鐘周期輸出高電平(或低電平),
//在第5、6、7、8個(gè)時(shí)鐘周期輸出相反電平,如此反復(fù)即可。
//由此可以推導(dǎo)出偶數(shù)分頻設(shè)計(jì)的一般方法:假設(shè)為N分頻,只需設(shè)計(jì)一個(gè)計(jì)數(shù)器從0計(jì)數(shù)到 N/2-1(一共N/2個(gè)基準(zhǔn)時(shí)鐘),
//然后將輸出分頻時(shí)鐘翻轉(zhuǎn)、計(jì)數(shù)器清零,如此循環(huán)就可以得到 N分頻。
//8分頻電路設(shè)計(jì)
module divider_8(
// input sys_clk, //50MHz系統(tǒng)時(shí)鐘(一個(gè)周期是20ns:1/50MHz=0.02us=20ns)
//differential system clocks //200MHz系統(tǒng)時(shí)鐘(一個(gè)周期是5ns:1/200MHz=0.005us=5ns)
input sys_clk_p, //system clock positive
input sys_clk_n, //system clock negative
input sys_rst_n, //復(fù)位信號,低電平有效
output reg clk_8 //輸出8分頻信號(50MHz/8=6.25MHz,周期160ns)(200MHz/8=25MHz,周期40ns)
);
//parameter define
parameter N = 8;
//reg define //define the time counter
reg [1:0] cnt;
wire sys_clk;
//差分輸入時(shí)鐘緩沖器(黑金FPGA)
IBUFDS sys_clk_ibufgds //generate single end clock
(
.O (sys_clk ),
.I (sys_clk_p ),
.IB (sys_clk_n )
);
//計(jì)數(shù)模塊
//從0計(jì)數(shù)到3,共計(jì)4個(gè)時(shí)鐘周期
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 2'd0; //復(fù)位清零
else if(cnt==2'd3) //從0開始計(jì)數(shù),所以要-1
cnt <= 2'd0; //計(jì)數(shù)滿,則清零。
else
cnt <= cnt + 2'd1; //沒計(jì)滿,就一直計(jì)數(shù)
end
//8分頻時(shí)鐘輸出模塊
//滿足計(jì)數(shù)條件則對8分頻時(shí)鐘進(jìn)行反轉(zhuǎn)
//8分頻時(shí)鐘每隔4個(gè)周期反轉(zhuǎn)一次,所以8分頻的周期,即為8個(gè)時(shí)鐘周期
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
clk_8 <= 1'b0; //復(fù)位清零
else if(cnt==2'd3) //計(jì)滿4個(gè)時(shí)鐘周期
clk_8 <= ~clk_8; //計(jì)滿,則輸出反轉(zhuǎn)
else
clk_8 <= clk_8; //沒計(jì)滿,就保持原狀態(tài)
end
endmodule
接下來我們使用 Vivado?的?RTL? ANALYSIS,來看一下我們編寫代碼的?RTL?視圖。
? ? ? ??從上圖可以看出,cnt 是一個(gè) 2bit 的計(jì)數(shù)器,在計(jì)數(shù)器計(jì)到 3 的時(shí)候,clk_8 進(jìn)行取反操作,即得到一個(gè)八分頻時(shí)鐘。
3.2、仿真驗(yàn)證
3.2.1、編寫 TB 文件
? ? ? 只需要對時(shí)鐘以及復(fù)位信號進(jìn)行激勵(lì),代碼編寫如下:
`timescale 1ns / 1ps //時(shí)間刻度:單位1ns,精度1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/05/13 15:04:35
// Design Name:
// Module Name: tb_divider_8
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tb_divider_8(); //仿真測試模塊
//parameter T = 20; //50MHz時(shí)鐘周期為20ns
parameter T = 5; //200MHz時(shí)鐘周期為5ns
//input define
//reg sys_clk; //時(shí)鐘信號
reg sys_clk_p; //時(shí)鐘信號
wire sys_clk_n;
reg sys_rst_n;
//output define
wire clk_8;
//設(shè)置初始化條件
initial begin
// sys_clk = 1'b0; //初始時(shí)鐘為0
sys_clk_p = 1'b0; //初始時(shí)鐘為0
sys_rst_n <= 1'b0; //初始復(fù)位為0
#10 //10個(gè)時(shí)間單位后
sys_rst_n <= 1'b1; //拉高復(fù)位
end
//always代表重復(fù)進(jìn)行,#10代表每10個(gè)時(shí)間單位
//每10個(gè)時(shí)間單位反轉(zhuǎn)時(shí)鐘,即時(shí)鐘周期為20個(gè)時(shí)間單位(20ns)
//always #10 sys_clk = ~sys_clk; //每半個(gè)周期后,電平取反一次。
always #(T/2) sys_clk_p <= ~sys_clk_p; //每半個(gè)周期后,電平取反一次。
assign sys_clk_n=~sys_clk_p;
//例化被測試模塊
divider_8 u_divider_8(
// .sys_clk (sys_clk),
.sys_clk_p (sys_clk_p),
.sys_clk_n (sys_clk_n),
.sys_rst_n (sys_rst_n),
.clk_8 (clk_8)
);
endmodule
3.2.2、仿真驗(yàn)證
? ? ? ? 測試程序在 Xilinx 的 Vivado 軟件 或者其他仿真工具運(yùn)行后的波形如下顯示,可以看出,N 初始為 8,當(dāng)復(fù)位撤銷(復(fù)位信號低有效)之后,cnt 即開始計(jì)數(shù),在計(jì)數(shù)器計(jì)到 3 的時(shí)候,clk_8 進(jìn)行取反操作,即得到一個(gè)八分頻時(shí)鐘。
方法2:
4、計(jì)數(shù)器進(jìn)行分頻
? ? ? ?此處再給大家介紹一個(gè)分頻設(shè)計(jì)方法,就是直接使用計(jì)數(shù)器即可進(jìn)行分頻。 直接使用計(jì)數(shù)器分配的代碼如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/06/20 11:12:13
// Design Name:
// Module Name: divider_8CNT
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
//8分頻電路
//直接使用計(jì)數(shù)器即可進(jìn)行分頻。
module divider_8CNT(
input clk , // system clock 50Mhz on board
input rst_n, // system rst, low active
output reg [2:0] y // output signal
);
//===========================================================================
// ------------------------- MAIN CODE --------------------------------------
//===========================================================================
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0)
y <= 3'b0 ;
else
y <= y + 1'b1 ;
end
endmodule
4.1、仿真測試
? ? ? ?testbech 測試電路,這個(gè) testbech 激勵(lì)只需要提供時(shí)鐘和復(fù)位就好了,通過仿真來看下計(jì)數(shù)器的波形。
測試代碼如下
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/06/20 11:22:19
// Design Name:
// Module Name: tb_divider_8CNT
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
//testbech 測試電路,這個(gè) testbech 激勵(lì)只需要提供時(shí)鐘和復(fù)位就好了,
//通過仿真來看下計(jì)數(shù)器的波形。
//測試代碼如下
module tb_divider_8CNT();
reg sys_clk;
reg sys_rst_n;
wire [2:0] y;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#200 //等待200ns
sys_rst_n = 1'b1;
end
always #10 sys_clk = ~sys_clk;
divider_8CNT u_divider_8CNT(
.clk (sys_clk ),
.rst_n (sys_rst_n ),
.y (y )
);
endmodule
? ? ? ?可以看出,當(dāng)復(fù)位撤銷(復(fù)位信號低有效)之后,計(jì)數(shù)器 y 就從 0 開始一直累加,每次加 1,直到加到 7 之后,進(jìn)位溢出為 0,然后再次從 0 開始一直累加,如此反復(fù)循環(huán)。
? ? ? ? 從波形中,我們能看到一個(gè)分頻的效果,計(jì)數(shù)器最低 bit 的 y[0]是每 2 個(gè)周期在循環(huán)跳變,而計(jì)數(shù)器次低 bit 的 y[1]?是每 4 個(gè)周期在循環(huán)跳變,計(jì)數(shù)器最高 bit 的 y[2]?是每 8 個(gè)周期在循環(huán)跳變,這個(gè)也是常有的分頻方法,比如直接把計(jì)數(shù)器的各個(gè) bit 賦值給一個(gè)時(shí)鐘信號,那么計(jì)數(shù)器的 y[0]?實(shí)現(xiàn)的是 2 分頻,計(jì)數(shù)器的 y[1]?實(shí)現(xiàn)的是 4 分頻,計(jì)數(shù)器的 y[2]?實(shí)現(xiàn)的是 8 分頻。這個(gè)也是最簡單和最常用的偶數(shù)分頻方法。 文章來源:http://www.zghlxwxcb.cn/news/detail-493051.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-493051.html
到了這里,關(guān)于偶數(shù)分頻器電路設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!