题解 | #任意小数分频#
任意小数分频
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
曼迪匹艾公司福利 95人发布