题解 | #占空比50%的奇数分频#
占空比50%的奇数分频
https://www.nowcoder.com/practice/ccfba5e5785f4b3f9d7ac19ab13d6b31
采用两个计数器,一个上升沿触发,一个下降沿触发,两者各自触发3个时钟,相或即可得到3.5个时钟 `timescale 1ns/1ns module odo_div_or ( input wire rst , input wire clk_in, output wire clk_out7 ); //*************code***********// reg clk_1; reg clk_2; reg [2:0] clk_cnt; //奇数分频所得到结果就是一个是在上升沿的时候,一个在下降沿的时候,这样就是一个奇数的时钟 //此题没有要求在复位之后立马输出时钟,开始时是低位,而在之前的偶数分频的题中,要求开始就拉高 always@(posedge clk_in or negedge rst) begin if(!rst) clk_cnt <= 3'b0; else if(clk_cnt == 3'd6) clk_cnt <= 3'b0; else clk_cnt <= clk_cnt + 1'b1; end always@(posedge clk_in or negedge rst) begin if(!rst) clk_1 <= 1'b0; else if(clk_cnt == (3'd6 - 3'd3)) clk_1 <= 1'b1; else if(clk_cnt == 3'd6) //正常所需的是3.5个,所以这里需要的就是上升沿和下降沿各拉高3个,将两者相或就得到3.5个 clk_1 <= 1'b0; else clk_1 <= clk_1; end always@(negedge clk_in or negedge rst) //注意这里是下降沿触发,只有这样才能得到奇数,因为奇数就是要有一个下降沿 begin if(!rst) clk_2 <= 1'b0; else if(clk_cnt == (3'd6 - 3'd3)) clk_2 <= 1'b1; else if(clk_cnt == 3'd6) clk_2 <= 1'b0; else clk_2 <= clk_2; end assign clk_out7 = clk_1 | clk_2; //*************code***********// endmodule