Цель проекта: визуализация поданного напряжения. Я хочу включить, скажем, 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;
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. код еще сырой, может гулять такт, это я поправлю. Интересно жизнеспособна ли данная схема и если нет то в какую сторону думать.