题解 | #任意小数分频#
任意小数分频
https://www.nowcoder.com/practice/24c56c17ebb0472caf2693d5d965eabb
`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; //奇数周期 //*************code***********// // 8.7分频,10个输出时钟周期等于87个输入时钟周期,需要3个8分频时钟周期和7个9分频时钟周期 // cnt_87 计数周期为0-86,cnt_div为产生8分频时钟(1/2占空比)和9分频时钟(4/9占空比)的计数器,cnt_div在cnt_87为23之前计数周期为0-7,在23之后计数周期为0-8,且分频时钟在cnt_div计数为0和3时翻转 // cnt reg [7:0] cnt_87; reg [3:0] cnt_div; always @(posedge clk_in, negedge rst) begin if(!rst) begin cnt_87 <= 0; cnt_div <= 0; end else begin cnt_87 <= (cnt_87 == M_N-1)? 0 : cnt_87 + 1; if(cnt_87 <= c89-1) begin cnt_div <= (cnt_div == div_e-1)? 0 : cnt_div + 1; // 8分频计数 end else begin cnt_div <= (cnt_div == div_o-1)? 0 : cnt_div + 1; // 9分频计数 end end end // clk_out reg clk_div; always @(posedge clk_in, negedge rst) begin if(!rst) begin clk_div <= 0; end else begin clk_div <= (cnt_div == 0 || cnt_div == div_e >> 1)? ~clk_div : clk_div; end end assign clk_out = clk_div; //*************code***********// endmodule