赞
踩
module test#(parameter N=3)( input clk, input rst_n, output clk_div ); reg [N-1:0] div_reg ;//分频计数器 always @(posedge clk or negedge rst_n) if (rst_n == 1'b0 ) div_reg <= 0 ; else if(div_reg == 3'd4)//从0计数到4,然后返回到0,5分频 div_reg <= 0; else div_reg <= div_reg + 1'b1 ; assign clk_div = div_reg[N-1] ; endmodule
每一个分频后的时钟周期=5倍原来的时钟周期,因此是5分频。修改部分代码便可得出3分频。
假设时钟分频是N,则设置一个计数器,计数长度是N(即从0计数到N-1),然后在计数器为计数到(N-1)/2的时候,翻转一下分频时钟信号;在计数器计数到为N-1的时候,再翻转一下时钟。
module test#(parameter N=3)(//N分频,这里是3分频 input clk, input rst_n, output clk_div ); reg [N-1:0] div_cnt ;//分频计数器 reg div_reg ; always @(posedge clk or negedge rst_n)begin if (rst_n == 1'b0 )begin div_cnt <= 0 ; div_reg <= 1 ; end else if (div_cnt == (N-1)/2)begin//计数到(N-1)/2,进行翻转和继续计数 div_reg <= ~div_reg; div_cnt <= div_cnt + 1'b1 ; end else if ( div_cnt == (N-1) )begin//计数到N-1,进行清零和翻转 div_cnt <= 0 ; div_reg <= ~div_reg; end else div_cnt <= div_cnt + 1'b1 ; end assign clk_div = (N == 1)?clk:div_reg ;//注意这里, 在N= 1的情况,也就是不分频的情况 endmodule
3分频,N = 3:
5分频,N= 5 :
产生具有50%占空比的奇数分频时钟的算法如下所示,假设N分频(N是计数):
module test#(parameter N=5)(//N分频 input clk, input rst_n, output clk_div ); reg sig_r ;//定义一个上升沿翻转的信号 reg sig_f ;//定义一个下降沿翻转的信号 reg [N-1:0] cnt_r;//上升沿计数器 reg [N-1:0] cnt_f;//下降沿计数器 wire clk_f ; assign clk_f = ~clk ;//用来触发下降沿计数器的时钟 //由于同时使用上升沿和下降沿触发器不好,因此我们为同一边沿,都使用上升沿触发 //只不过是将时钟进行反向 always @(posedge clk or negedge rst_n)begin//上升沿计数 if(rst_n == 1'b0)begin sig_r <= 0 ; cnt_r <= 0 ; end else if( cnt_r == (N-1)/2 )begin sig_r <= ~sig_r ; cnt_r <= cnt_r + 1 ; end else if ( cnt_r == (N-1) )begin sig_r <= ~sig_r ; cnt_r <= 0 ; end else cnt_r <= cnt_r + 1 ; end always @(posedge clk_f or negedge rst_n)begin//下降沿计数 if(rst_n == 1'b0)begin sig_f <= 0 ; cnt_f <= 0 ; end else if( cnt_f == (N-1)/2 )begin sig_f <= ~sig_f ; cnt_f <= cnt_f + 1 ; end else if ( cnt_f == (N-1) )begin sig_f <= ~sig_f ; cnt_f <= 0 ; end else cnt_f <= cnt_f + 1 ; end assign clk_div = sig_f || sig_r ; endmodule
3分频:
5分频:
module test#(parameter N=5)(//N分频 input clk, input rst_n, output clk_div ); //奇数分频 reg sig_r ;//定义一个上升沿翻转的信号 reg sig_f ;//定义一个下降沿翻转的信号 reg [N-1:0] cnt_r;//上升沿计数器 reg [N-1:0] cnt_f;//下降沿计数器 wire clk_f ; assign clk_f = ~clk ;//用来触发下降沿计数器的时钟 //由于同时使用上升沿和下降沿触发器不好,因此我们为同一边沿,都使用上升沿触发 //只不过是将时钟进行反向 always @(posedge clk or negedge rst_n)begin//上升沿计数 if(rst_n == 1'b0)begin sig_r <= 0 ; cnt_r <= 0 ; end else begin cnt_r <= cnt_r + 1 ; if( cnt_r == (N-1)/2 )begin sig_r <= ~sig_r ; end else if ( cnt_r == (N-1) )begin sig_r <= ~sig_r ; cnt_r <= 0 ; end end end always @(posedge clk_f or negedge rst_n)begin//下降沿计数 if(rst_n == 1'b0)begin sig_f <= 0 ; cnt_f <= 0 ; end else begin cnt_f <= cnt_f + 1 ; if( cnt_f == (N-1)/2 )begin sig_f <= ~sig_f ; end else if ( cnt_f == (N-1) )begin sig_f <= ~sig_f ; cnt_f <= 0 ; end end end //偶数分频 reg div_reg ; reg [N-1:0] div_cnt ;//分频计数器 always @(posedge clk or negedge rst_n)begin if (rst_n == 1'b0 )begin div_cnt <= 0 ; div_reg <= 0 ; end else begin div_cnt <= div_cnt + 1'b1 ; if(div_cnt == (N/2 - 1))begin div_cnt <= 0; div_reg <= ~div_reg ; end end end assign clk_div = (N == 1)?clk: ( N%2 == 1)?(sig_f || sig_r ): div_reg;//这里用来输出分频值。对2的取余操作是综合的 endmodule
5分频:
6分频:
引:https://blog.csdn.net/weixin_34126557/article/details/86246646?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。