見出し画像

VHDL初級編            ~VHDL記述の基本フォーマット~

ミンガラバー(Mingalaba)!
“ミンガラバー” はミャンマー語で “こんにちは” という意味です。
私は2020年度にPALTEKに入社したミャンマー出身のシーでございます。

私はミャンマーの大学で、電気やハードウェアの基本を学びました。
ハードウェア記述言語(HDL)の基本も学習しましたが、実際にXilinxのボードを動かしたことはありませんでした。そんな私が社内研修ではじめてHDLを使いXilinxボードでスロットマシンを開発できるようになりました。

このブログでは研修で学んだVHDL記述の基本フォーマット、VHDLやVerilog-HDLについて簡単に紹介させていただきます。いろいろなことを学習中なので至らないところは多いかと思いますが、同じく学習中の方に少しでも役に立てば幸いです。

part1の案内

画像44

画像44

前回は、Library宣言部分とEntity宣言部分を学びました。
ここまでは、回路の外側の箱を用意するイメージとなりますが、今回学習するArchitecture宣言部分で、回路の中身を作ることになります。

Architecture宣言部分は、主に①Component宣言部分、②Signal宣言部分、③回路記述部から成り立ちます。

今回は、②③を学びます。
※①Component宣言部分については、次回以降での説明となります。

画像4

           図 1- Architecture宣言部分


画像5

            図 2- Architecture 文法


Signal宣言部分

画像6

            図 3-Signal宣言部分


Signal宣言

画像7

              図 4-Signal文法


画像8

             図 5-Signal宣言例

※内部ノード信号がレジスタ信号のどちらかになるかはSignal宣言の段階では決まらない。回路記述部での使い方で決める。


画像44

◆信号代入文①

文法

画像15

            図 6-信号代入文法


信号接続は、両辺のビット幅を揃える。

画像12

例1:b <= a;
   ※両辺のビットの幅がそろっている場合、ビット幅を省略できます。

例2:d(3 downto 1) <= c(8 downto 6);

画像13

  結果は、代入した「101」+元々残った1ビット目のデータ「1」、
  「d = 1011」 になります。


◆信号代入文②

 ●信号や演算式を代入する場合、
    例1:dout <= din + 1; (+‘1’/-‘1’の場合のみ、‘’は省略可。)
    例2:C <= not (A and B);

 ● 固定値を直接代入する場合、
   -1bit値はシングル・クォーテーション
    例3:rst <= ‘1’;

   -バス値はダブル・クォーテーション
    例4:din_F <= “000”;
    例5:data__in <= “00000000”;


◆Process 文

画像14

             図7-process文


◆Process 文の書式

文法

画像15

            図 8-process文法


◆センシティビティ・リスト

画像16

         図 9-センシティビティ・リスト

process(------)begin
(------)の部分にセンシティビティ・リストを入力します。
上の例の場合は、「c」は、「a」と「b」に対して変わりますので、
「a」と「b」はセンシティビティ・リストに入力します。


画像43

VHDL設計での演算子の種類

◆VHDL設計での演算子の種類
  1. 論理演算子(and、or、nand、nor、not、xor)
   i. 例:Q <= not A

画像19

  2. 算術演算子(+、-、*、/)
   i. 例:Q <= A+B;

画像20

  3. 関係演算子(=、/=、<、<=、>、>=)
   i. 文法:

画像21

   例:q <= ‘1’ when (a=b) else ‘0’;

画像22

  4. 連接演算子(ビットの結合、&)
   i. 複数の信号を結合し、新しい信号を作成する
    例:D (2 downto 0) <= E & F & G;

画像23


複雑な組み合わせ回路

演算子、if文、case文を使用して記述

- If文
 最初の案件が処理された後、次の案件が実行される。(プライオリティあり)

- Case文
 値の順番に関係なく全て並列に処理がせれる。(プライオリティなし)
 全てのケースを記述しないと文法エラー。
 Others は残り全ての場合という意味。
(othersに“XXX”と記述し、冗長回路を省略)

◆If文の文法

画像24

              図 11-if文法

◆Case文の文法

画像25

              図 12-case文法

◆Case 文の記述例

画像26

            図 13-case文の記述例


組み合わせ回路記述例(1)

エンコーダ(符号器)
  • 情報を特定のルールで符号化する回路
  • 例:数字→Seven Segmentに表示
 (0~9)の数字を表示するためには、Seven Segmentにどこのsegment はonにしてどこにoffにするかを指定する必要があります。よって、エンコードするのは 表示したい信号(0~9)からそれによって Seven segmentにon/off する信号(例:0000001, 1001111, ..)にすることです。

画像27

図 14-Seven Segmentエンコーダ表例

◆エンコーダ記述例

画像28

           図 15-エンコーダ記述表


組み合わせ回路記述例(2)

デコーダ(復号器)
• 特定のルールのもとに符号化された情報を元に戻す回路です。

画像29

       図 16‐Seven Segmentデコーダ表例

デコーダ記述例

画像30

            図 17-デコーダ記述例


組み合わせ回路記述例(3)

セレクタ(マルチプレクサ)
複数の入力信号のうち1つを選択して出力する。

画像31

             図 18-セレクタ


◆セレクタ(マルチプレクサ)記述例

画像32

            図 19-セレクタ記述例


画像33


画像34

作業手順は以下の通りです。

手順1: 新規プロジェクトの作成
1. Vivadoの起動
2. 前回の新規プロジェクト作成手順と同じように新規ファイルを作成しま       す。
2-1. 新規プロジェクト名 : LAB2
2-2. 保存先フォルダ:C:/Home/VHDL(自分で適当にしても構いません)
2-3. 新規ファイル名:decode とします。

手順2:作成した decode.vhdファイルが開かれます。
以下の図の中のコードを記入し、黄色い部分に課題の解答コードを記入して保存します。
※緑色のコードは書かなくてもいいです。

画像35

         図 21-組み合わせ回路演習1/2


画像36

         図 22-組み合わせ回路演習2/2


画像37

ソースコードに文法エラーがある場合、
ソースコードの該当箇所がハイライト表示されたり、赤い波線が引かれたりします。カーソルを合わせると、メッセージがポップアップされます。

テキストエディタの表示で判断できるエラーは、解る範囲で、Vivadoで文法チェック前に修正しておくと効率的です。

画像38

          図 23-ファイルの編集画面

手順1:

RTLのElaborateを実施します。
Open Elaborated Designをクリックします。
確認ダイアログが表示された場合は、OKをクリックします。
文法エラーがある場合、エラーメッセージダイアログが表示されます。OKをクリックします。

画像39

           図 24-Elaborateの実行

手順2:

エラーがあった場合、GUI下部のMessageウインドウに、
ファイル名、行数と共に、エラーメッセージが表示されるので、ソースコードを修正します。

画像40

       図 25-Messageウインドウのエラー表示

手順3:

ソースコードの修正後、ファイル保存します。
ファイルを保存する際、メニューバー : File – Save File Asを選択するか、
又は、 “保存”ボタン をクリックしてください。

画像41

        図 26-Messageウインドウのエラー表示

手順4:

デザインのリロード
ファイルを保存すると、デザインをReloadするか否か、問うメッセージがひょうされるので、Reloadをクリックします。
エラーが表示されたら、ソースコードを修正し、保存します。

画像42

      図 27-Elaborate DesignのReloadメッセージ

手順5:

文法チェックOK
最後的に以下のように赤いエラーが表示されなくなれば、文法チェックOKとなります。

画像43

         図 28-Message ウインドウの表示

青区切り線

作業を振り返って

青区切り線

今回の演習を通じて、組み合わせ回路を作成するときに使える if文とcase文、それぞれの違いが理解できたかと思います。

また、Vivadoで文法チェックする方法も理解できたかと思います。

筆者個人の感想として、気を付けなければならない点は、レジスタ設計なのでループ作成時には直接記述ができず、別の信号をカウンターとして作成してから、そのカウンターに対してループを作成しないといけないことです。

次回の演習(3)は「順序回路」です。

最後までお付き合いいただきありがとうございました!
次回もご覧ください。

facebookストーリー固定用



この記事が気に入ったらサポートをしてみませんか?