赞
踩
当不要求分频50%占空比时,对输入时钟clk上升沿计数,可以设置两个计数的翻转点,一个是(N-1)/2,一个是(N-1),计数到(N-1)时同时将计数器清零。
module clk_div( input clk,rst_n, output reg clk_o ); reg [1:0] cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt<=0; else if(cnt==2) cnt<=0; else cnt <= cnt +1'b1; end always@(posedge clk or negedge rst_n) begin if(!rst_n) clk_o <= 0; else if(cnt==1) clk_o <= 1; else if(cnt==2) clk_o <=0; end endmodule
注意:
一开始陷入了误区,试图另外用一个边沿检测模块对时钟的边沿进行检测,忘了posedge clk直接就能检测然后计数。。。
当要求占空比为50%时,对输入时钟clk的上升沿和下降沿以同样的规律分别计数,根据两个计数器得到两个错位输出的时钟,将两个时钟做“或”运算,可以达到50%占空比。
/******************************************** 计数器实现 7 分频 *********************************************/ module Odd_Divider( input clk, input rst_n, output clk_divider ); reg [2:0] count_p; //上升沿计数 reg [2:0] count_n; //下降沿计数 reg clk_p; //上升沿分频 reg clk_n; //下降沿分频 //上升沿计数 always @ ( posedge clk or negedge rst_n ) begin if(!rst_n ) count_p<= 3'b0; else if( count_p == 3'd6 ) count_p<= 3'b0; else count_p<= count_p + 1'b1; end //上升沿分频 always @ ( posedge clk or negedge rst_n ) begin if(!rst_n ) clk_p<= 1'b0; else if(count_p == 3'd3 || count_p == 3'd6 ) clk_p<= ~clk_p; end //下降沿计数 always @ ( negedge clk or negedge rst_n ) begin if(!rst_n ) count_n<= 3'b0; else if( count_n == 3'd6 ) count_n<= 3'b0; else count_n<= count_n + 1'b1; end //下降沿分频 always @ ( negedge clk or negedge rst_n ) begin if(!rst_n ) clk_n<= 1'b0; else if(count_n == 3'd3 || count_n == 3'd6 ) clk_n<= ~clk_n; end assign clk_divider = clk_p | clk_n; endmodule
小数分频 未完
https://mp.weixin.qq.com/s/X7r8WrQ3e9yECF4ocD3baA
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。