题解 | #任意小数分频#
任意小数分频
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***********// reg [7:0] cyc_cnt; reg div_flag; reg [4:0] clk_cnt; reg clk_out_r; always @ (posedge clk_in, negedge rst) begin if(!rst) begin clk_cnt <= 5'b0; end else if (!div_flag) begin clk_cnt <= (clk_cnt == div_e - 1) ? 5'b0 : clk_cnt + 5'b1; end else begin clk_cnt <= (clk_cnt == div_o - 1) ? 5'b0 : clk_cnt + 5'b1; end end always @ (posedge clk_in, negedge rst) begin if(!rst) begin cyc_cnt <= 8'b0; end else begin cyc_cnt <= (cyc_cnt == M_N - 1) ? 8'b0 : cyc_cnt + 8'b1; end end always @ (posedge clk_in, negedge rst) begin if(!rst) begin div_flag <= 1'b0; end else begin div_flag <= ((cyc_cnt == c89 - 1) || (cyc_cnt == M_N - 1))? (~div_flag) : div_flag; end end always @ (posedge clk_in, negedge rst) begin if(!rst) begin clk_out_r <= 1'b0; end else if (!div_flag) begin clk_out_r <= clk_cnt <= ((div_e >> 2) + 1) ; end else begin clk_out_r <= clk_cnt <= ((div_o >> 2) + 1); end end assign clk_out = clk_out_r; //*************code***********// endmodule
查看2道真题和解析

