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

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



[第43回]


●82C55を追加しました

1ヶ月の1/3がお休みというとんでもない超大型連休も本日で終わりです。
皆様はいかがお過ごしでしたでしょうか。
私はといいますと、何しろ滅多に無い機会ですので真性ワーカーホリックの本領を発揮しまして、業務にまい進しておりました。
おかげでそこそこ成果があげられたと思います。
その成果につきましてはこれから当ブログ風にて少しずつお伝えしていきたいと思います。
しかし。
成果はあがっているのですけれど、それを整理して写真や図版もまじえて書こうとしますと、結構時間がかかって思うように進められません。
相変わらずちまちまと、また休み休みの連載となってしまいます。
気長なお付き合いをお願いいたします。

EPM7128SLC84を使ったPIC7セグメントLED/5X5キー/PICUSBIFボードも前回めでたく完成いたしました。
このボードは近いうちに製品として販売を開始の予定です。
今回はEPM7032SLC44を使ったPICUSBIFボード([第21回])の機能追加について書きます。
同ボードはCPLD回路の小手調べとしてとりあえず作ってみた簡単なボードなので、EPM7032SLC44の端子にもVHDLプログラムにも、そして基板スペースとしても余裕があります。
ちょいと勿体無いと思いましたので、そこに82C55回路を追加してしまいました。
下は回路図です。

回路図の下側半分弱が追加回路ですが、EPM7032SLC44に注目すると、82C55のCS端子への出力を追加しただけです。
EPM7032SLC44としては軽微な追加ということになりますでしょう。

新しく作った基板です。


パーツを実装しました。


ND80ZSMに接続して動作テストをしました。


USB接続したWindows7のコマンドプロンプト画面です。

追加したVHDLプログラムでは、82C55はND80Z3.5と同じようにI/Oアドレス80〜83に割り当てました。
ot、inはZB3BASICのマシン語コマンドです。
otはoutコマンドです。
アドレス83に80をoutして全ポートを出力に設定。
アドレス80(Aポート)に55を出力。
アドレス81(Bポート)にAAを出力。
アドレス82(Cポート)に12を出力しました。
82C55は出力に設定したポートに対してINを実行すると、そのときの出力データがそのまま読み出されます。
アドレス80〜82に対してINを実行した結果、上で出力した値が正しく読み出せました。
もし82C55回路に問題があれば、FFが読み出されたりすることになります。

実際に82C55の出力コネクタにLED回路をつないで出力を確認しました。


LED表示回路の部分をアップしました。

このテストボードは随分長い間使っていますので、アクリル板が傷だらけです。
出力にLEDのカソードをつないでいますから、Hのとき消灯、Lのとき点灯します。
上からAポート、Bポート、Cポート、左がビット7、右がビット0です。

VHDLプログラムです。

 --picusb interface
--19/1/27 1/28 2/21 2/28
--5/3 82c55

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);
                        PPICS:out std_logic;
                        P41:out std_logic;--not used
                        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';
                        elsif Ain="100000" then
                                        PPICS<='0';
                        else 
                                s98out<='1';
                                s94out<='1';
                                s94in<='1';
                                PPICS<='1';
                        end if;
        end process;

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

82C55のCSのために追加したのは、
elsif Ain=”100000” then PPICS<=’0’;
とその下のelseの中の
PPICS<=’1’;
だけです。
下は上のように直したプログラムを再コンパイルした結果の画面です。


82C55のCS信号を追加しただけですから、macrocellにはまだ余裕があります。
この基板も製品化するつもりです。
余っているmacrocellを使ってユーザーとしての独自回路を追加するなどの応用としての用途にも使えそうです。

CPLD入門![第43回]
2019.5.6upload

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