[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第146回]
●CPLDロジアナ(35)16CH版(3)VHDLプログラム
本日も時間がありませんので、CPLDロジアナ16チャンネル版のVHDLプログラムをお見せするだけで終ります。
下はCPLDロジアナ16チャンネル版のVHDLプログラムです。
--logiana --19/4/29 4/30 5/22 5/23 5/24 --6/12 --10/14 from logiana1b --10/15 10/16 11/13 --20/1/12 1/13 1/14 --10/27 10/28 --21/12/31 --22/1/3 1/8 1/9 1/12 1/19 1/20 --1/28 for 16ch 1/29 1/30 3/15 3/18 library IEEE; use IEEE.STD_LOGIC_1164.ALL; library ARITHMETIC; use ARITHMETIC.std_logic_arith.all; entity logiana4c is PORT ( P41:out std_logic;--end mark=a15_ RC:inout std_logic_vector(7 downto 0);--pic rc IORD:in std_logic; IOWR:in std_logic; ADSELECT:in std_logic; CLK:in std_logic;--100MHz PBIN:in std_logic_vector(7 downto 0);--probe PBINH:in std_logic_vector(7 downto 0);--probe MAOUT:out std_logic_vector(14 downto 0); MDINOUT:inout std_logic_vector(7 downto 0); MDINOUTH:inout std_logic_vector(7 downto 0); MWR:out std_logic); end logiana4c; architecture rtl of logiana4c is signal res_clr:std_logic; signal cntrs:std_logic; signal cntrswk:std_logic; signal r_w:std_logic; signal cntonmk:std_logic; signal cntrclk:std_logic; signal clkwk:std_logic_vector(2 downto 0); signal clkwk2:std_logic; signal clk2mwk:std_logic_vector(3 downto 0); signal clk2m:std_logic; signal clk2mwk2:std_logic_vector(1 downto 0); signal clk200kwk:std_logic_vector(3 downto 0); signal clk200k:std_logic; signal clk200kwk2:std_logic_vector(1 downto 0); signal clk20kwk:std_logic_vector(3 downto 0); signal clk20k:std_logic; signal clk20kwk2:std_logic_vector(1 downto 0); signal clk2kwk:std_logic_vector(3 downto 0); signal clk2k:std_logic; signal clk2kwk2:std_logic; signal rcntr:std_logic_vector(1 downto 0); signal cntrL:std_logic_vector(2 downto 0); signal cntrH:std_logic_vector(15 downto 0); signal trigedge:std_logic; signal clkslct:std_logic_vector(3 downto 0); signal trigprobe:std_logic_vector(3 downto 0); signal pbinL:std_logic_vector(7 downto 0); signal pbinHwk:std_logic_vector(7 downto 0); signal trigon:std_logic; signal trigonL:std_logic;--see 6/12 note signal trigonH:std_logic; signal trigin:std_logic; signal resadrs3b:std_logic_vector(2 downto 0); signal trigedge3b:std_logic_vector(2 downto 0); signal clk0:std_logic; signal clk1:std_logic; signal clk2:std_logic; signal clk3:std_logic; -- begin -- i/o adrsselect process(ADSELECT) begin if ADSELECT'event and ADSELECT='0' then ----------------- -- command set if RC="00000000" then res_clr<='0';--00,06 reset,01,07 start r_w<='0'; elsif RC="00000001" then res_clr<='1'; r_w<='0'; elsif RC="00000110" then res_clr<='0'; r_w<='1'; elsif RC="00000111" then res_clr<='1'; r_w<='1'; --trigger edge elsif RC(7 downto 1)="0000010" then--04,05 trigedge<=RC(0); -- clock select elsif RC(7 downto 4)="0001" then--1x clkslct<=RC(3 downto 0); elsif RC(7 downto 5)="001" then--2x,3x trigprobe<=RC(3 downto 0); end if; end if; end process; -- -- select trigger probe -- trigin<=PBIN(0) when trigprobe="0000" else PBIN(1) when trigprobe="0001" else PBIN(2) when trigprobe="0010" else PBIN(3) when trigprobe="0011" else PBIN(4) when trigprobe="0100" else PBIN(5) when trigprobe="0101" else PBIN(6) when trigprobe="0110" else PBIN(7) when trigprobe="0111" else PBINH(0) when trigprobe="1000" else PBINH(1) when trigprobe="1001" else PBINH(2) when trigprobe="1010" else PBINH(3) when trigprobe="1011" else PBINH(4) when trigprobe="1100" else PBINH(5) when trigprobe="1101" else PBINH(6) when trigprobe="1110" else PBINH(7); --trigprobe="1111" -- -- trigger on process(trigin,res_clr) begin if res_clr='0' then trigonH<='0'; trigonL<='0'; elsif trigin'event and trigin='0' and trigedge='0' then trigonL<='1'; elsif trigin'event and trigin='1' and trigedge='1' then trigonH<='1'; end if; end process; trigon<=trigonH or trigonL; -- --make clock for 50MHz,10MHz,5MHz --clkwk(0)=50MHz clkwk(1)=25MHz -- process(CLK) begin if CLK'event and CLK='0' then clkwk<=clkwk+"01";--10M,5M end if; end process; -- --make clk2mwk for 2MHz --clk2mwk(3)=10mhz -- process(CLK) begin if CLK'event and CLK='0' then if clk2mwk="1001" then clk2mwk<="0000"; else clk2mwk<=clk2mwk+"0001"; end if; end if; end process; -- --make clk2mwk2 --clk2mwk2(0)=5mhz clk2mwk2(1)=2.5mhz -- clk2m<=clk2mwk(3);--10mhz -- process(clk2m) begin if clk2m'event and clk2m='0' then clk2mwk2<=clk2mwk2+"01";--1M,500k end if; end process; -- --make clk200kwk for 200kHz --clk200kwk(3)=1mhz -- process(clk2m) begin if clk2m'event and clk2m='0' then if clk200kwk="1001" then clk200kwk<="0000"; else clk200kwk<=clk200kwk+"0001"; end if; end if; end process; -- --make clk200kwk2 --clk200kwk2(0)=500khz clk200kwk2(1)=250khz -- clk200k<=clk200kwk(3);--1mhz -- process(clk200k) begin if clk200k'event and clk200k='0' then clk200kwk2<=clk200kwk2+"01";--100k,50k end if; end process; -- --make clk20kwk for 20kHz --clk20kwk(3)=100khz -- process(clk200k) begin if clk200k'event and clk200k='0' then if clk20kwk="1001" then clk20kwk<="0000"; else clk20kwk<=clk20kwk+"0001"; end if; end if; end process; -- --make clk20kwk2 --clk20kwk2(0)=50khz clk20kwk2(1)=25khz -- clk20k<=clk20kwk(3);--100khz -- process(clk20k) begin if clk20k'event and clk20k='0' then clk20kwk2<=clk20kwk2+"01";--10k,5k end if; end process; -- --make clk2kwk for 2kHz --clk2kwk(3)=10khz -- process(clk20k) begin if clk20k'event and clk20k='0' then if clk2kwk="1001" then clk2kwk<="0000"; else clk2kwk<=clk2kwk+"0001"; end if; end if; end process; -- --make clk2kwk2 --clk2kwk2(0)=5khz -- clk2k<=clk2kwk(3);--10khz -- process(clk2k) begin if clk2k'event and clk2k='0' then clk2kwk2<=clk2kwk2+'1';--1k end if; end process; -- -- select clock -- clkwk2<=CLK when clkslct<="0010" else --20MHz clkwk(0) when clkslct="0011" else --10MHz clkwk(1) when clkslct="0100" else --5MHz clk2m when clkslct="0101" else --2MHz clk2mwk2(0) when clkslct="0110" else --1MHz clk2mwk2(1) when clkslct="0111" else --500KHz clk200k when clkslct="1000" else --200kHz clk200kwk2(0) when clkslct="1001" else --100kHz clk200kwk2(1) when clkslct="1010" else --50KHz clk20k when clkslct="1011" else --20kHz clk20kwk2(0) when clkslct="1100" else --10kHz clk20kwk2(1) when clkslct="1101" else --5KHz clk2k when clkslct="1110" else --2kHz clk2kwk2 when clkslct="1111" else --1kHz '1'; -- --make cntrL --- cntrL(2)=1/5clkwk2 -- process(clkwk2,res_clr) begin if res_clr='0' then cntrL<="000"; elsif clkwk2'event and clkwk2='0' then if cntrL="100" then cntrL<="000"; else cntrL<=cntrL+"001"; end if; end if; end process; -- -- make cntrs -- --for MEMORY address up,PBIN latch,MEMWR -- -- select cntrs -- cntrswk<=CLK when clkslct="0000" else --100MHz clkwk(0) when clkslct="0001" else --50MHz cntrL(2);--20MHz-1KHz -- -- read counter -- process(IORD,res_clr) begin if res_clr='0' then rcntr<="00"; elsif IORD'event and IORD='1' then rcntr<=rcntr+"01"; end if; end process; cntrs<=cntrswk when r_w='0' and trigon='1' else rcntr(0); -- cntrs<=cntrswk when r_w='0' and trigon='1' else not IORD; -- cntrH up process(cntrs,res_clr) begin if res_clr='0' then cntrH<="0000000000000000"; elsif cntrs'event and cntrs='0' and cntrH(15)='0' then cntrH<=cntrH+"0000000000000001"; end if; end process; -- -- PBIN latch -- process(cntrs) begin if cntrs'event and cntrs='0' then pbinL<=PBIN; pbinHwk<=PBINH; end if; end process; -- --data out to pic -- -- RC<="ZZZZZZZZ" when r_w='0' or cntrH(15)='1' else RC<=MDINOUT when rcntr(0)='0' and IORD='0' else MDINOUTH when rcntr(0)='1'and IORD='0' else "ZZZZZZZZ"; -- RC<=MDINOUT when IORD='0' else "ZZZZZZZZ"; -- --PBDATA to RAM -- MDINOUT<=pbinL when r_w='0' else "ZZZZZZZZ"; MDINOUTH<=pbinHwk when r_w='0' else "ZZZZZZZZ"; -- P41<=not cntrH(15);--end mark -- --MEMWR -- MWR<=cntrs or r_w or cntrH(15);--MWR_=cntrs='0' and r_w='0' -- MAOUT<=cntrH(14 downto 0); -- end rtl; |
私が考えていた当初の予定では1月中には区切りがついて発売開始できるはずだったのですが、毎度のことながら予定を大幅に超過してしまいました。
当初の予定から2ヶ月ほども遅れてしまいましたがやっと一区切りつきました。
次回はCPLDロジアナ8チャンネル版と16チャンネル版の発売開始のお知らせの予定です。
とは言いましてもまだこれから原価の計算などにかかるところですので次回は2〜3日後になるかもしれません。
CPLD入門![第146回]
2022.3.23upload
前へ
次へ
ホームページトップへ戻る