verilog实现简单奇偶分频

分频在 fpga 设计中一直都担任着很重要的角色,实现偶数分频可通过一个简单计数器实现,而如果需要三分频,五分频,七分频等等奇数类分频,一个计数器是不够的,下面我会介绍可以实现偶数分频和任意奇数分频的方法,偶数分频和奇数分频都是利用计数器来计算,但是奇数分频跟偶数分频不一样的地方是奇数分频利用了两个计数器来实现。

1.偶分频
偶分频比较简单,假设为N(偶数)分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频,可以通过改变参量N的值和计数变量cnt的位宽实现任意偶分频。代码如下:

always @ (posedge clk or negedge rst_n)
  begin
    if(!rst_n)
       begin
          cnt <= 0;
          out_clk <= 0;
       end
    else begin
       if(cnt==N/2-1)
          begin 
             out_clk <= ~out_clk; 
             cnt<=0; 
          end
       else
          cnt <= cnt + 1;
    end
end

verilog实现简单奇偶分频_第1张图片
2.实现占空比为50%的奇(N)分频
实现奇数分频原理是分别用上升沿计数到N/2+1,时钟进行翻转,再计数到N/2输出out_clk1,再用下降沿计数到N/2+1,时钟进行翻转,再计数到N/2输出out_clk2,将out_clk1和out_clk2相或即可。可以通过修改N的值和计数器的位宽来实现其他奇数分频。代码如下:

always @(posedge clk or negedge rst_n)
                                //上升沿输出out_clk1
  begin
    if(!rst_n)
      begin
        out_clk1<=0; 
        cnt_1<=1; //这里计数器从1开始
      end
    else
      begin
        if(out_clk1 == 0) 
          begin
            if(cnt_1 == N/2+1)
            begin
             out_clk1<=~out_clk1;
             cnt_1 <= 1;
            end
            else
              cnt_1 <= cnt_1+1;
          end
        else
          if(cnt_1 == N/2)
            begin
              out_clk1<=~out_clk1;
              cnt_1 <= 1;
            end
          else
            cnt_1 <= cnt_1+1;
      end
  end
always @(negedge clk or negedge rst_n)
                                //下降沿输出out_clk2
  begin
    if(!rst_n)
      begin
        out_clk2 <= 0; 
        cnt_2 <= 1; 
      end
    else
      begin
        if(out_clk2 == 0)
          begin
            if(cnt_2 == N/2+1)
            begin
             out_clk2 <= ~out_clk2;
             cnt_2 <= 1;
            end
            else
              cnt_2 <= cnt_2+1;
          end
        else
          if(cnt_2 == N/2)
            begin
              out_clk2 <= ~out_clk2;
              cnt_2 <= 1;
            end
          else
            cnt_2 <= cnt_2+1;
      end
  end

assign out_clk = out_clk1 | out_clk2;

verilog实现简单奇偶分频_第2张图片
共勉!欢迎指正

你可能感兴趣的:(FPGA)