[新連載]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回]参照)
前へ
次へ
ホームページトップへ戻る