インテル® Hyperflex™ アーキテクチャー高性能デザイン・ハンドブック

ID 683353
日付 11/04/2019
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

2.2.1.1. 非同期リセットを削除する

リセットが完全リセットの定常状態に達するのに十分長く保持されたときに回路が自然にリセットされる場合、非同期リセットを削除します。

表 3は、非同期リセット(太字で表示)がパイプライン内のすべてのレジスターをリセットし、Hyper-Registersに配置されないようにする方法を示しています。

表 3.  Verilog HDLおよびVHDL非同期リセットの例
Verilog HDL VHDL
always @(posedge clk, aclr)
   if (aclr) begin
      reset_synch <= 1'b0;
      aclr_int <= 1’b0;
   end
   else begin
      reset_synch <= 1'b1;
      aclr_int <= reset_synch;
   end

always @(posedge clk, aclr_int)
// Asynchronous reset===============
   if (!aclr_int) begin
      a <= 1'b0;
      b <= 1'b0;
      c <= 1'b0;
      d <= 1'b0;
      out <= 1'b0;
   end
//===============
   else begin
      a <= in;
      b <= a;
      c <= b;
      d <= c;
      out <= d;
   end
PROCESS(clk, aclr) BEGIN
   IF (aclr = '0') THEN
      reset_synch <= '0';
      aclr_int <= '0';
   ELSIF rising_edge(clk) THEN
      reset_synch <= '1';
      aclr_int <= reset_synch;
   END IF;
END PROCESS;

PROCESS(clk, aclr_int) BEGIN
// Asynchronous reset===============
   IF (aclr_int = '0') THEN
      a <= '0';
      b <= '0';
      c <= '0';
      d <= '0';
      output <= '0';
//===============
   ELSIF rising_edge(clk) THEN
      a <= input;
      b <= a;
      c <= b;
      d <= c;
      output <= d;
   END IF;
END PROCESS;

図 7は、表 3の論理を回路図形式で示します。aclrがアサートされると、フロップの出力はすべてゼロになります。 aclrをリリースして2つのクロックパルスを適用すると、すべてのフロップが機能モードになります。

図 7. フル非同期リセットを使用する回路

図 8は、回路の中央からの非同期リセットの削除を示しています。部分的なリセット後、変更された回路が元の回路と同じ定常状態に落ち着いた場合、変更は機能的に同等です。

図 8. 部分非同期リセット


図 9は、通常、反転ロジックを含む回路がパイプラインにとどまるために追加の同期リセットを必要とする方法を示しています。

図 9. レジスターチェイン内のインバータを備えた回路

リセットを解除してクロックを適用すると、レジスター出力はリセット状態になりません。非同期リセットが反転レジスターから削除されると、リセットから落ち着いた後、回路は図 9と同等のままになりません。

図 10. 非同期クリア付きレジスターチェイン内のインバータ回路


反転機能による自然なリセットロジックを回避するには、図 11に示すように、リセット解除と同期するように出力を検証します。次に、検証パイプラインが計算パイプラインが実際に有効なときに出力を有効にできる場合、その動作はリセット解除と同等です。このプロセスは、回路の計算部分が自然にリセットされない場合であっても適切です。

図 11. リセットと同期するための出力の検証

表 4は、図 8のVerilog HDLおよびVHDLの例を示しています。この例をデザインに適用して、不要な非同期リセットを削除してください。

表 4.  最小または非同期クリアを使用したVerilog HDLの例
Verilog HDL VHDL
always @(posedge clk, aclr)
   if (aclr) begin
      reset_synch_1 <= 1'b0;
      reset_synch_2 <= 1'b0;
      aclr_int <= 1'b0;
   end
   else begin
      reset_synch_1 <= 1'b1;
      reset_synch_2 <= reset_synch_1;
      aclr_int <= reset_synch_2;
   end

// Asynchronous reset for output register=====
always @(posedge clk, posedge aclr_int)
   if (aclr_int)
      out <= 1'b0;
   else
      out <= d;
// Synchronous reset for input register=====
always @(posedge clk)
   if (reset_synch_2)
      a <= 1'b0;
   else
      a <= in;
// Naturally resetting registers=====
always @(posedge clk) begin
   b <= a;
   c <= b;
   d <= c;

end
PROCESS (clk, aclr) BEGIN
   IF (aclr = '1') THEN
      reset_synch_1 <= '0';
      reset_synch_2 <= '0';
      aclr_int <= '0';
   ELSIF rising_edge(clk) THEN
      reset_synch_1 <= '1';
      reset_synch_2 <= reset_synch_1;
      aclr_int <= reset_synch_2;
   END IF;
END PROCESS;

// Asynchronous reset for output register=====
PROCESS (clk, aclr_int) BEGIN
   IF (aclr_int = '1') THEN
      output <= '0';
   ELSIF rising_edge(clk) THEN
      output <= d;
   END IF;
END PROCESS;// Synchronous reset for input register=====
PROCESS (clk) BEGIN
   IF rising_edge(clk) THEN
      IF (reset_synch_2 = '1') THEN
         a <= '0';
      ELSE
         a <= input;
      END IF;
   END IF;
END PROCESS;// Naturally resetting registers=====
PROCESS (clk) BEGIN
   IF rising_edge(clk) THEN
      b <= a;
      c <= b;
      d <= c;
   END IF;
END PROCESS;