题解 | #时钟分频(偶数)#

时钟分频(偶数)

http://www.nowcoder.com/practice/49a7277c203a4ddd956fa385e687a72e

题意整理

对于偶数分频电路,在不考虑时钟同步时钟延迟的问题时,直接使用D触发器级联来实现

题解主体

级联D触发器,可以得到状态转换:

关键在于,上升沿才能触发翻转,但是一个周期只有一个上升沿,因此周期翻倍

clkin

clkout2

clkout4

clkout8

0

0

0

0

1

1

1

1

0

1

1

1

1

0

1

1

0

0

1

1

1

1

0

1

0

1

0

1

1

0

0

1

根据激励方程和输出方程以及思路整理,关键电路如下:


将电路转换成Verilog代码描述如下



   //2 分频

   reg                  clk_div2 ;

   always @(posedge clk_in or negedge rst) begin

      if (!rst) begin

         clk_div2     <= 'b0 ;

      end

      else begin

         clk_div2     <= ~clk_div2 ;

      end

   end

   assign       clk_out2 = clk_div2 ;



   //4 分频

   reg                  clk_div4 ;

   always @(posedge clk_out2 or negedge rst) begin

      if (!rst) begin

         clk_div4     <= 'b0 ;

      end

      else begin

         clk_div4     <= ~clk_div4 ;

      end

   end

   assign clk_out4      = clk_div4 ;


       //8 分频

   reg                  clk_div8 ;

   always @(posedge clk_out4 or negedge rst) begin

      if (!rst) begin

         clk_div8     <= 'b0 ;

      end

      else begin

         clk_div8     <= ~clk_div8 ;

      end

   end

   assign clk_out8      = clk_div8 ;


因此实现方式为如下的电路,综合得到:


参考答案

`timescale 1ns/1ns


module even_div
    (
    input     wire rst ,
    input     wire clk_in,
    output    wire clk_out2,
    output    wire clk_out4,
    output    wire clk_out8
    );


   //2 分频
   reg                  clk_div2 ;
   always @(posedge clk_in or negedge rst) begin
      if (!rst) begin
         clk_div2     <= 'b0 ;
      end
      else begin
         clk_div2     <= ~clk_div2 ;
      end
   end
   assign       clk_out2 = clk_div2 ;


   //4 分频
   reg                  clk_div4 ;
   always @(posedge clk_out2 or negedge rst) begin
      if (!rst) begin
         clk_div4     <= 'b0 ;
      end
      else begin
         clk_div4     <= ~clk_div4 ;
      end
   end
   assign clk_out4      = clk_div4 ;

	//8 分频
   reg                  clk_div8 ;
   always @(posedge clk_out4 or negedge rst) begin
      if (!rst) begin
         clk_div8     <= 'b0 ;
      end
      else begin
         clk_div8     <= ~clk_div8 ;
      end
   end
   assign clk_out8      = clk_div8 ;

endmodule
全部评论
这就是行波计数器
点赞 回复 分享
发布于 2022-04-10 11:11

相关推荐

面了100年面试不知...:今年白菜这么多,冬天可以狂吃了
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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