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

2019-04-14 18:36发布

奇偶分频使用计数器实现 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