题意整理

对于偶数分频电路,在不考虑时钟同步时钟延迟的问题时,直接使用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