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