トピックの説明
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 ティアオフ コード - 質問バンクにアクセスしてください。