首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

数字电路设计之奇偶分频的verilog实现

数字电路设计之奇偶分频的verilog实现

奇偶分频使用计数器实现
1、若要进行N倍偶数分频,那么计数器就要从0~N/2-1,到N/2-1时反转。
例子:进行16分频。
module Even_Fre( clk_in,rst,clk_out );
  input wire clk_in,rst;
output reg clk_out;
reg   [2:0]count;
always@(posedge clk_in) begin
    if( rst == 0 ) begin
     count   <= 0;
  clk_out <= 0;
end
else
if( count == 7) begin
     count   <= 0;
     clk_out <= !clk_out;
end
else begin
    count    <= count + 1;
    clk_out  <= clk_out;
end
end
endmodule

2、一般使用错位“异或”法来实现奇分频,奇分频的精髓在于为了实现奇分频,那么就必须把一个时钟周期分开,那么就可以使用上升沿和下降沿做到。
module Odd_Fre( clk_in,clk_out,rst );
input wire  clk_in;
input wire  rst;
output wire clk_out;

reg [1:0]cnt2,cnt1;
reg clk_1to3p,clk_1to3n;

always@(posedge clk_in)begin
     if(!rst) begin
       cnt1      <= 0;
      clk_1to3p <= 0;
  end
  else
  if(cnt1 == 2'b10) begin
       clk_1to3p <= clk_1to3p;
       cnt1      <= 0;
  end
  else begin
       clk_1to3p <= ~clk_1to3p;
       cnt1      <= cnt1 + 1;
  end
end
always@(negedge clk_in)begin
     if(!rst) begin
       cnt2      <= 0;
       clk_1to3n <= 0;
  end
  else
  if(cnt2 == 2'b10) begin
       clk_1to3n <= clk_1to3n;
      cnt2      <= 0;
  end
  else begin
       clk_1to3n <= ~clk_1to3n;
       cnt2      <= cnt2 + 1;
  end
end
    assign clk_out = clk_1to3n | clk_1to3p;
endmodule
返回列表