N(偶数)数倍分频
module even_clkdiv
#(parameter N=4)
(
input clk,
input rst_n,
output clk_div
);
reg clk_div;
reg [2:0] cnt;
//N(偶数)为几就是多少倍分频
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 3'b0;
else if(cnt==N-1)
cnt <= 3'b0;
else
cnt <= cnt+1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_div <= 1'b0;
else if(cnt==N/2-1)
clk_div <= ~clk_div;
end
endmodule
N(奇数)数倍分频
module odd_clkdiv
#(parameter N=5)
(
input clk,
input rst_n,
output clk_div
);
reg clk1;
reg clk2;
reg [2:0] cnt1;
reg [2:0] cnt2;
//时钟上升沿计数
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt1 <= 3'b0;
else if(cnt1==N-1)
cnt1 <= 3'b0
else
cnt1 <= cnt1+1;
end
//时钟下降沿计数
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt2 <= 3'b0;
else if(cnt2==N-1)
cnt2 <= 3'b0;
else
cnt2 <= cnt2+1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
clk1 <= 1'b0;
else if(cnt1==N-1/2||cnt1==N-1)
clk1 <= ~clk1;
else
clk1 <= clk1;
end
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
clk2 <= 1'b0;
else if(cnt2==N-1/2||cnt2==N-1)
clk2 <= ~clk2;
else
clk2 <= clk2;
end
assign clk_div = clk1|clk2;
endmodule