任意整数分频(图文并茂)
上一篇文章講解了如何進(jìn)行任意的奇分頻和任意的偶分頻,這篇文章主要講解占空比為50%的任意整數(shù)分頻(奇分頻和偶分頻),下面首先以6分頻和5分頻來(lái)回顧一下奇偶分頻。
偶分頻
偶分頻時(shí)最簡(jiǎn)單的,通過(guò)下圖就可以很好的理解,其中只需要兩個(gè)always塊,其中一個(gè)用來(lái)計(jì)數(shù),計(jì)數(shù)器每次計(jì)數(shù)到5,然后清零重新計(jì)數(shù),第二個(gè)always塊用來(lái)產(chǎn)生分頻時(shí)鐘,假設(shè)初始狀態(tài)為高電平,當(dāng)計(jì)數(shù)到2時(shí),將信號(hào)拉低,當(dāng)計(jì)數(shù)到5時(shí),將信號(hào)拉高。
那么對(duì)于任意的偶分頻,如何確定cnt的最大值,如何確定div_clk信號(hào)什么時(shí)候拉低,什么時(shí)候拉高呢,通過(guò)6分頻的分析,我們看到,當(dāng)cnt計(jì)數(shù)到6-1時(shí),給cnt信號(hào)清零,并且當(dāng)cnt=6-1時(shí)將div_clk拉高,當(dāng)計(jì)數(shù)到(6-1)/2時(shí),將div_clk拉低。因此,假設(shè)現(xiàn)在要進(jìn)行n分頻,n為偶數(shù),則cnt 的最大值為n-1,當(dāng)cnt計(jì)數(shù)到n-1時(shí),將div_clk拉高,當(dāng)cnt計(jì)數(shù)到(n-1)/2時(shí),將div_clk拉低。
代碼如下:
// ----------------------------------------------------------------------------- // Copyright (c) 2014-2021 All rights reserved // ----------------------------------------------------------------------------- // Author : dongtaolv // Email : tdlv@stu.xidian.edu.cn // File : even_divider.v // Create : 2021-04-26 19:59:35 // Revise : 2021-04-26 19:59:35 // Editor : sublime text3, tab size (4) // ----------------------------------------------------------------------------- module even_divider #(parameter DIVIDER_NUMBER = 6 )(input wire clk,input wire rst,output wire div_clk );reg [3:0] cnt; //當(dāng)分頻數(shù)大于15時(shí),此值的位數(shù)需要擴(kuò)展 reg div_clk_r;assign div_clk = div_clk_r;always @(posedge clk)beginif(rst)begincnt <= 'd0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begincnt <= 'd0;endelse begincnt <= cnt + 1'b1;end endalways @(posedge clk)beginif(rst)begindiv_clk_r <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))begindiv_clk_r <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begindiv_clk_r <= 1'b1;end endendmodule6分頻仿真如下:
奇分頻
奇分頻相對(duì)于偶分頻來(lái)說(shuō)比較復(fù)雜,我們首先給出5分頻的圖。
其中div_clk信號(hào)就是我們的5分頻產(chǎn)生的時(shí)鐘,我們可以看到,這需要在系統(tǒng)時(shí)鐘clk的上升沿和下降沿都工作,所以,我們使用三個(gè)always塊,其中一個(gè)always塊和偶分頻一樣,用來(lái)產(chǎn)生計(jì)數(shù)器cnt,這個(gè)計(jì)數(shù)器在clk的上升沿計(jì)數(shù),每次技術(shù)到4時(shí)清零,第二個(gè)always塊用來(lái)產(chǎn)生clk,初始為高電平,該信號(hào)在clk的上升沿產(chǎn)生,當(dāng)cnt計(jì)數(shù)到2時(shí),將clk1信號(hào)拉低,當(dāng)計(jì)數(shù)到4時(shí),將clk1信號(hào)拉高,這個(gè)信號(hào)和偶分頻產(chǎn)生類(lèi)似,第三個(gè)always塊就有區(qū)別了,他是通過(guò)clk的下降沿來(lái)產(chǎn)生的,也就是圖中的clk2信號(hào),初始狀態(tài)為高電平,當(dāng)cnt 計(jì)數(shù)到2并且clk的下降沿到來(lái)時(shí),我們將clk2信號(hào)拉低,當(dāng)cnt計(jì)數(shù)到4并且clk的下降沿到來(lái)時(shí),我們將clk2信號(hào)拉高,最后得到的分頻時(shí)鐘div_clk可以通過(guò)組合邏輯得到,我們直接將clk1和clk2求與運(yùn)算就可以得到div_clk信號(hào)。
代碼如下:
// ----------------------------------------------------------------------------- // Copyright (c) 2014-2021 All rights reserved // ----------------------------------------------------------------------------- // Author : dongtaolv // Email : tdlv@stu.xidian.edu.cn // File : odd_divider.v // Create : 2021-04-26 19:59:35 // Revise : 2021-04-26 19:59:35 // Editor : sublime text3, tab size (4) // ----------------------------------------------------------------------------- module odd_divider #(parameter DIVIDER_NUMBER = 5 )(input wire clk,input wire rst,output wire div_clk );reg [3:0] cnt; //當(dāng)分頻數(shù)大于15時(shí),此值的位數(shù)需要擴(kuò)展reg clk1; reg clk2;always @(posedge clk)beginif(rst)begincnt <= 'd0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begincnt <= 'd0;endelse begincnt <= cnt + 1'b1;end endalways @(posedge clk)beginif(rst)beginclk1 <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))beginclk1 <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)beginclk1 <= 1'b1;end endalways @(negedge clk)beginif(rst)beginclk2 <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))beginclk2 <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)beginclk2 <= 1'b1;end endassign div_clk = clk1 && clk2;endmodule5分頻仿真如下:
任意分頻
在知道如何任意奇分頻和任意偶分頻之后,只需要將兩個(gè)結(jié)合就可以得到任意整數(shù)分頻,具體代碼如下:
// ----------------------------------------------------------------------------- // Copyright (c) 2014-2021 All rights reserved // ----------------------------------------------------------------------------- // Author : dongtaolv // Email : tdlv@stu.xidian.edu.cn // File : random_divider.v // Create : 2021-04-26 19:59:35 // Revise : 2021-04-26 19:59:35 // Editor : sublime text3, tab size (4) // ----------------------------------------------------------------------------- module random_divider #(parameter DIVIDER_NUMBER = 5 )(input wire clk,input wire rst,output wire div_clk );reg [3:0] cnt; //當(dāng)分頻數(shù)大于15時(shí),此值的位數(shù)需要擴(kuò)展 reg div_clk_r; reg clk2;always @(posedge clk)beginif(rst)begincnt <= 'd0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begincnt <= 'd0;endelse begincnt <= cnt + 1'b1;end endalways @(posedge clk)beginif(rst)begindiv_clk_r <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))begindiv_clk_r <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begindiv_clk_r <= 1'b1;end endalways @(negedge clk)beginif(rst)beginclk2 <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1) && DIVIDER_NUMBER % 2 == 1'b1)beginclk2 <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1 && DIVIDER_NUMBER % 2 == 1'b1)beginclk2 <= 1'b1;end endassign div_clk = ( DIVIDER_NUMBER % 2) ? div_clk_r && clk2 : div_clk_r;endmoduletb文件如下:
// ----------------------------------------------------------------------------- // Copyright (c) 2014-2021 All rights reserved // ----------------------------------------------------------------------------- // Author : dongtaolv // Email : tdlv@stu.xidian.edu.cn // File : tb_random_divider.v // Create : 2021-04-26 20:39:48 // Revise : 2021-04-26 20:39:48 // Editor : sublime text3, tab size (4) // -----------------------------------------------------------------------------`timescale 1ns/1psmodule tb_random_divider;reg clk; reg rst; wire div_clk;initial beginclk = 0;rst = 1;#100rst = 0; endalways #10 clk = ~clk;random_divider #(.DIVIDER_NUMBER(7) //通過(guò)設(shè)置此值來(lái)確定幾分頻 ) random_divider_inst(.clk (clk ),.rst (rst ),.div_clk (div_clk) );endmodule總結(jié)
以上是生活随笔為你收集整理的任意整数分频(图文并茂)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iOS开发-Get请求,Post请求,同
- 下一篇: css z-index