본문 바로가기
Language/Verilog & SV

[Verilog] Frequency(Clock) Divider

by VIR&US 2023. 7. 21.
반응형

목차

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
반응형