题解 | #占空比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

全部评论

相关推荐

你背过凌晨4点的八股文么:简历挂了的话会是流程终止,像我一样
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-07 20:52
吉林大学 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务