moduledecimal_div#(
parameter M =53,
parameter N =10)(
clk_in,
rst_n,
clk_out
);
input clk_in;
input rst_n;
output reg clk_out;
localparam P = M / N,
Q = P +1,
R = M - P * N;
reg [3:0] main_cnt;
reg [4:0] diff_cnt;
wire [3:0] cnt_num_sel;
always @(posedge clk_in or negedge rst_n) begin
if(!rst_n) begin
main_cnt <= 'b0 ;
end
elseif(main_cnt == cnt_num_sel) begin
main_cnt <= 'b0 ;
end
else begin
main_cnt <= main_cnt +1'b1 ;
end
end
always @ (posedge clk_in or negedge rst_n) begin
if(!rst_n) begin
diff_cnt <=5'd0;
end
elseif(main_cnt == cnt_num_sel) begin
if(diff_cnt >= N) begin
diff_cnt <= diff_cnt + R - N;
end
else begin
diff_cnt <= diff_cnt + R;
end
end
end
assign cnt_num_sel = diff_cnt >= N ? Q -1: P -1;
always @(posedge clk_in or negedge rst_n) begin
if(!rst_n) begin
clk_out <=1'b0 ;
end
elseif(main_cnt == cnt_num_sel) begin
clk_out <=1'b1 ;
end
else begin
clk_out <=1'b0 ;
end
end
endmodule