クロックゲーティング
クロックゲーティング
クロック信号のネガティブエッジまたはネガティブレベルでクロック信号を停止および再起動すると、クロック信号のグリッチを回避し、クロックサイクルの短縮などの問題を回避できます。
ネガティブエッジレジスタとネガティブレベルラッチの2つの方法があります。
ラッチ方式を使用したクロックゲーティングの方が優れています:(1)ラッチの領域が小さい;(2)ラッチがレベルトリガーされ、en信号の到着時間がより任意になる可能性があります
プログラム例
プログラムは、ラッチクロックゲーティング回路を実装しています。
clock_gating.v
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date: 2020/12/19
// Author Name: Sniper
// Module Name: clock_gating
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module clock_gating(
input clk,
input en,
output clk_out
);
wire latch_out;
assign latch_out = clk==0 ? en : latch_out;
assign clk_out = latch_out & clk;
endmodule
tb_clock_gating.v
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date: 2020/12/19
// Author Name: Sniper
// Module Name: tb_clock_gating
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module tb_clock_gating;
//input
reg clk;
reg en;
//output
wire clk_out;
initial
begin
clk = 0;
en = 0;
#100;
en = 1;
#100;
en = 0;
#28;
en = 1;
#33;
en = 0;
#66;
en = 1;
#88;
en = 0;
end
//clock
always #5 clk = ~clk;
//DUT
clock_gating DUT
(
.clk(clk),
.en(en),
.clk_out(clk_out)
);
initial
begin
$dumpfile("tb_clock_gating.vcd");
$dumpvars(0,tb_clock_gating);
end
initial #500 $finish;
endmodule
シミュレーション結果
vcs -R clock_gating.v tb_clock_gating.v