デジタルICハンドティアリングコード--Xinyuan(三方向周波数)

トピックの説明

50% のデューティ サイクルを必要とする 3 分周器を Verilog で設計します。


問題解決のアイデア

2 つの周波数 x 3 のクロック clk1 および clk2 を設計します。デューティ サイクルはそれぞれ 1/3 と 2/3、立ち下がりエッジ トリガ、立ち上がりエッジ トリガ、および 2 つのクロック位相を設計して、デューティ サイクル 50% の 3 周波数分周を取得します。


コード

module div_3_fre(
    input   clk     ,
    input   rstn    ,
    output  clk_out
);

reg [1:0] cnt1,cnt2;
reg clk1, clk2;

always @(posedge clk)begin
    if(!rstn)begin
        clk1 <= 1'b0; 
    end
    else if(cnt1 == 2'd0 || cnt1 == 2'd2)
        clk1 <= !clk1;
end

always @(posedge clk)begin
    if(!rstn)begin
        cnt1 <= 2'd0;
    end
    else if(cnt1 <= 2'd1)begin
        cnt1 <= cnt1 + 1'b1;
    end
    else if(cnt1 == 2'd2)begin
        cnt1 <= 2'd0;
    end
end

always @(negedge clk)begin
    if(!rstn)begin
        clk2 <= 1'b0; 
    end
    else if(cnt2 == 2'd0 || cnt2 == 2'd2)
        clk2 <= !clk2;
end

always @(negedge clk)begin
    if(!rstn)begin
        cnt2 <= 2'd0;
    end
    else if(cnt2 <= 2'd1)begin
        cnt2 <= cnt2 + 1'b1;
    end
    else if(cnt2 == 2'd2)begin
        cnt2 <= 2'd0;
    end
end

assign clk_out = clk1 & clk2;

endmodule

テストベンチ

module div_3_fre_tb();

wire clk_out;
reg clk,rstn;

initial begin
    rstn <= 1'b0;
    clk  <= 1'b0;
    #20 
    rstn <= 1'b1;
    #100
    $finish();
end

initial begin
    forever #5 clk <= !clk;
end

initial begin
    $fsdbDumpfile("div_3.fsdb");
    $fsdbDumpvars(0);
end

div_3_fre u_div_3_fre(
    .clk        (clk)       ,
    .rstn       (rstn)      ,
    .clk_out    (clk_out)
);

endmodule

波形

結果として得られる波形は、デューティ サイクルが 50% の 3 分周になります。

ティアオフ コードに関するその他の質問については、Digital IC ティアオフ コード - 質問バンクにアクセスしてください。

おすすめ

転載: blog.csdn.net/qq_57502075/article/details/129668390