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

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



[第41回]


●USB回路も組み込みました

このところ説明しております7セグメントLED/5X5キーボード回路基板には、PICUSB回路も搭載していることは[第33回]で書きました。
そこではプリント基板の写真と、PIC18F14K50だけは未実装の組立済みの写真もお見せして、PICUSB回路についてはまだ手をつけていません、と書きました。
その後の回で書いてきましたように7セグメントLED表示のところでちょっと手間取ってしまいましたが、それもやっとのことで片付きましたので、手をつけていなかったPICUSB回路を組み込みました。
PICUSB回路はND80Z3.5の回路をそのままEPM7128SLC84に置き換えただけなので、ND80ZモニタプログラムもPIC18F14K50もND80Z3.5と同じで変わるところはありません。
PICUSB回路のCPLD化はすでにEPM7032SLC44を使って実現しています([第21回])。
今回はそのときEPM7032SLC44に組み込んだVHDLプログラムを前回お見せしたEPM7128SLC84のVHDLプログラムにそのまま書き加えるだけですから、作業はとくに問題なくスムーズに行なえました。
下が全体の回路図です。

いままでの回路図は部分でしたが今回は全体の回路図です。
右下にPIC18F14K50回路を追加しています。
ND80Z3.5にはPIC18F14K50を使ったRS232C回路を搭載していますが今回のCPLD基板ではRS232C回路はありません。

下はVHDLプログラムリストです。

--7segx8 and 5x5 key usb interface 19/4/10
-- from ledkeyusb1a
-- 4/11 4/12 4/13 4/15 4/16

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library ARITHMETIC;
use ARITHMETIC.std_logic_arith.all;

entity ledkeyusb1b is
        PORT (
                        KEYOUT:out std_logic_vector(2 downto 0);
                        KEYIN:in std_logic_vector(7 downto 0);
                        AIN:in std_logic_vector(7 downto 0);
                        DINOUT:inout std_logic_vector(7 downto 0);
                        PIC16READ:in std_logic;
                        PIC16AD:in std_logic_vector(1 downto 0);
                        LDATAREADY:out std_logic;
                        LDATAOUT:out std_logic_vector(3 downto 0);
                        --PIC18RC:out std_logic_vector(7 downto 0);
                        --PIC18RB4:out std_logic;
                        --PIC18RB6:out std_logic;
                        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);
                        --
                        USBON:in std_logic;
                        TKND:in std_logic;
                        P25:in std_logic;
                        PIC16RA3:in std_logic;--not used
                        CK12MIN:in std_logic;
                        RESETIN:in std_logic;
                        CK12MOUT:out std_logic;
                        CK12MOUT2:out std_logic;
                        RESETOUT:out std_logic;
                        P21:in std_logic;
                        P52:in std_logic;
                        P65:in std_logic;
                        P67:in std_logic;
                        P69:in std_logic;
                        IOR:in std_logic;
                        IOW:in std_logic);
end ledkeyusb1b;

architecture rtl of ledkeyusb1b is
        signal ldtactiv:std_logic;
        signal readyreset:std_logic;
        signal ldatareadywk:std_logic;
        signal keyoutbf:std_logic_vector(2 downto 0);
        signal keyinbf:std_logic_vector(7 downto 0);
        signal ledadrs:std_logic_vector(2 downto 0);
        signal segment:std_logic_vector(7 downto 0);
        signal rcwk:std_logic;
        signal rcwk2:std_logic_vector(3 downto 0);

begin
        
--ledadrs & segment data set

   process(AIN,IOW)
   begin
        if AIN(7 downto 3)="10001" and IOW='0' then
                ldtactiv<='0';
        else ldtactiv<='1';
        end if;
        end process;
        
        process(ldtactiv)
        begin
        --
        if PIC16READ='0' and PIC16AD="10" then
                ldatareadywk<='1';
        --
        elsif ldtactiv'event and ldtactiv='1' then
                ledadrs<=AIN(2 downto 0);
                segment<=DINOUT;
                ldatareadywk<='0';--
        end if;
        end process;
        
        LDATAREADY<=ldatareadywk;
        
--ledadrs & segment data out

        process(PIC16READ,PIC16AD)
   begin
        if PIC16READ='0' then
        if PIC16AD="00" then
                LDATAOUT<=segment(3 downto 0);
        elsif PIC16AD="01" then 
                LDATAOUT<=segment(7 downto 4);
        elsif PIC16AD="10" then 
                LDATAOUT(2 downto 0)<=ledadrs;
                readyreset<='0';
        else
                LDATAOUT<="1111";
                readyreset<='1';
        end if;
        end if;
        end process;

--key in
    process(AIN,IOW,IOR)
    begin
        if AIN(7 downto 2)="100111" and IOW='0' then
                DINOUT<="ZZZZZZZZ";
                if DINOUT(0)='1' then
                        keyoutbf(0)<='Z';
                elsif DINOUT(0)='0' then
                        keyoutbf(0)<='0';
                end if;
                if DINOUT(1)='1' then
                        keyoutbf(1)<='Z';
                elsif DINOUT(1)='0' then
                        keyoutbf(1)<='0';
                end if;
                if DINOUT(2)='1' then
                        keyoutbf(2)<='Z';
                elsif DINOUT(2)='0' then
                        keyoutbf(2)<='0';
                end if;
        elsif AIN(7 downto 2)="100111" and IOR='0' then
                keyinbf<=KEYIN;
                DINOUT<=keyinbf;
        elsif AIN(7 downto 2)="100101" and IOR='0' then
                DINOUT(7)<=TKND;
--USB PIC to CPU
                if USBON='0' then
                DINOUT(6 downto 4)<=RB6_RC4;
                DINOUT(3 downto 0)<=RC3_RC0;
                end if;
        else
                DINOUT<="ZZZZZZZZ";
        end if;
        end process;
--USB CPU to PIC
        process(IOW)
        begin
                if AIN(7 downto 2)="100110" and IOW='0' then
                        rcwk<=DINOUT(3);
                        RC7_RC5<=DINOUT(2 downto 0);
                elsif AIN(7 downto 2)="100101" and IOW= '0'  then
                        rcwk2<=DINOUT(3 downto 0);
                end if;
    end process;
         
         process(rcwk)
    begin
                if rcwk= '0' then
                        RC3_RC0<=rcwk2;
                else
                        RC3_RC0<="ZZZZ";
                end if;
    end process;
--       
        KEYOUT<=keyoutbf;
        CK12MOUT<=CK12MIN;
        CK12MOUT2<=CK12MIN;
        RESETOUT<=RESETIN;
--      PIC18RB6<=ldtactiv;
--      PIC18RC(2 downto 0)<=ledadrs;
        
end rtl;

前回のプログラムにPICUSBとのIF部分を追加しました。
−−USB PIC to CPU

−−USB CPU to PIC
のところです。
ほんとうに簡単に済んでしまいますねえ。

下は上のプログラムをコンパイルした結果の画面です。


macrocellは48%使っただけで、まだ半分余っています。
7セグメントLED回路にPIC16F57を使った効果は抜群です。
PINはほとんど全部使ったことになっていますが(96%)、実は未使用端子が少しですが残っています。
未使用端子の扱いを簡単にするため入力に指定したうえで回路としてはGNDにつないでいますので、やる気になればまだ回路機能を追加することも可能です。

PIC18F14K50を実装して、ND80ZSMと接続して試運転です。


毎度おなじみの画面ですが、Windows7パソコンにUSB接続してZB3DOSを起動しました。

MBASICを起動して、STARTREKをLOADしたところです。

STARTREKを実行しました。


●ND80ZUSに接続しました

ND80ZUSはND80Z3.5から7セグメントLED回路と5X5キー入力回路を外した基板です。
ND80ZSMとの違いは82C55を実装していることと、PICUSB回路を実装していることです。
今回の7セグメントLED/KEY/USBIFボードを接続すれば、ND80ZUSもND80Z3.5とほぼ同じ機能にすることができます。
ただしPICUSB回路だけは両方の基板がともに実装しているため、そのままではPICUSB回路がぶつかってしまいます。
PIC18F14K50を外しただけではだめで、回路そのものを無効にしなければなりません。
7セグメントLED/KEY/USBIFボードにはそのようにする機能も組み込みました。

下はそのようにしてND80ZUSに接続して動作テスト中の写真です。

PICUSB接続回路はND80ZUSの側を有効にして、7セグメントLED/KEY/USBIFボードの側を無効にしています。

その仕組みはPIC18F14K50の少し上にあるジャンパピン回路です。


SP1の上側をショートするとPICUSB回路がアクティブになり、写真のように外すと無効になります。


この部分はさきほどのVHDLプログラムでは
−−USB PIC to CPU
のところの
if USBON=’0’ then
以下のところになります。

なおSP1の下側のジャンパは、ショートするとND80Zモニタプログラムが選択され、オープンにするとTK80モニタプログラムが選択されるためのスイッチ回路です。
この部分はVHDLプログラムでは
−−USB PIC to CPU
のすぐ上の
elsif AIN(7 downto 2)=”100101” and IOR=’0’ then
のところに対応しています。
この部分はND80Z3.5の同じ回路をCPLD化しています。
ND80Z3.5ではI/Oアドレス94のビット7でDIPSWの状態を読み込んでいます。

CPLD入門![第41回]
2019.5.2upload

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