RTLデザイン(11)-クロックゲーティング

クロックゲーティング

クロック信号のネガティブエッジまたはネガティブレベルクロック信号を停止および再起動すると、クロック信号のグリッチを回避し、クロックサイクルの短縮などの問題を回避できます。

ネガティブエッジレジスタとネガティブレベルラッチの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

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/meng1506789/article/details/111411079