第1

章 ソフトウェアとハードウェアの関係を理解する

1
2

ハードウェア・プログラミングを始める第一歩

3
App
1

1.1

4

もし○○なプログラムが書けたなら…

ソフトウェアの設計をしていて，こんな思いをしたことはありませんか？など，ソフトウェアではあと一息痒いところに手が届かず，歯痒い思いをしたことはないでしょう

たくさんのスレッドを，並列に低コストで実行できたらいいのになぁ
361 ビットの演算を，一発でできたらすっきり書けるのになぁ
グラフィクスの特別な命令が使えると， 処理を高速化できるのになぁ
100 個ほど入出力があれば，モータやセンサをたくさんつなげられるのになぁ
このシステム，乾電池 1 本で動作しないかなぁ

5か．

6● プログラムはプロセッサに束縛されているパソコンはもちろんのこと，今やテレビや携帯電話， 自動車などのあらゆる製品の中でソフトウェアが動作しています．それらのソフトウェア

Appは，実現したいアプリケーションや動作させる環

2境に応じて，さまざまなプログラミング言語で記述されています． 例えば，JavaScript は Web ア
プリケーションを便利で華やかにしてくれますし，

プログラマ
プログラム

プログラムはプログラマの自由に書けると思いきや…
実は自由の中に隠された制約が〜！

7
8
9

コンパイラ

ソフトウェア階層で隠ぺいされている

OS
プロセッサ 制約

図 1.1

10

ライブラリ

実はココに隠された制約がある

App
3

プログラムはさまざまな処理を自由に書けるが，実はハードウェアの制限がある

11

第2

章 Hello World 表示や標準入出力の基本プログラムを書く

1
2

HDL だって，ふつうのプログラミング言語

3
App
1

まずは，ふつうのプログラミング言語のようにまずは，この擬似的な動作で，プログラミング

4

言語としての HDL に慣れてみましょう．ここでHDL を使ってみましょう．
HDL は， ハードウェアを設計するための言語ですが，ハードウェアの動作をパソコンの上で擬は，Verilog HDL というハードウェア記述言語を使います．

5

似的に動作させることができます．

2.1

6

プログラミングは Hello World から始まる
Cygwin を使って自分でビルドしたり，コンパイ● プログラミング環境の準備
多くのソフトウェア・プログラミングの処理系

ル済みバイナリをダウンロードしてインストール

Appと同じように，Verilog HDL の処理系にも有償のすることができます．詳しいインストール方法は，

2

ものや無償のものなどのさまざまなものがありま

Appendix 1 を参照してください．

す．ここでは，Icarus Verilog というコマンドライン・ベースで使う Verilog HDL 処理系（VerilogHDL を実行できる環境）を使用します．

7● Hello World プログラムの作成
それでは，Verilog HDL のプログラミングを始Icarus Verilog は，オープン・ソースの Verilogめてみましょう．まず，多くのプログラミング言語HDL 処理系で，Windows，Linux，MacOS X なの教科書にならって，最初は Hello World からどの幅広い環境で使うことができます．Linux や始めます．リスト 2.1 が，Verilog HDL で記述しMacOS X であればパッケージ・システムを使った Hello Verilog World をコンソールに表示すて簡単にインストールでき，Windows であればるソース・コードです．

好きなエディタでHDLコードを書く図 2.1

Verilog HDL
ソース・コード
hello.ViVerilogでコンパイルする

vvpコマンド・ファイルa.out

シミュレータvvpで実行

8910

実行結果
ターミナル

hello WorldApp
3

HDL コードを Icarus Verilog を使ってコンパイルし実行するまでの流れは，C 言語の場合と同じ！

19

3

第章

HDL だから記述できる並列処理にチャレンジ！

1
2

画像ファイル解析プログラムを作成しよう！

3
App
1

本章では第 2 章での基本プログラムを応用して，4入力された少し複雑なデータを解析する例として，画像ファイルの解析を考えてみましょう．
ここでは，24 ビットのビットマップ画像（レナ5画像，図 3.1）を読み込み，カラー画像からグレースケール画像に変換する HDL プログラムを作成6します．
そして， ハードウェア記述言語 Verilog HDL
だから可能な並列処理の記述方法について解説します．
なお，入力に使用した画像は図 3.1 に示したオApp
2

リジナルのレナ画像（512×512）を 256×256 のサイズに縮小したファイルです．

図 3.1

7

256×256 のサイズに縮小した「レナ画像」

ファイル名は lenna.bmp とした．実際はカラー画像．

画像データ・ファイルを表示する
OS/2 ビットマップ形式がありますが，ここではビットマップ・ファイルの形式

Windows ビットマップ形式のみを扱うことにしビットマップ・ ファイルは，Windows でよくます．Windows ビットマップ形式のファイル形

使われている無圧縮の画像ファイル形式の一つで式を図 3.2 に示します．

す．ヘッダ領域とデータ領域から構成され，ヘッ▼● 画像解析の準備▼3.1

8

ダ領域の情報によって，いくつかの形式のデータを扱うことができます．
大きく分けて，Windows ビットマップ形式と910

解析の基本方針

画像データを解析するには，まず，ファイルを読み込まなければいけません．ここで，ファイルを読み込みながら解析をする方法と，全部読み込

25

App
3

第4章

ハードウェアをプログラムする基本ルールを習得する

1
2

VHDL と Verilog HDL の基礎概念と文法

3App1

普段コミュニケーションで使用する日本語や英4かり押さえておきましょう．

語といった自然言語でも，C 言語や Java のよう

本章では， ハードウェア記述言語（HDL）の中なプログラミング言語でも，正しく使用するためで， よく使用されている VHDL と Verilog HDLには文法の知識が欠かせません． 同じように，の二つを対比しながら基本文法を説明します．両ハードウェアを設計する際には HDL の文法の知者のちょっとした違いを発見しながら読み進める識が必要です． ここで，HDL の基本文法をしっと面白いでしょう．

4.1

5
6

ハードウェア記述言語の基本概念

プログラミング言語に多くの種類があるように，ハードウェア記述言語（HDL）にもさまざまな種● 構造の基本 ―― エンティティ / モジュール
どの言語にも基本的な構造があります．例えば，類があります．その中でもよく利用されているのC 言 語 で は 関 数，Java で は ク ラ ス な ど で す．

が，VHDL 注 1 と Verilog HDL 注 2 です（図 4.1）．

HDL では， 与えられた入力に対して出力を生成

VHDL と Verilog HDL は，どちらもハードウェするブロックが基本的な単位となります（図 4.2）．

アを表現する似たような概念を取り扱うことがで

こ の ブ ロック を VHDL で は エ ン ティティ，きる言語です．ただし，似たような概念であってVerilog HDL ではモジュールと呼びます．

も，それぞれの言語で使用する言葉が違うので注意が必要です．
そこで，両方の言語に共通する概念と，言語の特徴について説明します．

通常のプログラミング言語と HDL の大きな違App2

78

いは，エンティティ / モジュールは，最初から最後まで与えられた入力に対する出力を生成し続けるということです．C 言語などで関数を呼び出す
場合は，main プログラムからその関数内へ処理

注 1：VHDL（VHSIC Hardware Description Language）は，1970 年代後半から 1980 年代前半にかけて，米国国防総省がVHSIC（Very High Speed Integrated Circuit）プロジェクトの一環として，部品の納入業者に対し ASIC の仕様書を統一させることを目的として開発された．言語仕様は，Ada の影響を受けている．1987 年に IEEE の標準規格となり，現在の最新版は IEEE1076 ‑ 2008 である．
注 2：Verilog HDL は，1984 年に米国 Gateway Design Automation 社の Phil Moorby によって，ディジタル回路を設計するための言語およびシミュレータとして開発された．言語仕様は，C 言語や Pascal の影響を受けている．1995 年に IEEE の標準規格となり，現在の最新版は IEEE1364 ‑ 2005 である．

45910App
3

第5章 ハードウェア・プログラミング的な「Hello World！」で始める

1
2

Xilinx&Altera のFPGA 開発ツールの使い方

3
App
1

本章では，実際に FPGA を使って「モノ」を作世界を橋渡しする方法を説明していきます．いよる手順を習得しましょう． パソコン上での HDL

いよ FPGA を使った論理回路設計の開発へ一歩記述によるバーチャルなハードウェア設計と現実を踏み出しましょう．

5.1

45

FPGA 評価ボードを用意しよう

HDL で記述したコードを実際に「モノ」としてFPGA ボードを使用して， 実際の開発手順を説動かすためには，HDL のソース・ コードを合成明します． 使用するボードは Xilinx 社の FPGA6して FPGA に書き込むのですが， それだけではを搭載した Avnet 社の MicroBoard（写真 5.1）と，不十分です．FPGA を動作させるには， 電源やAltera 社の FPGA を搭載した Terasic 社の DE0‑Appクロックを供給する必要があります．パソコンでNano（写真 5.2）です（入手方法は，Appendix 32いうところのマザー・ボードに相当するものが必を参照）．第 4 章で HDL ソース・コードの文法に要です．

ついて説明しましたが，それに基づいて，FPGA

そこで本章では，FPGA の 2 大メーカの定番開発の雰囲気を味わってみましょう．

USB
PMOD 端子USB

78

FPGA Cyclone Ⅳ

Ethernet

910
FPGA Spartan-6

写真 5.1 Xilinx 社の FPGA Spartan6 を搭載した Avnet 社の MicroBoard

写真 5.2 Altera 社の FPGA Cyclone IV を搭載した Terasic社の DE0‑Nano

61

App
3

第6章 ハードウェア設計を意識した回路シミュレーションを体験しよう！

12

シミュレータ ISim，ModelSim の使い方

3App
1

本章では，Windows 上で動作するシミュレーるための周辺回路（電源やクロック回路など）のタを使って，HDL で設計したモジュールの動作ハードウェアを用意する必要がないので，ハードを確認する方法を修得しましょう．シミュレータ

ウェアを用意することに抵抗を感じる人でも気軽を利用すると，FPGA 本体や FPGA を動作させに試すことができます．

6.1

FPGA がなくても HDL モジュールの動作を確認できる

第 5 章では，開発ターゲットとして MicroBoardを使ったハードウェアのシミュレーションをすると DE0‑Nano の FPGA 評 価 ボード を 使 用 し，ためには， 使用するデバイスをサポートするシFPGA の開発を始める手順を紹介しました． とミュレータを選択する必要があります．

はいえ， 実際には手元に FPGA のハードウェア

ISim は，Xilinx 社の ISE WebPACK をインス環境を用意していない読者も多いことでしょう．

トールするときに一緒にインストールされます．

ここでは，手軽に HDL でハードウェア設計の雰

ModelSim は，Altera 社の開発環境 Quartus Ⅱの囲気を試せるシミュレータの使い方を紹介します．

インストール時に選択するか，Altera 社の Web

第 2 章と第 3 章では， プログラミング言語とサイトから別途ダウンロードしてインストールししての HDL を紹介する目的で，ハードウェアの概念をほとんど意識することのない例を紹介しまインストールの手順は， 一般的な Windows ア
プリケーションと同様にインストーラの指示に従アの設計」をパソコン上で試すことができるか，うだけです．詳しいインストール方法は，Appendixに焦点を当てます．

2 を参照してください． 本章では，ISim と Model
Sim で HDL コードをシミュレーションする手順

6App2789を紹介します．

Xilinx 社 の FPGA ユーザ は ISE WebPACK に付属している「ISim」を，Altera 社の FPGA ユー

5ます．

した．逆に本章では，いかに HDL で「ハードウェ● 無償のシミュレータを使う

410● ISim や ModelSim でできること

ザは「ModelSim」を無償で利用できます．基本的第 2 章で紹介した Icarus Verilog では，コマンな HDL コードの動作をシミュレーションするだ

ドラインから HDL ソース・コードをコンパイル

けなら，どちらのシミュレータでも大差ありませ実行して，普通のプログラミング言語処理系のよん．ただし，それぞれのデバイスに特化した機能うに使うことができました．

81App3

第7章 カウンタ，算術演算，マルチプレクサ，7 セグメントLED，乱数生成器，シリアル送受信モジュール

12

コピペできる！ VHDL/Verilog
HDL の基本プログラム集

3App1

新しいプログラミング言語を習得するには，さビットの数え上げ演算器，7 セグメント LED のまざまなサンプル・プログラムを見て実際に動か点灯制御，乱数生成器，シリアル送受信モジュー

したり，コピー＆ペーストで自分のプログラムにルを VHDL と Verilog HDL の両方で記述する例

移植してみたりするのが早道でしょう． それはを紹介します．

HDL の場合も同じです．
本 章 で は，HDL コード で 記 述 す る 基 本 的 なハードウェア・ モジュールとして， カウンタ，7.1

カウンタは，基本的なハードウェア・モジュー

どの記述例も，第 6 章で説明した手順でシミュ6してみてください．

Appいる counter です． カウンタの幅は， パラメーりに応じて内部の変数をカウントすることで処理2タで指定できるようになっています．部の変数をインクリメント（1 ずつ値を増加）します．例えば，クロックを入力信号として立ち上が5レーションができます．是非，手元で動作を確認

基本的なハードウェア① ―― カウンタルの一つです．入力された信号の変化に応じて内47● カウンタの処理内容
リセット信号が入力されたらカウンタ値をクリのタイミングを遅らせるためのウェイトを作った

アし，それ以外のときはクロックが立ち上がるタり，定期的に特定の処理を行うためのフラグにしイミングで，counter 変数の値を一つずつ増加さたりといった使い方が考えられます．

せます．この処理を，if 文を使用して記述します．

8VHDL と Verilog HDL で記述したカウンタのソース・コードを，リスト 7.1 に示します．

● シミュレーション結果
この動作をリスト 7.2 に示すテストベンチを● モジュールの外枠と必要な変数の定義使ってシミュレーションしてみます．シミュレー

カウンタ・モジュールの外枠は，カウントの対象となる入力信号（例えば，クロック信号）pCLKションすると，図 7.1 に示すような波形が表示さと，カウンタを初期値にセットする信号 pReset，そしてカウンタ値の出力信号 Q で定義できます．

に相当します．クロック信号が立ち上がるたびに，カ ウ ン ト し た 値 は，VHDL で は signal，れます．矢印の区間がちょうどカウンタの 1 周期モジュールの出力がカウントアップされていることを確認できます．

910App3Verilog HDL では reg 型の変数として定義されて115

第8章 ステート・マシン，モジュール化，階層設計，IP コアの活用で効率的な設計を見指す

1
2

大規模ハードウェア・プログラミングに挑戦する

3
App
1

ソフトウェア・プログラミングでは，既存の資産の有効活用や再利用性を高めることが求められルの再利用などにより，記述やデバッグの負荷を削減できます．

ます．また，よくあるパターンを定型化すること

そこで本章では，決められた手順で処理を実行により，きれいな記述を目指します．これらの取するモジュールを設計するときに有効となるスり組みにより，ソフトウェアを記述する時間やデテート・マシンや，すでに実装したモジュールをバッグ時間を削減できます．

サブモジュールとして利用する方法，そして既存同じように，HDL によるハードウェア・ プログラミングでも，データ構造の抽象化やモジュー8.1の IP コアを活用して設計を楽にする手法などに

5
6

ついて解説します．

App

ステート・マシンを実装する

まず，ハードウェア・プログラミングにおいて，42んあります．例えば，そうめんを茹でるとき，鍋逐次的に処理するために必要不可欠な概念であるの水がまだ湯になる前に並行してそうめんを鍋にステート・マシンと，その実装方法について説明

入れても，とても食べられるものにはなりません．

7

します．
ハードウェアでは処理を並列に実行できますが，世の中には順番にしか実行できない物事もたくさ● 料理は逐次的な処理何かを実行し，その次に何かを実行し，その次89①鍋に水を入れる②鍋を火にかける沸いた④そうめんを③湯が沸いた
入れるか確認

まだ沸いていない

図 8.1

10

やわらかい

1分
⑤時間を計る⑥やわらかいか確認

1分未満

固い

⑦できあがりApp3そうめんを茹でる手順をステート・マシンで表すと147

第9章 製作事例で学ぶ①

小さなモジュールを組み合わせて並列処理する方法

1
2

オセロ・ゲームをFPGA に実装しよう

3App
1て，FPGA を使用したシステムを開発する過程

HDL を用いたハードウェアの開発では， ソフを解説します．

トウェアの開発と同じように小さな回路モジュー

また， この製作を通して，FPGA の特徴といルを組み合わせることにより，大規模な回路を作える並列処理により，処理を高速化できることを成していきます．

5

体験してみてください．

そこで本章では，オセロ・ゲームの作成を通じ

9.1

46

今回作成するオセロ・ゲームの仕様

オセロ 注 1 は，2 人のプレーヤが白と黒の石をア ル 通 信 を 利 用 す る こ と に し ま す． 例 え ば，交互に打ち，ゲーム終了時の石の数を競うゲーム

Windows の TeraTerm などのターミナル・ ソフ

Appです．

トを使用して，パソコンの画面にゲームを表示さ2

ここでは，FPGA とパソコンによりシステムせて遊ぶことができます． 最近は， シリアル・を構成します（図 9.1）．FPGA には，ゲーム全般

ポートのないパソコンが多くなりましたが，USBの処理（ゲーム盤の表示や石が挟まれたときの処で接続するシリアル通信用アダプタや IC もあり理など）， 対戦するコンピュータ側の処理（乱数ますから，回路の実用性は十分です．
本 章 で は，Xilinx 社 の FPGA Spartan‑6を用いて次の手を決定する処理），パソコンと通（XC6SLX9‑2CSG324C）を搭載した FPGA ボード信する処理を実装します．

7

パソコンとの通信には，第 7 章で紹介したシリ

8

MicroBoard と Altera 社 の FPGA Cyclone IV

9FPGA

図 9.1

シリアル-USB
変換器

仮想COM
ドライバ（注）

注：仮想COMドライバは，USBで接続されたデバイスが，あたかもシリアル・ポートで接続されているかのようにアプリケーションに見せることができる

FPGA とパソコンでオセロ・ゲームを構成する

10App
3

注 1：オセロはメガハウスの登録商標である．世界的にはリバーシと呼ばれている．

169

第10章 製作事例で学ぶ②

画像処理を専用ハードウェア化する方法

1
2

画像のグレースケール処理をFPGA で 動かしてみよう

3
App
1

第 3 章では，Verilog HDL を普通のプログラミ

レースケール処理を題材にして， 実際に FPGAング言語として使うことにより，画像のグレースに実装可能なハードウェアとして設計し直してみケール処理を記述しました． 本章では， 同じグましょう．

10.1

4
5

ソフトウェア実装とハードウェア実装の違い

6

第 3 章では，Verilog HDL という言語に触れてソースをあっという間に喰いつぶしてしまいます．

もらうことを主眼にしたため， 実際に FPGA 上論理回路や信号遅延を考慮しなければならないとに回路を合成し，ハードウェアとして動作させるいう点については，これまでの章でも触れてきまために考慮すべき事由が欠けていました．そのたしたが，今回考えるハードウェアではさらにメモApp

め，設計を変更する必要があります．パソコン上リの使用量についても考える必要があります．

2のシミュレーションではなく， 実際の FPGA 上で動作させるには，（1）標準入力や標準出力といった手軽なパソコンの I/O が使えない．
（2）データの最後の判別に EOF のような便利なマークは使えない．

● メモリのサイズは有限 !!
第 3 章の例では，ビットマップ・ファイルを扱うために，
reg [7:0] data[2**20-1:0];// サイズ 2 20 の 8 ビット幅のデータ配列（3）FPGA の持つハードウェア・リソースに収と，あまり深く考えずに 1M バイトのメモリを確まるような回路にしなければならない．

保しています． しかし，MicroBoard に搭載されという課題があります．

ている Spartan‑6 XC6SLX9 や DE0‑Nano に搭載（1）は，標準入出力の代わりに第 9 章でも利用されている Cyclone IV EP4CE22F17C6N 上では，したシリアル通信を使うことで解決できそうです．

そんなに多くのメモリを使うことができません．

（2）は，ファイル・サイズを何らかの方法でハーメモリとして利用できるブロック RAM のサイドウェアに伝えることで解決できます．今回は，ズは，それぞれ 64K バイト程度です．1M バイト

ビットマップ・ファイルのフィールドにある，格の容量を確保することは到底できません．

納ファイル・サイズを使うことにします（詳細は後述）．
問題は（3）です． 何も考えないと FPGA のリ

7

したがって，8910App（1）より大きな FPGA を利用する．

3（2）扱う画像サイズを小さくする．

195

このPDFは，CQ出版社発売の「インターフェースZERO No.04」の内容・購内容
購法部

本です．法などにつきましては以下のホームページをご覧下さい．
http://shop.cqpub.co.jp/hanbai/books/MIF/MIFZ201301.htm
http://www.cqpub.co.jp/order.htm