当前位置:   article > 正文

奇数分频电路—5分频(verilog实现)_五分频电路verilog

五分频电路verilog

前言

前文我们讲到,可以通过计数器的方法实现偶数分频,实现方式可以参考4分频电路实现
那么对于奇数分频电路应该如何实现呢?是否也可以通过计数器实现呢?答案是肯定的。这里我们仍然采用计数器的方法实现奇数分频。

占空比不为50%的奇数分频

对于占空比不为50%的电路来说比较简单,这里我们以5分频电路为例。用计数器计数到1时翻转时钟信号,在计数到4时再翻转时钟。这样即可实现5分频电路,且占空比为60%,这里给出实现代码如下:

`timescale 1ns/1ns

module tb();
  reg clk, rst;
  wire clk_out;
  nequal_div_5 dut(.clk(clk),
                   .rst(rst), 
                   .clk_out(clk_out)
                  );
  initial begin 
    clk <= 0;
    forever begin
      #5 clk <= !clk;
    end
  end
  initial begin
    rst <= 0;
    repeat(2) @(posedge clk);
    rst <= 1;
  end
  initial begin 
    #500 $finish;
  end
  endmodule


//no equal divided_5  and the duty cycle is 60%

module nequal_div_5(input clk, input rst, output clk_out);
  reg clk_out;
  reg [3:0] cnt;

  always @(posedge clk or negedge rst) begin //count generate
    if (!rst) begin
      cnt <= 0;
    end 
    else if (cnt == 3'b100)
    begin
      cnt <= 0;
    end
    else 
      cnt <= cnt + 1'b1;
  end

  always @(posedge clk or negedge rst) begin  //clk divided
    if (!rst) begin
      clk_out <= 0;
    end
    else if (cnt == 1'b1) begin
      clk_out <= ~clk_out;
    end
    else if (cnt == 3'b100) begin
      clk_out <= ~clk_out;
    end
    else 
      clk_out <= clk_out;
    end
    endmodule


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

仿真结果如下图:
在这里插入图片描述

占空比为50%的5分频电路

对于占空比没有要求的奇数分频实现方式当然简单,那么如何实现%50占空比的要求呢?这里我们在代码中声明了两个新的输出时钟寄存器,分别是clk_p和clk_n,clk_p在计数到2时翻转信号,而clk_n则是在时钟下降沿采样clk_p的值,然后将两者求或,即可得到满足我们要求的输出时钟clk_out
代码如下:

`timescale 1ns/1ns
module tb();
reg clk,rst;
wire clk_out;

equal_div_5 dut(.clk(clk),
                .rst(rst), 
                .clk_out(clk_out)
               );

 //clk generate              
 initial begin
  clk <= 0;
  forever begin
   #5 clk <= !clk;
  end
end
 //rst signal
 initial begin
   #10 rst <= 0;
   repeat(2) @(posedge clk);
   rst <= 1;
 end
 //finish signal
 initial begin
  #500 $finish;
end
endmodule

module equal_div_5(input clk, input rst, output clk_out);
  reg [2:0]cnt;
  reg clk_p;
  reg clk_n;
  wire clk_out;

  always @(posedge clk or negedge rst)//count module
  begin
    if (!rst) begin;
    cnt <= 0;
  end
  else if (cnt == 3'b100) begin
    cnt  <= 0;
  end
  else begin
    cnt <= cnt +1'b1;
  end
end

  always @(posedge clk or negedge rst)//clk divided
  begin
    if (!rst) begin
      clk_p <= 0;
    end
    else if (cnt == 3'b010) begin
      clk_p <= ~clk_p;
    end 
    else if (cnt == 3'b100) begin
      clk_p <= ~clk_p;
    end
    else 
      clk_p <= clk_p;
  end
  always @(negedge clk) begin
    clk_n <= clk_p;
  end
  assign clk_out = clk_n | clk_p;
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

仿真结果可以看到电路的占空比为50%
在这里插入图片描述

扩展

同理,我们可以实现任意大小的奇数分频,且占空比为50%。即对于n分频电路,首先在(n-1)/2处进行信号翻转并把值赋给一个寄存器,然后在再其时钟下降沿检测这个寄存器的值,并赋值给另外一个寄存器,然后二者求或,结果就是最终的分频时钟的值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/519087?site
推荐阅读
相关标签
  

闽ICP备14008679号