我是靠谱客的博主 甜蜜苗条,最近开发中收集的这篇文章主要介绍分频电路的verilog实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

偶数2分频

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

2分频波形
代码如下:

module div2_clk
(
input       clk,
input       rst,

output      clk_div
    );

reg                          clk_div_r;
assign                       clk_div     =   clk_div_r;

always@(posedge clk)
begin
    if(rst)
        begin
            clk_div_r   <=  1'b0;
        end
    else
        begin
            clk_div_r   <=  ~clk_div_r   ;
        end
end

endmodule

二分频电路如下:
二分频电路

偶数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)
begin
    if(rst)
        begin
            clk_div_r   <=  1'b0;
            cnt         <=  0;
        end
    else if(cnt ==  div_even - 1)
        begin   
            clk_div_r   <=  ~clk_div_r;
            cnt         <=  0;
        end
    else
        begin
            cnt         <=  cnt + 1;
        end
end

endmodule

测试代码如下:

module tset_clk_div#(parameter div_coe = 6)( );

reg     clk;
reg     rst;
wire    clk_div;

initial
begin
    clk = 0;
    rst = 0;
    #50
    rst = 1;
    #25
    rst = 0;
end
always #5 clk = ~clk;

 even_div
 #div_coe
 U0
(
.clk(clk),
.rst(rst),

.clk_div(clk_div)
   );   

endmodule

6分频仿真波形为:
6分频仿真波形
N分频电路如下:
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%的三分频时钟。
3分频波形

总结产生时钟占空比为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)
begin
    if(rst)
        begin
            cnt         <=  0;
        end
    else if(cnt ==  div_coe - 1)
        begin
            cnt         <=  0;
        end
    else
        begin
            cnt         <=  cnt + 1;
        end  
end

always@(posedge clk_n)
begin
    if(rst)
        begin
            cnt1         <=  0;
        end
    else if(cnt1 ==  div_coe - 1)
        begin
            cnt1         <=  0;
        end
    else
        begin
            cnt1         <=  cnt1 + 1;
        end  
end

always@(posedge clk)
begin
    if(rst)
        begin
            clk_div_r   <=  1'b0;
        end
    else if(cnt ==  div_odd)
        begin
            clk_div_r   <=  ~clk_div_r;
        end
    else if(cnt == div_coe - 1)
        begin
            clk_div_r   <=  ~clk_div_r;
        end
end

always@(posedge clk_n)
begin
    if(rst)
        begin
            clk_div_r1   <=  1'b0;
        end
    else if(cnt1 ==  div_odd)
        begin
            clk_div_r1   <=  ~clk_div_r1;
        end
        else if(cnt1 == div_coe - 1)
            begin
                clk_div_r1   <=  ~clk_div_r1;
            end
end

endmodule

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

最后

以上就是甜蜜苗条为你收集整理的分频电路的verilog实现的全部内容,希望文章能够帮你解决分频电路的verilog实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部