我是靠谱客的博主 欣喜萝莉,最近开发中收集的这篇文章主要介绍Verilog -- 奇数分频器Verilog – 奇数分频器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Verilog – 奇数分频器

偶数分频的原理就是计数到N/2-1后对分频输出取反。而如果分频数N为基数,则需要:
clk_out1 在clk 上升沿计数到 (N-1)/2-1后取反, 计数到N-1以后再取反
clk_out2 在clk 下降沿计数到 (N-1)/2-1后取反, 计数到N-1以后再取反
clk_out 取clk_out1 和 clk_out2的或。
代码:

module clk_div
#(
  parameter DIV = 3
)
(
input                                   clk_in,
input                                   rst_n,

output                                  clk_out
);

parameter WIDTH = $clog2(DIV);
parameter HALF_DIV = (DIV-1)/2;
reg [WIDTH-1:0] cnt;
reg clk_div1;
reg clk_div2;
assign clk_out = clk_div1 | clk_div2;


always@(posedge clk_in or negedge rst_n) begin
  if (!rst_n) begin
    cnt <= 0;
  end else begin
    if(cnt == DIV-1) cnt <= 0;
    else cnt <= cnt + 1;
  end
end

always@(posedge clk_in or negedge rst_n) begin
  if (!rst_n) begin
    clk_div1 <= 0;
  end else begin
    if(cnt==HALF_DIV-1) begin
      clk_div1 <= 0;
    end
    else if(cnt == DIV-1)begin
      clk_div1 <= 1;
    end 
    else begin
      clk_div1 <= clk_div1;
    end
  end
end

always@(negedge clk_in or negedge rst_n) begin
  if (!rst_n) begin
    clk_div2 <= 0;
  end else begin
    if(cnt==HALF_DIV-1) begin
      clk_div2 <= 0;
    end
    else if(cnt == DIV-1)begin
      clk_div2 <= 1;
    end 
    else begin
      clk_div2 <= clk_div2;
    end
  end
end
endmodule

testbench:

`timescale 1ns/1ps

module clk_div_tb(/*autoarg*/);

reg                                   clk_in;
reg                                   rst_n;
wire                                  clk_out;

always #1 clk_in = ~clk_in;

initial begin
  clk_in = 1;
  rst_n = 1;
  #2 rst_n = 0;
  #2 rst_n = 1;

end
initial begin
    $fsdbDumpvars();
    $fsdbDumpMDA();
    $dumpvars();
    #100 $finish;
  end

clk_div #(
    .DIV                            ( 3                             ))
U_CLK_DIV_0(
    .clk_in                         ( clk_in                        ),
    .rst_n                          ( rst_n                         ),
    .clk_out                        ( clk_out                       )
);


endmodule

仿真波形:
在这里插入图片描述

最后

以上就是欣喜萝莉为你收集整理的Verilog -- 奇数分频器Verilog – 奇数分频器的全部内容,希望文章能够帮你解决Verilog -- 奇数分频器Verilog – 奇数分频器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部