Здравствуйте уважаемые форумчане. Этот проект делаю для себя, в образовательных целях и буду рад услышать любые ваши советы и критику.
Цель проекта: визуализация поданного напряжения. Я хочу включить, скажем, 5 диодов и зажигать их в зависимости от поданного напряжения. 1В горит нижний диод, 2В два нижних диода и так далее, для усложнения буду использовать импульсное питания диодов и переменную яркость с помошью ШИМ. На вход 2.5 вольта 2 диода горять в полную силу, третий на половину яркости. Использую CPLD MAX II
Первое что необходимо, это отслеживать изменение аналогового сигнала, то есть необходим АЦП. Так как проект чисто для себя то тратиться особо не хочется, полез по самым дешевым выбор пал на ADC0831 Single Differential Input Dual-In-Line Package (N) Судя по временной диаграмме, все просто, когда сигнал CS = '0', на шину данных последовательно выставляются 8 бит данных. Для их считывания я решил перевести их из последовательного кода в паралельный, и дальше оперировать этим вектором (думаю сравнивать с заданными заранее), тактовая частота в плис 3.33МГц сгенерированная ПЛИС, для АЦП я понижаю ее дл 333КГц.

Код
library ieee;
use ieee.std_logic_1164.all;
entity ADC is
port(
    clk,DATA,CS_test:in std_logic;
    i_out: out integer range 0 to 8;    
    parall_DATA: out std_logic_vector (7 downto 0);
    
    test: out std_logic_vector (8 downto 0)
--------------------------------------------    
    );
      
end ADC;

architecture part1 of ADC is


component tff
    port(
        t, clk, clrn, prn :  in  std_logic;
        q                 :  out std_logic);
end component;

component count10 IS
    PORT
    (
        clock        : IN STD_LOGIC;
        cout        : OUT STD_LOGIC;
        q        : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)
    );
END component;

component dff
    port(
        d, clk, clrn, prn :  in  std_logic;
        q                 :  out std_logic);
end component;

signal count10_out: sTD_LOGIC_VECTOR (3 DOWNTO 0);
signal count10_cout,ADC_clk,CS,notADC_clk,ADC_clk_dff: std_logic;


begin


-------------------формируем тактовую частоту для АЦП
count10_0: count10 port map
        (
        clock    =>clk ,    
        cout    =>count10_cout ,
        q        =>count10_out
        );
        
tff_0:tff port map (count10_cout,clk,'1','1',ADC_clk);
dff_0:dff port map (ADC_clk,clk,'1','1',ADC_clk_dff);

------------------------------------------------
notADC_clk<=not ADC_clk;

process (DATA,ADC_clk,CS_test)
variable i:integer range 0 to 8 :=1;
variable j:integer range 0 to 12 :=0;

begin
------------------------формирование сигнала опроса АЦП
    if rising_edge( notADC_clk) then
    
        j:=j+1;
        
        if j<8 then
            CS<='0'; -- читаем данные из АЦП
        elsif j>8 then
            CS<='1'; -- обрабатываем данные из АЦП (это уже потом)
        end if;    
                
        
    end if;
-------------------------


-----------------------------------считывание данных последовательный код в паралельный
if ((ADC_clk_dff'event and ADC_clk_dff='0')and CS='0') then
        

        
        if  DATA = '1' then
                parall_DATA(i-1)<='1';
        elsif  DATA = '0' then
                parall_DATA(i-1)<='0';
        end if;
            i:=i+1;
                
    end if;    
    
if  CS='1' then
    i:=1;
end if;
    
i_out<=i;
end process;
------------------------------------
test(0)<=ADC_clk;
test(1)<=CS;

end;

Хотелось бы услышать возможные дополнения и замечания по идее реализации, а так же по выбору АЦП.
Так же схемотехнический вопрос, уместно ли соединять ноги плис и АЦП на прямую? Думаю поставить резистор, для ограничения мексимального тока.
P.S. код еще сырой, может гулять такт, это я поправлю. Интересно жизнеспособна ли данная схема и если нет то в какую сторону думать.