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

占空比50%的奇数分频

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

注意:

不能同时判断上升沿和下降沿,虽然能通过提交。看大佬解释才知道“这是经典的错误示范,一个always里不能同时写posedge和negedge,这是不可以综合的。

经典错误解法:

`timescale 1ns/1ns

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

//*************code***********//
    reg [2:0] cnt;
    reg clk_out;
    always@(posedge clk_in or negedge clk_in or negedge rst)
        if(~rst)
            cnt <= 0;
        else 
            cnt <= cnt==6? 0:cnt+1;
        
    always@(posedge clk_in or negedge clk_in or negedge rst)
        if(~rst)
            clk_out <= 0;
        else if(cnt==6)
            clk_out <= ~clk_out7;
 
    assign clk_out7 = clk_out;

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

参考大佬的解析:https://blog.nowcoder.net/n/add8496f99154788834702f455c7f2f6?f=comment

1. 偶数分频

 简单,只是注意时钟翻转的条件是(N/2)还是(N/2)-1,非阻塞赋值在下一个时钟才会更新值。

2. 奇数分频

奇数分频比偶数分频复杂一些,当不要求分频的占空比时,对输入时钟clk上升沿计数,可以设置两个计数的翻转点,一个是(N-1)/2,一个是(N-1),计数到(N-1)时输出时钟翻转且将计数器清零,假设计数器计数0~(N-1)/2区间输出低电平,则输出时钟的低电平有(N-1)/2 + 1个clk周期,高电平的计数是(N-1)/2+1 ~ (N-1),共(N-1)/2个clk周期,可见不是50%占空比。

当要求占空比为50%时,对输入时钟clk的上升沿和下降沿分别计数,根据两个计数器得到两个错位输出的时钟,将两个时钟做“或”运算,可以弥补相差的时钟,达到50%占空比。

图中的clk实际上应该是clk_half半个周期。

下面是正确解法:

`timescale 1ns/1ns

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

//*************code***********//
    parameter N=7;
    reg [2:0] cnt_p, cnt_n;
    reg clk_out_p, clk_out_n;
    always@(posedge clk_in or negedge rst)
        if(~rst)
            cnt_p <= 0;
        else 
            cnt_p <= cnt_p==N-1? 0:cnt_p+1;
  
        
    always@(posedge clk_in or negedge clk_in or negedge rst)
        if(~rst)
            clk_out_p <= 0;
        else
            clk_out_p <= cnt_p==N-1||cnt_p==N>>1? ~clk_out_p:clk_out_p;
    
    always@(negedge clk_in or negedge rst)
        if(~rst)
            cnt_n <= 0;
        else 
            cnt_n <= cnt_n==N-1? 0:cnt_n+1;

    always@(negedge clk_in or negedge rst)
        if(~rst)
            clk_out_n <= 0;
        else
            clk_out_n <= cnt_n==N-1||cnt_n==N>>1? ~clk_out_n:clk_out_n;

    assign clk_out7 = clk_out_p||clk_out_n;

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

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司9个岗位
点赞 评论 收藏
分享
争当牛马还争不上
码农索隆:1.把简历改哈 2.猛投,狠投 3.把基础打牢 这样你在有机会的时候,才能抓住
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务