微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 奇数分频器

奇数分频器

时间:10-02 整理:3721RD 点击:

always@(posedge clk or negedge clk or negedge rst)
if(~rst) //低电平有效
begin
cnt <= 2'b0 ;
clk_q <= 1'b0 ;
end
else if(cnt == 3)
begin
cnt <=2'b0 ;
clk_q <= ~clk_q ;
end
else
begin
cnt <= cnt + 1'b1 ;
clk_q <= clk_q ;
end
这样就可以设计3分频。为什么一般还要采用设计2个分频器的方法来设计奇数倍分频器

因为没有这样的dff吧



   恩恩,多谢,

这是6分频。



  他这是8分频,0-3,四个时钟周期

建议你自己画一下波形,就知道你这是不是3分频了


module freq_divider #( parameter        div_NUM        = 9 )
                (        reset_n,
                        clk_in,
                       
                        clk_o        );
                       
        input                        reset_n;
        input                        clk_in;
       
        output                        clk_o;
  function integer clogb2 ( input integer depth );
        integer        i, result;
        begin
        result = 1;
        for ( i = 0; 2 ** i < depth; i = i + 1 )
                result = i + 1;
        clogb2 = result;
        end
  endfunction
       
        reg        [ clogb2 ( div_NUM ) - 1 : 0 ]        cnt;
        always @( negedge reset_n or posedge clk_in )
        if ( ~ reset_n )
                cnt <= 0;
        else if ( cnt == div_NUM - 1 )
                cnt <= 0;
        else
                cnt <= cnt + 1;
       
        reg                                                                                                                                        clk_buff;               
        always @( negedge reset_n or posedge clk_in )
        if ( ~ reset_n )
                clk_buff <= 0;
        else if ( cnt == div_NUM - 1 )
                clk_buff <= 0;
        else if ( cnt < ( div_NUM - 1 ) / 2 )
                clk_buff <= 0;
        else
                clk_buff <= 1;
               
        generate
                if (( div_NUM % 2 ) == 1 )
                begin
                        reg        tmp;
                       
                        always @( negedge reset_n or negedge clk_in )
                        if ( ~ reset_n )
                                tmp <= 0;
                        else
                                tmp <= clk_buff;
                       
                        assign clk_o = clk_buff | tmp;
                end
                else
                        assign clk_o = clk_buff;
        endgenerate
endmodule



    嗯,你说得对。

always@(posedge clki or negedge rst_n)
begin
    if (!rst_n)
        div_cnt <= 2'b00 ;
    else if (div_cnt==2'b10)
        div_cnt <= 2'b00 ;
    else
        div_cnt <= div_cnt + 1 ;
end
assign clko = div_cnt[1] ;
如果要做50%占空比的三分频,把div_cnt[1]用反沿时钟抓一拍,再或上去。
wire clki_n = ~clki ;
always@(posedge clki_n or negedge rst_n)
begin
    if (!rst_n)
        div_cnt1_n <= 1'b0 ;
    else
         div_cnt1_n <= div_cnt[1] ;
end
assign clko = div_cnt1_n|div_cnt[1] ;



   恩恩,是的,多谢



   好的,多谢



   学习了

谢谢分享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top