欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

分频电路的verilog实现

发布时间:2023/12/20 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 分频电路的verilog实现 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

偶数2分频

由偶数二分频波形可知,每次在时钟的上升沿,输出寄存器的状态进行翻转,就能得到二分频后的时钟。


代码如下:

module div2_clk ( input clk, input rst,output clk_div);reg clk_div_r; assign clk_div = clk_div_r;always@(posedge clk) beginif(rst)beginclk_div_r <= 1'b0;endelsebeginclk_div_r <= ~clk_div_r ;end endendmodule

二分频电路如下:

偶数N分频

方法:用模为N/2的计数器实现占空比为50%的偶数N分频时钟信号,计数器为N/2 - 1时,输出时钟寄存器状态翻转。

代码如下(div_coe代表分频数):

module even_div #(parameter div_coe = 2) ( input clk, input rst,output clk_div);localparam div_even = div_coe>>1; reg clk_div_r; reg [div_even-1:0] cnt; assign clk_div = clk_div_r;always@(posedge clk) beginif(rst)beginclk_div_r <= 1'b0;cnt <= 0;endelse if(cnt == div_even - 1)begin clk_div_r <= ~clk_div_r;cnt <= 0;endelsebegincnt <= cnt + 1;end endendmodule

测试代码如下:

module tset_clk_div#(parameter div_coe = 6)( );reg clk; reg rst; wire clk_div;initial beginclk = 0;rst = 0;#50rst = 1;#25rst = 0; end always #5 clk = ~clk;even_div#div_coeU0 ( .clk(clk), .rst(rst),.clk_div(clk_div)); endmodule

6分频仿真波形为:

N分频电路如下:

奇数N分频,要求分频后时钟占空比为50%

以3分频为例,在时钟clk的作用下,先产生占空比为1/3的时钟clk_div_r;然后时钟clk取反,得到时钟clk_n,在clk_n的作用下,产生占空比为1/3的时钟clk_div_r1;clk_div_r与clk_div_r1只差半个时钟周期,二者相或运算得到占空比为50%的三分频时钟。

总结产生时钟占空比为50%的奇数N分频时钟方法:
1、在时钟clk的作用下,计数器cnt在(N-1)/2以及N-1状态时,时钟寄存器clk_div_r进行状态翻转,得到占空比为[(N-1)/2]/N的分频时钟;
2、在取反后的时钟clk_n的作用下,计数器cnt1在(N-1)/2以及N-1状态时,时钟寄存器clk_div_r1进行状态翻转,得到占空比为[(N-1)/2]/N的分频时钟;
3、clk_div_r与clk_div_r1相或,得到占空比为50%的奇数N分频时钟

代码如下(div_coe代表分频数):

module odd_div #(parameter div_coe = 3) ( input clk, input rst,output clk_div);localparam div_odd = (div_coe - 1)>>1; reg clk_div_r; reg [div_coe-1:0] cnt; reg clk_div_r1; reg [div_coe-1:0] cnt1; wire clk_n; assign clk_n = ~clk; assign clk_div = clk_div_r || clk_div_r1;always@(posedge clk) beginif(rst)begincnt <= 0;endelse if(cnt == div_coe - 1)begincnt <= 0;endelsebegincnt <= cnt + 1;end endalways@(posedge clk_n) beginif(rst)begincnt1 <= 0;endelse if(cnt1 == div_coe - 1)begincnt1 <= 0;endelsebegincnt1 <= cnt1 + 1;end endalways@(posedge clk) beginif(rst)beginclk_div_r <= 1'b0;endelse if(cnt == div_odd)beginclk_div_r <= ~clk_div_r;endelse if(cnt == div_coe - 1)beginclk_div_r <= ~clk_div_r;end endalways@(posedge clk_n) beginif(rst)beginclk_div_r1 <= 1'b0;endelse if(cnt1 == div_odd)beginclk_div_r1 <= ~clk_div_r1;endelse if(cnt1 == div_coe - 1)beginclk_div_r1 <= ~clk_div_r1;end endendmodule

需要注意的是:上述奇偶分频实现的时钟一般只用于应付面试。

总结

以上是生活随笔为你收集整理的分频电路的verilog实现的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。