`timescale 1ns/1ns module div_M_N( input wire clk_in, input wire rst, output wire clk_out ); parameter M_N = 8'd87; parameter c89 = 8'd24; // 8/9时钟切换点 parameter div_e = 5'd8; //偶数周期 parameter div_o = 5'd9; //奇数周期 //之前得奇数分频要求了占空比50%,所以牵扯到下降沿,现在这个未要求占空比,用clk_in上升沿即可,9分配1 4个 0 5个 reg [7:0]cnt; reg [3:0]cnt_8,cnt_9; always@(posedge clk_in or negedge rst)begin if(!rst)begin cnt <= 8'b0; end else if(cnt < M_N)begin cnt <= cnt + 1'b1; end else begin cnt <= 8'd1; end end //cnt8 always@(posedge clk_in or negedge rst)begin if(!rst)begin cnt_8 <= 4'b0; end else if(cnt <= c89)begin if(cnt_8 == 4'd8)begin cnt_8 <= 4'd1; end else begin cnt_8 <= cnt_8 + 1'b1; end end else if(cnt == M_N)begin cnt_8 <= 4'd1; end end //cnt9 always@(posedge clk_in or negedge rst)begin if(!rst)begin cnt_9 <= 4'b0; end else if(cnt >= c89 && cnt < M_N)begin if(cnt_9 == 4'd9)begin cnt_9 <= 4'd1; end else begin cnt_9 <= cnt_9 + 1'b1; end end else if(cnt == M_N)begin cnt_9 <= 4'b0; end end reg clk_out_temp; always@(posedge clk_in or negedge rst)begin if(!rst)begin clk_out_temp <= 1'b0; end else if(cnt <= c89)begin //3个8分频 if(cnt_8 == 4'd0 | cnt_8 == 4'd8)begin clk_out_temp <= 1'b1; end else if(cnt_8 == 4'd4)begin clk_out_temp <= 1'b0; end end else if(cnt > c89 && cnt <= M_N) begin //7个9分频 if(cnt_9 == 4'd0 | cnt_9 == 4'd9)begin clk_out_temp <= 1'b1; end else if(cnt_9 == 4'd4)begin clk_out_temp <= 1'b0; end end end assign clk_out = clk_out_temp; endmodule