Verilog_分频器

版权声明:欢迎读者提问交流。 个人水平有限,表述不当或疏漏之处敬请批评指正。 作者:仼先生 来源:CSDN 著作权归作者所有。非商业转载请注明出处,商业转载请联系作者获得授权。 https://blog.csdn.net/qq_41394155/article/details/83958470

偶分频:对于分频系数为10的分频器,本例的输入时钟系统50M时钟,输出为十分频时钟。设置一个3位的计数器,当计时寄存器到4(10/2-1)时,将输出分频信号取反即可得到10分频的输出。

module(clk,clk_out);
input clk;//输入时钟频率
output clk_out;//输出输出时钟频率
reg clk_out;
reg [2:0] cnt;//计数器,假设分频系数为10

always @(clk);
if(cnt = 3'b1000)begin
    clk_out <= ~clk_out;
    cnt <= 'b0;
end
else begin
    cnt <= cnt + 'b1;
end

奇分频:实现奇数分频原理是分别用上升沿计数到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<=0; 
      end
    else
      begin
        if(out_clk1 == 0) 
          begin
            if(cnt_1 == N/2+1)
            begin
             out_clk1<=~out_clk1;
             cnt_1 <= 0;
            end
            else
              cnt_1 <= cnt_1+1;
          end
        else
          if(cnt_1 == N/2)
            begin
              out_clk1<=~out_clk1;
              cnt_1 <= 0;
            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 <= 0; 
      end
    else
      begin
        if(out_clk2 == 0)
          begin
            if(cnt_2 == N/2+1)
            begin
             out_clk2 <= ~out_clk2;
             cnt_2 <= 0;
            end
            else
              cnt_2 <= cnt_2+1;
          end
        else
          if(cnt_2 == N/2)
            begin
              out_clk2 <= ~out_clk2;
              cnt_2 <= 0;
            end
          else
            cnt_2 <= cnt_2+1;
      end
  end

assign out_clk = out_clk1 | out_clk2;

猜你喜欢

转载自blog.csdn.net/qq_41394155/article/details/83958470