实现时钟的整倍数分频逻辑,小数分频主要控制一段时间内时钟高低电平数量实现,且非50%,因此针对具体应用场景自行书写
module int_freq
#(
parameter N = 3,//must be odd number
parameter N_WIDTH = 3
)
(
input rst_n,
input clk_in,
output clk_out
);
reg [N_WIDTH-1:0] m,n;
reg odd_cnt,odd_cnt2;
always@(posedge clk_in or negedge rst_n)begin
if(!rst_n)begin
m<=0;
odd_cnt<=0;
end
else begin
if(m==N-1)begin
m<=0;
end
else m<=m+1;
if(m<(N>>1))begin
odd_cnt<=1;
end
else odd_cnt<=0;
end
end
always@(negedge clk_in or negedge rst_n)begin
if(!rst_n)begin
n<=0;
odd_cnt2<=0;
end
else begin
if(n==N-1)n<=0;
else n<=n+1;
if(n<(N>>1))odd_cnt2<=1;
else begin
odd_cnt2<=0;
end
end
end
assign clk_out = N[0]?odd_cnt|odd_cnt2:odd_cnt2;
endmodule