2019.2.22
前へ
次へ
ホームページトップへ戻る

[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第11回]


●VHDLプログラム(2)

前回はPICUSBIF回路をCPLDに置き換えるためのVHDLプログラムを見ていただきました。
今回は私自身の学習ノートを兼ねてプログラムの中身について説明を加えてみます。

まずは最初の部分です。

--picusb interface
--19/1/27 1/28 2/21

library IEEE;
use IEEE.std_logic_1164.all;
記述する文字は半角英数(および記号)です。
大文字と小文字は区別しないので目的によって自由に使い分けることができます。

最初の2行はコメント行です。
行の先頭に−−(マイナス、ハイフォン)を2つ続けて書くとコメント行になります。

次の2行はライブラリーパッケージの呼び出しの宣言です。
C言語のinclude文のようなものです。
パッケージには色々なものがあるようですが、普通の簡単なロジック回路ならばこれだけを書いておけばよいようです。
なおコメント行以外の通常の文は;(セミコロン)で終ります。
前回のリストではほかにも余計なパッケージを書いていましたので削除しました。

次はエンティテイの記述です。
entityとは実体とか物という意味のようです。
ここで記述しているプログラムファイル名を指定して、入出力端子を定義します。

entity picusb is
        PORT (
                        Ain:in std_logic_vector(7 downto 2);
                        Dinout:inout std_logic_vector(6 downto 0);
                        RC3_RC0:inout std_logic_vector(3 downto 0);
                        RB6_RC4:in std_logic_vector(2 downto 0);
                        RC7_RC5:out std_logic_vector(2 downto 0);
                        IOWR:in std_logic;
                        IORD:in std_logic);

end picusb;
 

実際に使用するCPLDの外部端子に名前をつけて、入力端子か出力端子か入出力兼用端子かを定義します。
ここではAin、Dinout、IOWRのように大文字を使っていますが、このほうが分かり易いと思ってそうしただけで、全部小文字でもつけ方は自由です。
:(コロン)までが端子名でそのうしろに in (入力)、inout (入出力) out (出力)の区別を書き、そのうしろには単独信号端子ならばstd_logic、データバスやアドレスバスなどのように複数の信号をまとめて扱う信号端子ならばstd_logic_vector(7 downto 0)のように記述します。
7 downto 0 はD7〜D0のように並んだ信号を意味します。
今回のプログラムでは並びに意味はありませんが、たとえばカウンタなどの記述では大きい数字が上位で小さい数字が下位のビットを示すことになります。
うっかりするとつい忘れてしまうのですが、最後の行は
);
にしないとコンパイルエラーになります。


次はいよいよ回路の記述です。
architecture rtl of ファイル名 is
ではじまって
end rtl;
で終ります。
rtlとはなんじゃい?ということなのですが、ここはなんじゃもんじゃな名前でもよいようです。
ただ一般的には慣習としてrtlまたはRTLを使うようです。
学校の答案などで、ここになんじゃもんじゃな名前を書いたりすると、先生にしかられてしまうかもしれません。

そのarchitectureの最初のところでは、CPLDの内部で一時的に使う信号名を定義します。

architecture rtl of picusb is

        signal rcwk:std_logic_vector(3 downto 0);
        signal rcwk2:std_logic_vector(3 downto 0);
        signal s98out:std_logic;
        signal s94out:std_logic;
        signal s94in:std_logic;
 

記述のルールは先ほどの端子名と似ていますが、内部で使う信号なので入出力の区別がありません。
ひとつの回路の出口に使えば出力ですが、それを別の回路の入力に使うこともできます。
入出力の定義はありませんが、その代わりに信号名の前に signal と表記します。
この内部信号は重要な役を果たします。
VHDLの約束事として、出力端子から入力することはできません。
たとえば2つの入力信号のANDの結果をある端子に出力するとともに、その同じ出力信号を別のロジック回路の入力として使うことは許されません。
しかしそのような回路はごく普通に出てきます。
そのようなときにsignalを使います。
2つの入力信号のANDの結果を内部的なsignalに一旦出力し、そのsignalを出力端子に出力します。
signalは入力にも出力にも使えますから、その同じsignalを別のロジック回路の入力として使うようにします。

本日も時間がなくなってしまいました。
次回に続きます。
次回はいよいよロジック回路そのものの記述に入ります。

CPLD入門![第11回]
2019.2.22upload

前へ
次へ
ホームページトップへ戻る