题解 | #占空比50%的奇数分频#

占空比50%的奇数分频

https://www.nowcoder.com/practice/ccfba5e5785f4b3f9d7ac19ab13d6b31

//这个题是奇数分频,单计数器无法完成,所以要双计数器,,cnt1和cnt2
//对应几分频就用多少的计数器,比如7分频就用从0-6的计数器,clk_out1和clk_out2的高低电平比为(N/2):(N/2)+1,所以在本题中比为3:4,其实本来实现7分频是很简单的,在仿真软件中早就实现了,但是要和题目中的波形对应,必须clk_in的下降沿和clk_out_7的上升沿对应,花了一上午才解决


`timescale 1ns/1ns

module odo_div_or
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
    );


reg [2:0] cnt_1,cnt_2;

reg clk_out_1,clk_out_2;

always @(negedge clk_in or posedge rst)begin
    if(~rst)begin
        cnt_1 <= 3'b0;
    end
    else if(cnt_1==6)
    cnt_1 <= 3'b0;
    else
    cnt_1 <= cnt_1+1;
end


always @(posedge clk_in or posedge rst)begin
    if(~rst)begin
        cnt_2 <= 3'b0;
    end
    else if(cnt_2==6)
    cnt_2 <= 3'b0;
    else
    cnt_2 <= cnt_2+1;
end


always @(negedge clk_in or posedge rst)begin
    if(~rst)begin
        clk_out_1 <= 1'b0;
    end
    else if(cnt_1==3)
    clk_out_1 <= 1'b1;
    else if(cnt_1==6)
    clk_out_1 <= 1'b0;
    else
    clk_out_1 <= clk_out_1;
end



always @(posedge clk_in or posedge rst)begin
    if(~rst)begin
        clk_out_2 <= 1'b0;
    end
    else if(cnt_2==4)
    clk_out_2 <= 1'b1;
    else if(cnt_2==0)
    clk_out_2 <= 1'b0;
    else
    clk_out_2 <= clk_out_2;
end
//clk_out_2要比1慢一拍,不能早一拍,不然clk_out_7的上升沿对应不到clk_in的下降沿,就是在这里花了很多时间

assign clk_out7 = (~rst)?0:(clk_out_2|clk_out_1);
//这边这样判断一下主要是clk_out_2是下降沿触发,在下降沿触发之前有半拍没有值,所以在没有值的时候让clk_out7置0




/*
always @(posedge clk_in or negedge rst)begin
    if((~rst))begin
        clk_out_tmp <= 3'b0;
    end
    else if(cnt == 6)
    clk_out_tmp <= ~clk_out_tmp;

end

assign clk_out7 = clk_out_tmp;

*/


//*************code***********//
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务