Language/Verilog & SV

[Verilog] Frequency(Clock) Divider

VIR&US 2023. 7. 21. 22:16
반응형

목차

    Frequency(Clock) Divider

    출처: https://www.electronics-tutorials.ws/counter/count_1.html

    D F/F를 이용한 주파수 분할입니다. 간단하게 하나의 F/F를 거치면 2 분할됩니다. 카운터를 활용해서 분할할 수 도 있습니다. 생산 이후에 Clock divider를 잘못설계하면(ex. 홀수 분주 시 Timing 고려하지 않은 경우) clock glitch가 발생할 수 있습니다. 간단하게 말해서 clock내 Timing문제가 생겨 해당 clock를 사용하거나 동기화된 모든 기능이 먹통이 될 수 있습니다. 제일 안전하게 분주하는 방법은 F/F를 활용하여 짝수 분주하는 방법입니다.

     

    Code

    D F/F를 이용한 Clock divide Code입니다. 위 그림의 D F/F가 연달아 3개 이어져 있다고 생각하시면 됩니다.

    module clkdiv (
    	input clk,
    	input rstn,
    	output clk_2,
    	output clk_4,
    	output clk_8);
    
    	wire d2, d4, d8, c2, c4, c8;
    
    	assign clk_2 = c2;
    	assign clk_4 = c4;
    	assign clk_8 = c8;	
    
    	DFF FF2div (
    	.CP	(clk),
            .D 	(d2),
            .Rn	(rstn),
          	.Q	(c2),
          	.Qb 	(d2));
    	
    	DFF FF4div (
          	.CP	(c2),
          	.D 	(d4),
          	.Rn 	(rstn),
          	.Q	(c4),
          	.Qb 	(d4));
    
    	DFF FF8div (
          	.CP	(c4),
          	.D 	(d8),
          	.Rn 	(rstn),
          	.Q	(c8),
          	.Qb 	(d8));
      
    endmodule
    
    
    module DFF (
    	input CP,
    	input D,
    	input Rn,
    	output reg Q,
    	output Qb);
    
    	assign Qb = ~Q;
    
      	always @(posedge CP,negedge Rn) begin
          		if(Rn==0) begin
    			Q <= 1'b0;
    		end
    		else begin
    			Q <= D;
    		end
     	end
    	
    endmodule
    

     

    TB

    `timescale 1ns/1ns
    `define SD 5
    `define  CD 10
    
    module tb;
    	reg clk_t;
      	reg rstn_t;
      	wire clk_2_t;
      	wire clk_4_t;
      	wire clk_8_t;
      
      clkdiv clkdiv (
        .clk (clk_t),
        .rstn (rstn_t),
        .clk_2 (clk_2_t),
        .clk_4 (clk_4_t),
        .clk_8 (clk_8_t));
        
      
      initial begin
        clk_t = 0;
        #`SD;
        forever #(`CD/2) clk_t = ~clk_t;
      end
      
      initial begin
        rstn_t = 0;
        #`SD;
        rstn_t = 1;
        #100;
        $finish;
      end
      
      initial begin
        $dumpfile("wave.vcd");
        $dumpvars;
      end
     endmodule
    

     

    DUMP

    Sim

    Frequency(Clock) Divider example

     

    EDA Playground

    Edit, save, simulate, synthesize SystemVerilog, Verilog, VHDL and other HDLs from your web browser.

    www.edaplayground.com

     

    728x90
    반응형