# ソフトウェアの人々のためのHDLRubyチュートリアル
このチュートリアルでは、ソフトウェアの観点からHDLRubyを使用したデジタル回路の記述の基本を学びます。具体的には、以下のことを学びます:
1. [HDLRubyとそのフレームワークの使い方について。](#hdlruby)
2. [回路の表現方法について。](#circuit)
3. [回路で実装されるアルゴリズムの記述方法について。](#algorithm)
4. [アルゴリズムに並列処理を追加する方法について。](#parallelism)
5. [低レベルハードウェア設計に向けて:プロセスについて。](#process)
6. [これだけでは足りない?汎用性、オブジェクト指向、メタプログラミングについては?](#advance)
これらのトピックの中で、以下の高レベルな概念がHDLRubyでどのように使用できるかについても説明されます:
* オブジェクト指向プログラミング
* リフレクション
* 汎用性
* メタプログラミング
しかし、さらに進む前に、いくつかの...
## 前提条件
このチュートリアルは、ソフトウェアの人々を対象としているため、プログラミングや関連するツール(エディタ、コンパイラなど)について十分に理解していると仮定されます。ただし、デジタルハードウェア設計に関する知識は必要ありません。また、Rubyプログラミング言語の知識は推奨されますが、必須ではありません。
HDLRubyを使用するには、以下のソフトウェアが必要です。
以下のソフトウェアも推奨されます。
* Ruby言語の配布版。
* テキストエディタ。シンタックスハイライトやその他の高度な機能を好む場合は、Rubyに対応したエディタを選択してください。
* コマンドラインインターフェース(コマンドプロンプト、ターミナルエミュレータなど)。
以下のソフトウェアも推奨されます。
* vcdファイルをサポートするウェーブビューア(例:GTKWave)
## 1. HDLRubyとそのフレームワークの使い方について。
HDLRubyは、Rubyプログラミング言語に基づくハードウェア記述言語(HDL)です。Rubyライブラリとして実装されているため、HDLRubyの記述の中でRubyコードを使用して実行できます。
さらに進む前に、[HDL](#hdl)とは何かを簡単に説明します。その後、[HDLRubyのインストール方法](#install-hdlruby)と、[HDLRubyの使用方法](#use-hdlruby)について詳しく説明します。
### 1.1 ハードウェア記述言語(HDL)とは?
ハードウェア記述言語(HDL)は、電子回路を記述するために使用されるプログラミング言語に似た形式的な言語です。このような回路は、アナログ回路とデジタル回路の2つのカテゴリに分けることができます。アナログ回路を記述するためのHDLも存在しますが、その大部分はデジタル回路のみをサポートしているため、実際にはHDLとはデジタル回路の記述のための言語を指します。複数のHDLがありますが、2つのHDLが事実上の標準となっています。それらはVerilog HDLとVHDLです。
HDLは回路の製造を支援するためにあります。現代においては、HDLの記述から回路を自動的に生成する強力なソフトウェアツールが存在します。ただし、ソフトウェアと同様に、記述に誤りがあったり、最適ではなかったりすると、最終的な回路が機能しないか、いくつかの制約を満たさなくなる可能性があります。残念ながら、ハードウェアでは、回路の製造には非常に時間と費用がかかるため、ソフトウェアとは異なり、エラーまたは低性能の結果を可能な限り早期に回避する必要があります。このため、ハードウェアでは、回路の記述を製造する前に、回路を**シミュレーション**することが一般的です。言い換えると、ソフトウェアでは以下のループを実行することが一般的です。
```
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ │ │ │ │ │
│ write program ├─────►│ compile program ├─────►│ test program │
│ │ │ │ │ │
└──────────────────┘ └──────────────────┘ └────────┬─────────┘
▲ │
│ │
│ ▼
│ ┌──────────────────┐
│ │ │
└───────────────┤ fix program │
│ │
└──────────────────┘
```
ハードウェアの場合、デザインループは以下のようになります:
```
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ │ │ │ │ │
│ write description ├─────►│ simulate description ├─────►│ produce circuit │
│ │ │ │ │ │
└──────────────────────┘ └─────┬────────────────┘ └───────────┬──────────┘
│ ▲ │
│ │ │
▼ │ ▼
┌────────────────┴─────┐ ┌──────────────────────┐
│ │ │ │
│ fix description │◄─────┤ test circuit │
│ │ │ │
└──────────────────────┘ └──────────────────────┘
```
最初に、HDLはCやJavaのような古典的なプログラミング言語と同じような外観と感覚を持っています。式、制御文、および種類の変数を含みます。ただし、計算モデルは根本的に異なり、回路は本質的に並列デバイスであるため、これについてはこのチュートリアルの進行に合わせて徐々に説明されます。今のところ、次のことを覚えておいてください:
* HDLはデジタル回路を記述するために使用され、最も一般的なものはVerilog HDLとVHDLです。
* 合成ツールと呼ばれるソフトウェアツールを使用すると、HDLの記述から実際のデジタル回路を生成できます。ただし、その前にシミュレーションを実行する必要があります。
* HDLは一般的なプログラミング言語のように見えますが、同じように機能しません。
#### それで、HDLRubyについてはどうでしょうか。
HDLRubyは、Verilog HDLやVHDLのようなデジタル回路の記述のためのHDLであり、Rubyプログラミング言語から多くのコンセプトを引き継いでいるため、それらよりも柔軟性と生産性を高めることを目的としています。そのため、HDLについて先に述べたすべてがHDLRubyにも当てはまりますが、設計者がより簡単になるように努めています。
### 1.2. HDLRubyのインストール
HDLRubyはRubyGemsパッケージとして配布されています。したがって、以下のコマンドを使用してインストールできます:
```bash
gem install HDLRuby
```
問題なければ、以下のように表示されます:
```
Fetching HDLRuby-.gem
Building native extensions. This could take a while...
Successfully installed HDLRuby-
Parsing documentation for HDLRuby-
Done installing documentation for HDLRuby after seconds.
```
`version`の数値はHDLRubyの最新バージョンである必要があります。
そして、HDLRubyが正しくインストールされているかどうかは、以下のコマンドで確認することができます:
```bash
hdrcc --version
```
そして、その結果は、こうなるはずです:
```
```
もし結果の version 番号がインストール番号と一致しない場合、どこかで問題が発生した可能性があります。ターミナルまたはコマンドプロンプトを閉じて、新しいものでコマンドを再度実行することをお勧めします。
### 1.3. HDLRubyの使用方法
今まで、HDLRubyは言語であると言いましたが、実際にはデジタル回路の設計とシミュレーションのための完全なフレームワークです。複数のコンパイラ、シミュレータ、ライブラリが含まれており、すべて1つのコマンド hdrcc でアクセスできます。
基本的に、`hdrcc`は以下のように使用する:
```bash
hdrcc