[Verilog 전투] 조정 가능한 듀티 사이클이 있는 정수 패리티 분배기의 설계 및 기능 검증(소스 코드 포함)


가상 머신: VMware -14.0.0.24051
환경: ubuntu 18.04.1 스크립트
: makefile( 이동 하려면 클릭 )
유틸리티: vcs 및 verdi



1. 수요

  모듈은 임의의 수의 2-15배로 주파수 분할을 실현할 수 있으며 주파수 분할 후 얻은 클록의 듀티 사이클은 정수 사이클로 조정할 수 있습니다.
  주파수 분할도 FDC = 8 주파수 분할을 예로 들며( FDC分频系数), 클럭의 상승 에지를 사용하여 카운트할 때 최대 카운트 값은 8(0~8, 카운터는 4비트 필요, 0은 클럭 에지가 없음을 의미합니다 8은 이미 8이 있음을 의미합니다. 클럭 에지가 오고 있음), 조정 가능한 듀티 사이클은 1/8x100%, 2/8x100%...입니다.
  홀수 주파수 분할은 이중 에지 감지를 채택하고 FDC = 3 주파수 분할을 예를 들어, 최대 카운트 값은 6, 조정 가능 듀티 사이클은 1/6, 2/6…입니다.


2. 타이밍

여기에 이미지 설명 삽입


三、디자인 및 기능 검증

(1) RTL

//-- modified by xlinxdu, 2022/04/26
module div
#(
  parameter FDC     = 10,
  parameter TOG_CNT = 5
)(
  input      clk    ,
  input      rst_n  ,
  output reg clk_div
);
  
reg [3:0] cnt;
reg [4:0] cnt_odd;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 4'b0;
    end
    else if((FDC%2 == 0) && (cnt < FDC))begin
        cnt <= cnt + 1'b1;
    end
    else if(FDC%2 == 0) begin
        cnt <= 4'b1;
    end
end

always @(*) begin
    if((FDC%2 == 0)  && (cnt <= TOG_CNT))begin
        clk_div = 1'b1;
    end
    else if((FDC%2 == 0) && (cnt > TOG_CNT))begin
        clk_div = 1'b0;
    end
end

always @(posedge clk or negedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_odd <= 5'b0;
    end
    else if((FDC%2 ) && (cnt_odd < 2*FDC))begin
        cnt_odd <= cnt_odd + 1'b1;
    end
    else if(FDC%2 ) begin
        cnt_odd <= 5'b1;
    end
end

always @(*) begin
    if((FDC%2) && (cnt_odd <= TOG_CNT))begin
        clk_div = 1'b1;
    end
    else if((FDC%2) && (cnt_odd > TOG_CNT))begin
        clk_div = 1'b0;
    end
end

endmodule

(2) 테스트 벤치

//-- modified by xlinxdu, 2022/04/26
`timescale 1ns/1ns
module tb_div;
 
    reg clk;
    reg rst_n;
    wire clk_div;

initial begin
        clk   = 0;
        rst_n = 1;
 
        #10 rst_n = 0;
        #10 rst_n = 1;

end

always #100 clk = ~clk;

div #(8,4) tb_div (
                    .clk(clk), 
                    .rst_n(rst_n), 
                    .clk_div(clk_div)
                   );

initial begin
  $fsdbDumpfile("div.fsdb");
  $fsdbDumpvars              ;
  $fsdbDumpMDA               ;
  #10000 $finish             ;
end 
 
      
endmodule

4. 결과

  다음 테스트는 8개의 주파수 분할, 50% 듀티 사이클, 3개의 주파수 분할, 50% 듀티 사이클을 예로 사용합니다. 테스트 케이스를 통해 매개변수를 전달하여 분할 계수 및 듀티 사이클을 변경합니다.

(1) 8로 나누기(50%, #(8,4))

여기에 이미지 설명 삽입

(2) 3으로 나누기(50%, #(3,3))

여기에 이미지 설명 삽입

  • 결과: 테스트 파형이 타이밍과 동일하고 데이터 경로가 정확하며 기능 검증이 통과되었습니다.

알아채다: 주파수를 홀수로 나눈 경우 Duty Cycle의 전달값 계산에 주의하십시오.


저자: xlinxdu
저작권: 이 글은 원저자이며, 저작권은 저작자에게 있습니다.
전재: 저자의 허락 없이 전재를 금지하며, 전재는 반드시 이 문구를 유지해야 하며, 기사에 원문 링크를 제공해야 합니다.

추천

출처blog.csdn.net/qq_43244515/article/details/124436263