占空比50%的奇数分频

描述

设计一个同时输出7分频的时钟分频器,占空比要求为50%

注意rst为低电平复位

信号示意图:

波形示意图:

输入描述:

输入信号 clk_in rst 
类型 wire

输出描述:

输出信号  clk_out7
类型  wire

题意整理

对于奇数分频电路,主要难点在于50%占空比的实现。单触发沿在奇数分频中是没有办法实现50%占空比的,因此需要考虑使用双边沿加组合逻辑实现50%占空比

题解主体

通过简单的状态转移表就能够得出,clkout7的翻转第一次是在上升沿,第二次是在下降沿。

clkin

clkout7

cnt

0

0

0

1

1

1

0

1

1

1

1

2

0

1

2

1

1

3

0

1

3

1

1

4

0

0

4

1

0

5

0

0

5

1

0

6

0

0

6

1

0

7

0

0

7

1

1

8

要让两个不同的时钟边沿触发的分频信号进行组合逻辑,分析应该有下面的时许构成:

很容易看出,做法应该是将两个信号进行或操作

将逻辑转换成Verilog代码描述如下

  reg [3:0]            cnt ;

   always @(posedge clk_in or negedge rst) begin

      if (!rst) begin

         cnt    <= 'b0 ;

      end

      else if (cnt == N-1) begin

         cnt    <= 'b0 ;

      end

      else begin

         cnt    <= cnt + 1'b1 ;

      end

   end


   reg                  clkp ;

   always @(posedge clk_in or negedge rst) begin

      if (!rst) begin

         clkp <= 1'b0 ;

      end

      else if (cnt == (N>>1)) begin

        clkp <= 1 ;

      end

      else if (cnt == N-1) begin

        clkp <= 0 ;

      end

   end

 


   reg                  clkn ;

   always @(negedge clk_in or negedge rst) begin

      if (!rst) begin

         clkn <= 1'b0 ;

      end

      else if (cnt == (N>>1) ) begin

        clkn <= 1 ;

      end

      else if (cnt == N-1) begin

        clkn <= 0 ;

      end

   end



   assign clk_out7 = clkp | clkn ;

参考答案:

`timescale 1ns/1ns


module odo_div_or
  #(parameter N = 7)
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
    );



   reg [3:0]     cnt ;
   always @(posedge clk_in or negedge rst) begin
      if (!rst) begin
         cnt    <= 'b0 ;
      end
      else if (cnt == N-1) begin
         cnt    <= 'b0 ;
      end
      else begin
         cnt    <= cnt + 1'b1 ;
      end
   end

   reg                  clkp ;
   always @(posedge clk_in or negedge rst) begin
      if (!rst) begin
         clkp <= 1'b0 ;
      end
      else if (cnt == (N>>1)) begin 
        clkp <= 1 ;
      end
      else if (cnt == N-1) begin 
        clkp <= 0 ;
      end
   end
  

   reg     clkn ;
   always @(negedge clk_in or negedge rst) begin
      if (!rst) begin
         clkn <= 1'b0 ;
      end
      else if (cnt == (N>>1) ) begin 
        clkn <= 1 ;
      end
      else if (cnt == N-1) begin 
        clkn <= 0 ;
      end
   end


   assign clk_out7 = clkp | clkn ;


endmodule

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值