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

占空比50%的奇数分频

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

简析

alt clk_pos是周期为7且在clk_in上升沿翻转的信号, clk_neg是周期为7且在clk_in下降沿翻转的信号。二者的占空比都是37\frac{3}{7}。最后clk_out7等于二者相或。
上面的波形图是用WaveDrom画出来的,它还可以绘制门电路图,也是Github上的开源项目,很推荐。
波形图代码:

{signal: [
  {name: 'clk_in',     wave: 'n............', period:2},
  {name: 'rst',     wave: '0.1.......................'},
  {name: 'cnt',     wave: '=..3.4.5.6.7.8.=.=.=.=.=.=', data:["0","1","2","3","4","5","6","0","1","2","3","4","5","6"]},
  {name: 'clk_pos', wave: '0........1.....0.......1..', phase:0},
  {name: 'clk_neg', wave: '0.......1.....0.......1...', phase:0},
  {name: 'clk_out', wave: '0.......1......0......1...', phase:0},
  {node:'.a......b......c',phase:0}
],
 edge: ['a<->b 3.5', 'b<->c 3.5'],
head:{
   text:'占空比50%的7分频', 
 },}

代码

`timescale 1ns/1ns

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

//*************code***********//
    reg clk_neg, clk_pos;
    reg [2:0] cnt;
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            cnt <= 0;
        else
            cnt <= cnt==6? 0: cnt+1;
    end
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            clk_pos <= 0;
        else
            clk_pos <= cnt==3||cnt==6? ~clk_pos: clk_pos;
    end
    
    always@(negedge clk_in or negedge rst) begin
        if(~rst)
            clk_neg <= 0;
        else
            clk_neg <= cnt==3||cnt==6? ~clk_neg: clk_neg;
    end

    assign clk_out7 = clk_neg|clk_pos;
//*************code***********//
endmodule
Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论
cnt从0到3,变化3次,从3到6变化3次,但是从6到0再到3变化了4次,这个cnt为啥可以这么写
点赞 回复 分享
发布于 2022-11-01 16:12 上海
你好帅
点赞 回复 分享
发布于 2023-04-19 20:52 湖北
请问一下,如果这个tb文件将rst信号拉高的时刻改为输入时钟的上升沿,代码是不是就通过不了?
点赞 回复 分享
发布于 2023-07-11 16:24 陕西

相关推荐

10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
65 6 评论
分享
牛客网
牛客企业服务