Verilog实现一个简单时钟分频器

Verilog的硬件描述能力的确强,今天又来娱乐一下。

时钟分频是从原始时钟频率里获取新的时钟频率,由于不是专门从事这方面的工作,所以具体是什么鬼自己去Google吧!!!

主要思想是,原始时钟会触发分频器,若分频器处于非“reset 0”状态,则会计数。当计数达到需要分频周期的一半时,翻转信号,以此类推,实现分频。

在此使用下降沿,具体分频器代码如下:

divider.v

module divider
  #(
    parameter RATIO = {{ Frequency Ratio -- const }}
  ) (clk, reset, clk_divide);

  input clk;
  input reset;
  output reg clk_divide;

  reg [32:0]cnt;

  always @ ( negedge clk ) begin
    if (~reset) begin
      cnt <= 0;
      clk_divide <= 0;
    end else begin

      // frequency division
      if (cnt == RATIO / 2 - 1) begin
        clk_divide <= !clk_divide;
        cnt <= 0;
      end else begin
        cnt <= cnt + 1'b1;
      end

    end
  end

endmodule

出于娱乐,加持测试模块divider_tb:

divider_tb.v

`timescale 1ns / 1ns

`include "divider.v"

module divider_tb ();
  // reset segnal
  reg reset = 0;
  initial begin
    #20 reset = 1;
    #20 reset = 0;
    #20 reset = 1;

    #1500 $stop;
  end

  /*
  ***********************************************
  ***********************************************
  make a regular pulsing closk */
  parameter clk_period = 100;
  reg clk = 0;

  initial forever #(clk_period / 2) clk = ~clk;

  // always # ( clk_period / 2 ) begin
  //   clk = ~clk;
  // end

  /*
  ***********************************************
  */

  // instantialize
  divider temp(clk, reset, clk_divide);

  always @ ( * ) begin
    $display(
      "At time %t, clock: %b, clock devided = %h (%b)",
      $time, clk, clk_divide, clk_divide
    );
  end

  // gtkwave
  initial begin
    $dumpfile("divider_tb.vcd");
    $dumpvars(0, divider_tb);
  end

endmodule

10分频与4分频GTKWave效果如下:

10分频GTKWave波形
10分频GTKWave波形(下降沿)
4分频GTKWave波形
4分频GTKWave波形(下降沿)

波形效果不错。

作者: YanWen

Web 开发者

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s