RTL設計:基礎とハードウェア設計への応用

Register Transfer Logic (RTL)は、レジスタ間のデータフローと、データに適用される論理演算および算術演算を記述する言語です。エンジニアはRTL設計を使用して機能ブロックを記述し、特定の機能を実行するために使用される個別のコンポーネントの動作を定義します。各機能ブロックには、ブロック内のレジスタの記述(順序回路と呼ばれる)と、機能ブロックの論理演算を含む組み合わせ回路が含まれています。また、ハードウェア記述言語(HDL)を使用して、機能ブロックの接続方法を記述し、回路全体のデータフローを定義します。

RTL設計の強みは、複雑なシステムを、HDLコードで表現される比較的単純なブロックに分割する方法にあります。RTL設計の使用方法を理解するための重要な基本概念を以下に示します。

レジスタ (Registers)

RTL設計では、一定量のデータを格納できるハードウェア要素をレジスタと呼びます。これらは通常、Dフリップフロップとして実装されます。レジスタの値は、論理演算の入力として読み取ったり、演算の出力として設定したりできます。データがレジスタ間をどのように流れ、演算によってデータがどのように変化するかを特徴付けることは、RTL設計の基本的な目的です。

ハードウェア記述言語 (HDL)

RTL設計の最も重要な部分は、回路の動作を記述するコードです。HDLは、変数、関数呼び出し、if-then-elseやCASEなどの論理ステートメント、ブール演算と算術ステートメントなど、プログラミング言語によく似た仕様言語です。ただし、HDLは、電子回路、通常は集積回路の動作と構造を記述するために特別に設計されています。HDLをプログラミング言語と区別する点の1つは、回路内のクロックパルスによって操作をトリガーできるように、時間に関連する概念が言語に含まれていることです。

これは、回路内のデジタルクロックパルスの値を定義する変数を使用することによって実現されます。次に、インバーターの簡単なVHDLの例を示します。出力(Q)は、クロック値clkがローからハイに遷移する(立ち上がりエッジ)ときに、入力(D)の値に設定されます。

D

process(clk) begin     if rising_edge(clk) then         Q     end if; end process;

VHDL(Very High-Speed Integrated Circuit Hardware Description Language)は、C言語とは異なる構文を持つ、冗長で強く型付けされた言語です。より複雑なシステム設計を記述するために好まれるHDLです。

Verilogまたはその拡張版であるSystemVerilogは、もう1つの一般的なHDLです。より簡潔で、弱く型付けされており、柔軟性があり、構文はCコードに似ています。学習と記述が容易なため、エンジニアは、設計を始めたばかりの場合や、回路がそれほど複雑でない場合に、Verilogを好みます。IEEEは、VerilogとVHDLの両方を業界標準として定義しています。

以下は、両方の言語でのANDゲートの簡単な例です。ANDゲートには2つの入力と1つの出力があります。両方の入力が1の場合、出力は1になります。等しくない場合、または両方が0に設定されている場合、出力は0になります。

論理演算

RTL設計には、2種類の演算があります。1つ目は、ビット単位の評価を実行し、レジスタに格納されているデータを変更する論理演算です。AND、OR、NOT、XOR、シフトなどの論理演算は、HDLで論理動作を定義することによって作成されます。上記の例は、VHDLとVerilogでANDをどのように表現できるかを示しています。論理演算は、ハードウェアの論理ゲートを表します。

算術演算

RTL設計における2番目のタイプの演算は、算術演算です。これらは、レジスタ内のデータを取得し、加算、減算、乗算、除算を行います。これらは、標準の数学演算子を使用してHDLで表されます。たとえば、VHDLで2つの数値を加算するには、次の行を使用します。

rst

— inp1とinp2は2つの入力レジスタであり、rstは出力レジスタに割り当てられます。RTLの算術演算は、加算器、減算器、乗算器、除算器などの専用ハードウェア要素を表します。

同期および非同期動作

RTL設計は、同期または非同期の方法でデータフローを表すことができます。同期の場合、サブルーチンは、関数へのシステムクロック入力によって実行またはトリガーされます。非同期の場合、1つ以上の入力ゲートの値が特定の方法で変化したときに、サブルーチンが実行されます。これは、クロック入力または非クロック入力の入力値をチェックして、ifステートメントを使用して変更されているかどうかを確認することによって行われます。

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です