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

[新連載]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

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