Language/Verilog & SV
[Verilog] Frequency(Clock) Divider
VIR&US
2023. 7. 21. 22:16
반응형
목차
Frequency(Clock) Divider
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
728x90
반응형