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

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



[第10回]


●VHDLプログラム

前回の回路図に、EPM7032SLC44に含まれていない部分があることに気が付きましたので修正するとともに、下に再掲いたします。

CPLDに回路を書き込むための記述言語としては、VHDLを使うことが一般的なようです。
VHDLは5年ほど前に初めて使うことになって短期速習して以来です。
もうすっかり忘れてしまっていましたから思い出すのにちょっと苦労しました。
ハードウェア回路ならば回路図通りにTTLなどを配置して各端子間を線でつないでハンダ付けすれば、回路さえ間違ってなくて、配線も間違ってなければ期待した通りに大抵は動いてくれます。
しかしCPLDは設計した回路をVHDLというプログラム言語で記述しなければ期待した通りには動いてくれません。
しかし有難いことにVHDLはそれほど難しい言語ではありません。
確かに特有の記述をする部分もありますが、CやBASICにある程度慣れた方でしたら理解することは難しくないと思います。
C++などでもそうですがやたら難しいコマンドとか機能とかがあって、そんなものを理解しようとすると入口の部分で疲れてしまつて結局使いこなすことはできません。
VHDLも使ったり理解するのに難しい機能が沢山あるようですが、そんなものは無理して覚える必要はありません。
平易なプログラムを書くことに徹しましょう。
ということで、上の破線部分の回路をVHDLで書いてみたのが下のプログラムです。

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

library IEEE;
use IEEE.std_logic_1164.all;
--use IEEE.std_logic_arith.all;

entity picusb is
        PORT (
                        Ain:in std_logic_vector(7 downto 2);
                        Ckin:in std_logic;--not used
                        Ain1:in std_logic;--not used
                        Ain0:in std_logic;--not used
                        Din7:in std_logic;--not used
                        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;

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;

begin
    process(s98out,Dinout,rcwk)
    begin
                if s98out'event and s98out= '1' then
                        rcwk<=Dinout(3 downto 0);
                else
                        rcwk<=rcwk;
                end if;
    end process;

        process(s94out,Dinout,rcwk2)
        begin
                if s94out'event and s94out= '1' then
                        rcwk2<=Dinout(3 downto 0);
                else
                        rcwk2<=rcwk2;
                end if;
    end process;
         
         process(rcwk(3),rcwk2)
    begin
                if rcwk(3)= '0' then
                        RC3_RC0<=rcwk2;
                else
                        RC3_RC0<="ZZZZ";
                end if;
    end process;

    process(s94in,Dinout,RB6_RC4,RC3_RC0)
    begin
                if s94in= '0' then
                        Dinout(6 downto 4)<=RB6_RC4;
                        Dinout(3 downto 0)<=RC3_RC0;
                else
                        Dinout<="ZZZZZZZ";
                end if;
    end process;

        process(IOWR,IORD,Ain)
        begin
                        if Ain="100110" and IOWR='0' then
                                s98out<='0';
                        elsif Ain="100101" and IOWR='0' then
                                        s94out<='0';
                        elsif Ain="100101" and IORD='0' then
                                        s94in<='0';
                        else 
                                s98out<='1';
                                s94out<='1';
                                s94in<='1';
                        end if;
        end process;

        RC7_RC5<=rcwk(2 downto 0);
        
end rtl;

なんだかわからんぞう、というようなものですが、定型文といいますか、いつもそのように決った書き方をすればよい、という部分もありますから、そういうところはスルーしてしまってもよいと思います。
最初の数行がそれです。
そのあとentityのところで端子信号を定義しています。
その下ではCPLD内部で使う信号を定義しています。
このあたりはC言語のニュアンスに似ていると思います。
そのあとのprocessのところで信号の動作を記述しています。
回路図とprocess文とを比べて見ているとなんとなくこの部分はこの回路のことか、ということがわかってきませんでしょうか。

本日も時間がなくなってしまいました。
次回にもう少し詳しく説明いたします。

CPLD入門![第10回]
2019.2.21upload
2019.2.28プログラムリストを一部訂正しました([第14回]参照)

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