[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第60回]
●メールをいただきました
当記事をお読みになった方からメールをいただきました。
event文の位置が気になります。直したほうがよいのでは?
とのご指摘です。
たとえば。
--cntr2
process(cntr1)
begin
if cntr1(2)'event and cntr1(2) = '0' then
cntr2 <= cntr2 +"0000001";
end if;
if cntr2="1110000" then
cntr2<="0000000";
end if;
end process;
|
if cntr2=”1110000” then 以下の文はevent文より前に置くべきでは?とのご指摘です。
「これだとcntr2が変化したあとで、比較文(組み合わせ文)が実行されてしまいます」
ご指摘ごもっともです。
ただ、私としては意図してそのように書いたつもりですが。
cntr2がカウントアップした結果、cntr2=”1110000”になったならば…、のつもりです。
こういう書き方はよくないのでしょうか?
ちなみに前回の最後のところの
−−ramadrs
ではevent文は最後に書いています。
もうひとつ、cntr1(2)は一旦別の変数に通してから使ったほうがよいですよ、とのアドバイスをいただきました。
ごもっともなご指摘です。
そうすべきと思いつつ、面倒で、ま、いいか、とそのまま使ってしまいます。
やっぱりそうすべきでしょうね。
以後留意いたします。
メールをお送りいただいたto…様、丁寧なご指摘、アドバイスを有難うございました。
今後ともご指導ご鞭撻のほど、よろしくお願いいたします。
●メールが戻ってきてしまいました
さっそくto…様にご返事を差し上げたのですが、Undelivered Mailとのことで、戻ってきてしまいました。
この方はyahooメールをお使いのようなのですが。
554 delivery error: dd This user doesn't have a yahoo.co.jp account |
なのだそうです。
いや。
それはおかしいでしょう。
だっていただいたメールアカウントに、メーラーの機能を使ってそのまま機械的に返信しただけですから、アドレスの打ちミスなど考えられません。
ネットで検索してみましたら、ずいぶん多くの方がyahooメールの未達でお困りのようで。
うーん。
迷惑メール拒否の設定になっているのでしょうか?
そういう場合でも上記のエラーになるのでしょうか?
そういえば、携帯のメールの場合にはデフォルトの設定では大手キャリア以外から来たメールは勝手にゴミ箱に入れてしまって、着信メッセージも出さない、なんてことをどこかで読んだ記憶があります。
私はいただいたメールには必ずご返事をさしあげております。
もし2〜3日待っても返事が届かない場合には、その旨をメールしていただくか、電話にてお問い合わせください。
●CRTIF(80字/40字切換表示)VHDLプログラムリスト
前回はCRTIF用VHDLプログラムを80字表示と40字表示を切り換える部分の変更について書きました。
変更後のVHDLプログラムリスト(80字/40字切換表示プログラム)です。
--vga controller 18/12/22 12/23 12/24 12/25 12/26 12/27
--19/1/12 1/13 1/29 3/24 3/25 3/26 3/27
--5/4 5/5 5/6
--5/7 vga & crt from vgac2j
--5/8
--5/9 80/40 5/10
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library ARITHMETIC;
use ARITHMETIC.std_logic_arith.all;
entity vgacrt1a is
PORT (
AHout:out std_logic_vector(6 downto 0);
ALout:out std_logic_vector(3 downto 0);
AHin:in std_logic_vector(6 downto 0);
ALin:in std_logic_vector(3 downto 0);
ROMadrs:out std_logic_vector(2 downto 0);
ROMDATA:in std_logic_vector(7 downto 0);
A11_15:in std_logic_vector(4 downto 0);
IOWR:in std_logic;
IORD:in std_logic;
MREQ:in std_logic;
MWR:in std_logic;
VRAMWR:out std_logic;
VRAMS:out std_logic;
D0IN:in std_logic;
D1IN:in std_logic;
D7OUT:out std_logic;
RGB_ROUT:out std_logic;
RGB_GOUT:out std_logic;
RGB_BOUT:out std_logic;
HSYNC:out std_logic;
VSYNC:out std_logic;
CRTVHSYNC:out std_logic;
CRTDSP:out std_logic;
Notused58:in std_logic;
Notused73:in std_logic;
Notused74:in std_logic;
SW80_40:in std_logic;
--T57:out std_logic;--vblnkwk
--T67:out std_logic;--vactive
--T68:out std_logic;--hblnkwk
T69:out std_logic;--hblnkwk2
--T70:out std_logic;
Resetin:in std_logic;
CKIN :in std_logic);
end vgacrt1a;
architecture rtl of vgacrt1a is
signal cntr0:std_logic;
signal cntr1:std_logic_vector(3 downto 0);
signal cntr2:std_logic_vector(6 downto 0);
signal cntr3:std_logic_vector(8 downto 0);
signal ramadrswk:std_logic_vector(6 downto 0);
signal ramadrswk0:std_logic_vector(6 downto 0);
signal sftrgstr:std_logic_vector(7 downto 0);
signal hblnkwk:std_logic;
signal hblnkwk2:std_logic;
signal cntr3wk:std_logic;
signal vblnkwk:std_logic;
signal vrams2:std_logic;
signal vactive:std_logic;
signal rgbout:std_logic;
signal hsyncwk:std_logic;
signal vsyncwk:std_logic;
signal ck:std_logic;
begin
--T57<=vblnkwk;
--T67<=vactive;
--T68<=hblnkwk;
--T69<=hblnkwk2;
Hsync<=hsyncwk;
Vsync<=vsyncwk;
--clock select
process(CKIN,SW80_40)
begin
if SW80_40='1' then
cntr0<=CKIN;
elsif SW80_40='0' then
if CKIN'event and CKIN='0' then
cntr0<=cntr0+'1';
end if;
end if;
end process;
--cntr1 & sftrgstr
process(cntr0)
begin
if cntr0'event and cntr0='0' then
cntr1<=cntr1+"0001";
sftrgstr<=sftrgstr(6 downto 0) & '1';
end if;
if cntr1(3)='1' then
sftrgstr<=ROMDATA;
cntr1<="0000";
end if;
end process;
--
--cntr2
process(cntr1,cntr2)
begin
if cntr1(2)'event and cntr1(2) = '0' then
cntr2 <= cntr2 +"0000001";
end if;
if SW80_40='1' and cntr2="1110000" then
cntr2<="0000000";
elsif SW80_40='0' and cntr2="0111000" and cntr0='1' then
cntr2<="0000000";
end if;
end process;
--hblnk,hsync
process(cntr2)
begin
--hblnkwk
if cntr2="0000000" then
hblnkwk<='1';
elsif SW80_40='1' and cntr2="1010000" then
hblnkwk<='0';
elsif SW80_40='0' and cntr2="0101000" then
hblnkwk<='0';
end if;
end process;
--
process(cntr2)
begin
--hblnkwk2
if cntr2="0000001" then
hblnkwk2<='1';
elsif SW80_40='1' and cntr2="1010001" then
hblnkwk2<='0';
elsif SW80_40='0' and cntr2="0101001" then
hblnkwk2<='0';
end if;
end process;
--
process(cntr2)
begin
--hsynkwk
if SW80_40='1' then
if cntr2="1011001" then
hsyncwk<='0';
elsif cntr2="1100000" then
hsyncwk<='1';
end if;
else
if cntr2="0101101" then
hsyncwk<='0';
elsif cntr2="0110000" then
hsyncwk<='1';
end if;
end if;
end process;
--
--cntr3
process(hblnkwk)
begin
if hblnkwk'event and hblnkwk = '1' then
cntr3 <= cntr3 +"000000001";
end if;
end process;
-- vblnk,vsync
process(cntr3)
begin
--vblnkwk
if cntr3(7)='0' then
vblnkwk<='1';
elsif cntr3(7 downto 3)="11001" then
vblnkwk<='0';
end if;
--vsyncwk
if cntr3(7 downto 3)="11011" then
vsyncwk<='0';
elsif cntr3(7 downto 4)="1110" then
vsyncwk<='1';
end if;
end process;
--ramadrs
process(cntr1,cntr2,cntr3,vblnkwk)
begin
if vblnkwk='0' then
ramadrswk<="0000000";
ramadrswk0<="0000000";
elsif cntr3(2 downto 0)="111" and hblnkwk = '0' then
ramadrswk0 <= ramadrswk;
elsif SW80_40='1' and cntr2="1010000" and cntr1(0)='1' then
ramadrswk <= ramadrswk0;
elsif SW80_40='0' and cntr2="0101000" and cntr1(0)='1' then
ramadrswk <= ramadrswk0;
elsif cntr2(3)'event and cntr2(3)='0' and hblnkwk='1' then
ramadrswk<=ramadrswk+"0000001";
end if;
end process;
-- address select
-- vrams
process(MREQ,MWR)
begin
if MREQ='0' and MWR='0' and A11_15="11111" and vrams2='0' then
VRAMS<='0';
AHout<=AHin;
ALout<=ALin;
VRAMWR<=MWR;
else
VRAMS<='1';
AHout<=ramadrswk;
ALout<=cntr2(3 downto 0);
VRAMWR<='1';
end if;
end process;
-- vblnk read
-- i/o active vrams vactive
process(Resetin,AHin,ALin,IOWR)
begin
if Resetin='0' then
vrams2<='1';
vactive<='1';
elsif AHin(3 downto 0)="1101" and ALin(3 downto 2)="00" and IOWR='0' then
vrams2<=not D0IN;
vactive<=not D1IN;
end if;
end process;
--see note 5/6
process(AHin,ALin,IORD)
begin
if AHin(3 downto 0)="1101" and ALin(3 downto 2)="00" and IORD='0' and vblnkwk='0' then
D7OUT<='0';
else
D7OUT<='Z';
end if;
end process;
rgbout<=sftrgstr(7) and hblnkwk2 and vblnkwk and vactive;
--RGB_ROUT<=rgbout;
--RGB_GOUT<=rgbout;
--RGB_BOUT<=rgbout;
ROMadrs<=cntr3(2 downto 0);
T69<=hblnkwk2;--test
--T70<=hblnkwk;--test
--crt out
process(rgbout)
begin
if rgbout='0' then
CRTDSP<='0';
else
CRTDSP<='Z';
end if;
end process;
process(hsyncwk,vsyncwk)
begin
if hsyncwk='0' or vsyncwk='0' then
CRTVHSYNC<='0';
else
CRTVHSYNC<='Z';
end if;
end process;
end rtl;
|
CPLD入門![第60回]
2019.6.7upload
前へ
次へ
ホームページトップへ戻る