等占空比分频器的几种写法

转自http://www.cnblogs.com/yuphone/archive/2010/02/08/1666130.html

1 偶数分频

(1)2的幂分频

案例I 二分频

i: div_2.v

module div_2(
  input  i_clk,
  input  i_rst_n,

  output o_clk
);

reg [0:0] cnt;

always @ (posedge i_clk, negedge i_rst_n)
  if (!i_rst_n)
    cnt <= 0;
  else
    cnt <= cnt + 1‘b1;

assign o_clk = cnt[0];

endmodule

ii:RTL视图(QII综合结果)

图1 二分频的RTL视图

iii:仿真波形(QII仿真结果)

图2 二分频的仿真波形

案例II 四分频

i:div_4.v

module div_4(
  input  i_clk,
  input  i_rst_n,

  output o_clk
);

reg [1:0] cnt;

always @ (posedge i_clk, negedge i_rst_n)
  if (!i_rst_n)
    cnt <= 0;
  else
    cnt <= cnt + 1‘b1;

assign o_clk = cnt[1];

endmodule

ii:RTL视图(QII综合结果)

图3 四分频的RTL视图

iii:仿真波形(QII仿真结果)

图4 四分频的仿真波形

(2)不是2的幂分频

案例I 六分频

i:div_6.v

module div_6(
  input      i_clk,
  input      i_rst_n,

  output reg o_clk
);

// log2(6) = 2.5850 <= 3
reg [2:0] cnt;

// 6 bit counter: 0 ~ 5
// 5 = 6 - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    cnt <= 0;
  else
  begin
    if (cnt == 5)
      cnt <= 0;
    else
      cnt <= cnt + 1‘b1;
    end
end

// 0 ~ 2  -> 1
// 2 ~ 5  -> 0
// 2 = 6>>1 - 1
// 5 = 6    - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    o_clk <= 0;
  else
  begin
    if (cnt <= 2)
      o_clk <= 1;
    else
      o_clk <= 0;
  end
end

endmodule

ii:RTL视图(QII综合结果)

图5 六分频的RTL视图

gt;iii:仿真波形(QII仿真结果)

图6 六分频的仿真波形

案例II 十分频

i:div_10.v

module div_10(
  input      i_clk,
  input      i_rst_n,

  output reg o_clk
);

// log2(10) = 3.3219 <= 4
reg [3:0] cnt;

// 10 bit counter: 0 ~ 9
// 9 = 10 - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    cnt <= 0;
  else
  begin
    if (cnt == 9)
      cnt <= 0;
    else
      cnt <= cnt + 1‘b1;
    end
end

// 0 ~ 4  -> 1
// 4 ~ 9  -> 0
// 4 = 10>>1 - 1
// 9 = 10    - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    o_clk <= 0;
  else
  begin
    if (cnt <= 4)
      o_clk <= 1;
    else
      o_clk <= 0;
  end
end

endmodule

ii:RTL视图(QII综合结果)

图7 十分频的RTL视图

iii:仿真波形(QII仿真结果)

图8 十分频的仿真波形

2 奇数分频

案例I 三分频

i. div_3.v

module div_3(
  input  i_clk,
  input  i_rst_n,

  output o_clk
);

// log2(3) = 1.5850 <= 2
reg [1:0] cnt_p;                        // 上升沿计数子

// 3位上升沿计数器: 0 ~ 2
// 2 = 3 - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    cnt_p <= 0;
  else
    begin
    if (cnt_p == 2)
      cnt_p <= 0;
    else
      cnt_p <= cnt_p + 1‘b1;
    end
end

// log2(3) = 1.5850 <= 2
reg [1:0] cnt_n;                        // 下降沿计数子

// 3位下降沿计数器: 0 ~ 2
// 2 = 3 - 1
always @ (negedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    cnt_n <= 0;
  else
  begin
    if (cnt_n == 2)
      cnt_n <= 0;
    else
      cnt_n <= cnt_n + 1‘b1;
  end
end

reg o_clk_p;                            // 上升沿时钟输出寄存器

// 输出上升沿时钟
// 0     ~ 1 ↑-> 1
// (1+1) ~ 2 ↑-> 0
// 1 = 3>>1
// 2 = 3 - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    o_clk_p <= 0;
  else
  begin
    if (cnt_p <= 1)                     // 1 = 3>>1
      o_clk_p <= 1;
    else
      o_clk_p <= 0;
  end
end

reg o_clk_n;                            // 下降沿时钟输出寄存器

// 输出下降沿时钟
// 0     ~  1 ↓-> 1
// (1+1) ~  2 ↓-> 0
// 1 = 3>>1
// 2 = 3 - 1
always @ (negedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    o_clk_n <= 0;
  else
  begin
    if (cnt_n <= 1)                     // 1 = 3>>1
      o_clk_n <= 1;
    else
      o_clk_n <= 0;
  end
end

assign o_clk = o_clk_n & o_clk_p;       // 按位与(作用:掩码)

endmodule

ii:RTL视图(QII综合结果)

图9 三分频的RTL视图

iii:仿真波形(QII仿真结果)

图10 三分频的仿真波形

案例II 五分频

i. div_5.v

module div_5(
  input  i_clk,
  input  i_rst_n,

  output o_clk
);

// log2(5) = 2.3219 <= 3
reg [2:0] cnt_p;                        // 上升沿计数子

// 5位上升沿计数器: 0 ~ 4
// 4 = 5 - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    cnt_p <= 0;
  else
    begin
    if (cnt_p == 4)
      cnt_p <= 0;
    else
      cnt_p <= cnt_p + 1‘b1;
    end
end

// log2(5) = 2.3219 <= 3
reg [2:0] cnt_n;                        // 下降沿计数子

// 5位下降沿计数器: 0 ~ 4
// 4 = 5 - 1
always @ (negedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    cnt_n <= 0;
  else
  begin
    if (cnt_n == 4)
      cnt_n <= 0;
    else
      cnt_n <= cnt_n + 1‘b1;
  end
end

reg o_clk_p;                            // 上升沿时钟输出寄存器

// 输出上升沿时钟
// 0     ~ 2 ↑-> 1
// (2+1) ~ 4 ↑-> 0
// 2 = 5>>1
// 4 = 5 - 1
always @ (posedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    o_clk_p <= 0;
  else
  begin
    if (cnt_p <= 2)                     // 2 = 5>>1
      o_clk_p <= 1;
    else
      o_clk_p <= 0;
  end
end

reg o_clk_n;                            // 下降沿时钟输出寄存器

// 输出下降沿时钟
// 0     ~ 2 ↓-> 1
// (2+1) ~ 4 ↓-> 0
// 2 = 5>>1
// 4 = 5 - 1
always @ (negedge i_clk, negedge i_rst_n)
begin
  if (!i_rst_n)
    o_clk_n <= 0;
  else
  begin
    if (cnt_n <= 2)                     // 2 = 5>>1
      o_clk_n <= 1;
    else
      o_clk_n <= 0;
  end
end

assign o_clk = o_clk_n & o_clk_p;       // 按位与(作用:掩码)

endmodule

ii:RTL视图(QII综合结果)

图11 五分频的RTL视图

iii:仿真波形(QII仿真结果)

图12 五分频的仿真波形

参考资料

1. 真 OO無雙,(原創) 如何設計除頻器? (SOC) (Verilog) (MegaCore)

http://www.cnblogs.com/oomusou/archive/2008/07/31/verilog_clock_divider.html

2. 小時不識月,N倍奇数分频器.(Verilog)

http://blog.ednchina.com/2006tx_yafeng/146438/message.aspx

3. 小時不識月,N倍偶数分频器.(Verilog)

http://blog.ednchina.com/2006tx_yafeng/146525/message.aspx

时间: 2024-08-10 15:09:30

等占空比分频器的几种写法的相关文章

一维数组的三种写法

/** *一维 数组的几种写法 * 记住:①数组的左边不能有数字 *   ②数组的右边既然初始化了数组,那么就要赋值 */ //一维数组的标准格式 String[] arr1 = new String[]{"bo","li","jian"}; //上面的简写格式 String[] arr2 = {"bo","li","jian"}; //初始化容量 String[] arr3 = new

Android点击事件的四种写法

Android点击事件的四种写法 一.Android点击事件的四种写法 1.点击事件的第一种写法 .  写一个内部类.实现点击事件的接口 bt.setOnClickListener(new MyButtonListener()); 2.点击事件的第二种写法,匿名内部类 bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callPhone(); } }); 3.点击事件的第三种

for循环的两种写法

教程 (https://tour.golang.org/methods/21) 里的 for 是这样写的: 其中 for 语句可以改写如下: for n, err := r.Read(b); err != io.EOF; n, err = r.Read(b) { fmt.Printf("n = %v err = %v b = %v\n", n, err, b) fmt.Printf("b[:n] = %q\n", b[:n]) } (当然,golang 里的 for

全面理解Javascript闭包和闭包的几种写法及用途

一.什么是闭包和闭包的几种写法和用法                                                       1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态. 2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 简单的说,Javascript允许使用内部函数---即函数定义和函数表

Android Listener侦听的N种写法

Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用,其接口定义如下: [java] view plaincopyprint? public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was cli

CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)

Description A thief is running away! We can consider the city where he locates as an undirected graph in which nodes stand for crosses and edges stand for streets. The crosses are labeled from 0 to N–1. The tricky thief starts his escaping from cross

Android点击事件(click button)的四种写法

在学习android开发和测试的时候发现不同的人对于click事件的写法是不一样的,上网查了一下,发现有四种写法,于是想比较一下四种方法的不同 第一种方法:匿名内部类 代码: package com.zdx.testdemo1; import javax.security.auth.PrivateCredentialPermission; import android.app.Activity;import android.os.Bundle;import android.view.Menu;i

javascript数组去重算法-----4(另一种写法)

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5

button单击事件的四种写法

Button单击事件的四种写法:  1.第一种写法:匿名内部类 附上代码: public class MainActivity extends Activity{ private Button btn ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (B