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

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



[第74回]


●VHDLサンプルプログラム1 82C55(7) プログラムリストを再掲

CPLD版82C55のVHDLプログラムは[第69回]でお見せしましたが、説明を進めていく過程で、プログラムの記述の順序が説明の流れに合っていないことがちょっと気になりましたので、プログラムの順序を説明した順に整理し直しました

--cpld training i/o interface 82c55
--19/5/25 5/26 6/14 6/15 6/16 6/18 6/19

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

entity trngio1d is
        PORT (
                        LEDOUT:out std_logic_vector(3 downto 0);
                        ADRSIN:in std_logic_vector(7 downto 0);
                        DINOUT:inout std_logic_vector(7 downto 0);
                        PA:inout std_logic_vector(7 downto 0);
                        PB:inout std_logic_vector(7 downto 0);
                        PCL:inout std_logic_vector(3 downto 0);
                        PCH:inout std_logic_vector(3 downto 0);
                        IOR:in std_logic;
                        IOW:in std_logic);
end trngio1d;

architecture rtl of trngio1d is

        signal ainout:std_logic;
        signal binout:std_logic;
        signal clinout:std_logic;
        signal chinout:std_logic;
        signal paout:std_logic_vector(7 downto 0);
        signal pbout:std_logic_vector(7 downto 0);
        signal pclout:std_logic_vector(3 downto 0);
        signal pchout:std_logic_vector(3 downto 0);
--
begin
        LEDOUT<="0000";
--82c55 address F0,F1,F2,F3
-- in out set
process(IOW)
begin
        if IOW='0' then
                if ADRSIN="11110011" and DINOUT(7 downto 5)="100" and DINOUT(2)='0' then
                        clinout<=DINOUT(0);-- '0' out,'1' in
                        binout<=DINOUT(1);
                        chinout<=DINOUT(3);
                        ainout<=DINOUT(4);
                end if;
        end if;
end process;
--
--out data PORTA,PORTB
process(IOW)
begin
        if IOW='0' then
                if ADRSIN="11110000" and ainout='0' then
                        paout<=DINOUT;
                elsif ADRSIN="11110001" and binout='0' then
                        pbout<=DINOUT;
                end if; 
        end if;
end process;
--
--portA out
process(ainout,paout)
begin
        if ainout='0' then
                PA<=paout;
        else
                PA<="ZZZZZZZZ";
        end if;
end process;
--portB out
process(binout,pbout)
begin
        if binout='0' then
                PB<=pbout;
        else
                PB<="ZZZZZZZZ";
                
        end if;
end process;
--
-- out data PORTC
process(IOW)
begin
        if IOW='0' then
                if ADRSIN="11110010" then
                        if chinout='0' then
                                pchout<=DINOUT(7 downto 4);
                        end if;
                        if clinout='0' then
                                pclout<=DINOUT(3 downto 0);
                        end if;
        -- bit out
                elsif ADRSIN="11110011" and DINOUT(7)='0' then
                        if clinout='0' then
                                if DINOUT(3 downto 1)="000" then
                                        pclout(0)<=DINOUT(0);
                                elsif DINOUT(3 downto 1)="001" then
                                        pclout(1)<=DINOUT(0);
                                elsif DINOUT(3 downto 1)="010" then
                                        pclout(2)<=DINOUT(0);
                                elsif DINOUT(3 downto 1)="011" then
                                        pclout(3)<=DINOUT(0);
                                end if;
                        end if;
                        if chinout='0' then
                                if DINOUT(3 downto 1)="100" then
                                        pchout(0)<=DINOUT(0);
                                elsif DINOUT(3 downto 1)="101" then
                                        pchout(1)<=DINOUT(0);
                                elsif DINOUT(3 downto 1)="110" then
                                        pchout(2)<=DINOUT(0);
                                elsif DINOUT(3 downto 1)="111" then
                                        pchout(3)<=DINOUT(0);
                                end if;
                        end if;
                end if;
        end if;
end process;
--
--portCL out
process(clinout,pclout)
begin
        if clinout='0' then
                PCL<=pclout;
        else
                PCL<="ZZZZ";
        end if;
end process;
--portCH out
process(chinout,pchout)
begin
        if chinout='0' then
                PCH<=pchout;
        else
                PCH<="ZZZZ";            
        end if;
end process;
--
--in data from port
process(IOR)
begin
        if IOR='0' then
                if ADRSIN="11110000" then
                        if ainout='1' then
                                DINOUT<=PA;
                        else
                                DINOUT<=paout;
                        end if;
                elsif ADRSIN="11110001" then
                        if binout='1' then
                                DINOUT<=PB;
                        else
                                DINOUT<=pbout;
                        end if;
                elsif ADRSIN="11110010" then
                        if chinout='1' then
                                DINOUT(7 downto 4)<=PCH;
                        else
                                DINOUT(7 downto 4)<=pchout;
                        end if;
                        if clinout='1' then
                                DINOUT(3 downto 0)<=PCL;
                        else
                                DINOUT(3 downto 0)<=pclout;
                        end if;
                else
                        DINOUT<="ZZZZZZZZ";
                end if;
        else
                DINOUT<="ZZZZZZZZ";
        end if;
end process;
--
end rtl;


プログラムの先頭の部分で
LEDOUT<=”0000”;
を追加しました。
LEDOUTは7セグメントLEDのコモンドライバです。
82C55プログラムでは7セグメントLEDは使いません。
ただテストの過程で7セグメントLEDにゴミが表示されることがありましたので、7セグメントLEDの表示をオフにする文を付け加えました。

●コンパイルレポート

何回もお見せしていますが、コンパイル後に出されるコンパイルレポートです。



82C55は8ビット×3ポートしかありませんが、CPUバスにつながる部分などでも内部回路を消費すると考えられます。
macrocellは53(41%)と思いのほか多く消費しています。

CPLD入門![第74回]
2019.6.21upload

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