日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

[笔记].等占空比分频器的几种写法.[Verilog]

發布時間:2023/12/13 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 [笔记].等占空比分频器的几种写法.[Verilog] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

安德魯? / CC BY 2.5

總結

以上是生活随笔為你收集整理的[笔记].等占空比分频器的几种写法.[Verilog]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。