CODE
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity adc_test is
port(
clk:in std_logic;--входящий тактовый (50 мгц)
sclk:out std_logic;--тактовый ацп(max=20mgh)
cs_n:out std_logic;--сигнал низкого уровня(спад по заднему фронту означает начало работы ацп)
din:out std_logic;--сигнал подаваемый на ацп с информацией о том как, откуда преобразовывать сигнал
dout:in std_logic;--результат работы ацп
leds:out std_logic_vector(7 downto 0)--выведены 8 бит - результат преобразования в цифровой вид
);
end entity;
--структура dout (0 написаны для примера)
--00000000-результат преобразования(8 бит)
--000-номер канала(3 бита) (0 до 7 т.е если 2 то 010)
--0-ведущий бит(1 бит)
--0000-разделительные биты(4 бит)
architecture arch of adc_test is
signal control_reg:std_logic_vector(11 downto 0):="110000111011";
--структура din(здесь стоят конкретные значения, указаны в том порядке, в котором написаны выше(слева-направо))
--write=1 - запись в контрольный регистр
--seq=1 - идёт вместе с shadow (11 - означает, что конвертироваться будет с 0 канала до указанного, поочередно, если add=0, то с 0 по 0 канал)
--незначащий
--add 2,0,1=000 - номер канала (0)
--pm 1,0=11 - ацп работает на полную катушку(т.е. работает и когда надо, и когда не надо, например во время посылки незначащих 0 между выборками)
--shadow=1 - идёт вместе с seq (11 - означает, что конвертироваться будет с 0 канала до указанного, поочередно, если add=0, то с 0 по 0 канал)
--незначащий
--range=0 - аналоговый диапазон 0-2*REFin
--coding=1 - результат идёт последовательно
signal div:integer:=0;
signal adc_clk:std_logic:='0';
signal adc_cs:std_logic:='1';
signal cs_count:integer:=0;
signal first_takt:std_logic_vector(1 downto 0):="00";
signal takts_count:std_logic_vector(3 downto 0):="0000";
signal takts_count_cs:std_logic_vector(3 downto 0):="0000";
signal adc_dout:std_logic_vector(15 downto 0);
begin
sclk<=adc_clk;
cs_n<=adc_cs;
--делитель рез-т 16,6 мгц
process(clk)
begin
if(rising_edge(clk)) then
if(div<3) then
adc_clk<='0';
div<=div+1;
else
if(div>=3) then
adc_clk<='1';
div<=div+1;
end if;
end if;
if(div=5) then
div<=0;
end if;
end if;
end process;
process(adc_clk)
begin
if(rising_edge(adc_clk)) then
if(conv_integer(takts_count_cs)=0) then
adc_cs<='1';
else
adc_cs<='0' after 55 ns;
end if;
takts_count_cs<=takts_count_cs+1;
end if;
end process;
----------
--запись в din
--первый спад cs запись в контрольный регистр, 2 спад cs - получение преобразования
process(adc_clk,adc_cs)
begin
if(falling_edge(adc_clk)) then
if(adc_cs='0') then
if(conv_integer(takts_count)<12) then
din<=control_reg(11-conv_integer(takts_count));
--if(conv_integer(takts_count)=0) then
--control_reg(11-conv_integer(takts_count))<='0';
--end if;
end if;
takts_count<=takts_count+1;
else
takts_count<="0000";
end if;
end if;
end process;
--чтение из dout
--читается со 2 такта cs_n
process(adc_clk)
begin
if(falling_edge(adc_clk)) then
if(adc_cs='0')then
adc_dout(15-conv_integer(takts_count))<=dout;
if(conv_integer(takts_count)=15) then
leds<=adc_dout(11 downto 4);
end if;
end if;
end if;
end process;
end architecture;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity adc_test is
port(
clk:in std_logic;--входящий тактовый (50 мгц)
sclk:out std_logic;--тактовый ацп(max=20mgh)
cs_n:out std_logic;--сигнал низкого уровня(спад по заднему фронту означает начало работы ацп)
din:out std_logic;--сигнал подаваемый на ацп с информацией о том как, откуда преобразовывать сигнал
dout:in std_logic;--результат работы ацп
leds:out std_logic_vector(7 downto 0)--выведены 8 бит - результат преобразования в цифровой вид
);
end entity;
--структура dout (0 написаны для примера)
--00000000-результат преобразования(8 бит)
--000-номер канала(3 бита) (0 до 7 т.е если 2 то 010)
--0-ведущий бит(1 бит)
--0000-разделительные биты(4 бит)
architecture arch of adc_test is
signal control_reg:std_logic_vector(11 downto 0):="110000111011";
--структура din(здесь стоят конкретные значения, указаны в том порядке, в котором написаны выше(слева-направо))
--write=1 - запись в контрольный регистр
--seq=1 - идёт вместе с shadow (11 - означает, что конвертироваться будет с 0 канала до указанного, поочередно, если add=0, то с 0 по 0 канал)
--незначащий
--add 2,0,1=000 - номер канала (0)
--pm 1,0=11 - ацп работает на полную катушку(т.е. работает и когда надо, и когда не надо, например во время посылки незначащих 0 между выборками)
--shadow=1 - идёт вместе с seq (11 - означает, что конвертироваться будет с 0 канала до указанного, поочередно, если add=0, то с 0 по 0 канал)
--незначащий
--range=0 - аналоговый диапазон 0-2*REFin
--coding=1 - результат идёт последовательно
signal div:integer:=0;
signal adc_clk:std_logic:='0';
signal adc_cs:std_logic:='1';
signal cs_count:integer:=0;
signal first_takt:std_logic_vector(1 downto 0):="00";
signal takts_count:std_logic_vector(3 downto 0):="0000";
signal takts_count_cs:std_logic_vector(3 downto 0):="0000";
signal adc_dout:std_logic_vector(15 downto 0);
begin
sclk<=adc_clk;
cs_n<=adc_cs;
--делитель рез-т 16,6 мгц
process(clk)
begin
if(rising_edge(clk)) then
if(div<3) then
adc_clk<='0';
div<=div+1;
else
if(div>=3) then
adc_clk<='1';
div<=div+1;
end if;
end if;
if(div=5) then
div<=0;
end if;
end if;
end process;
process(adc_clk)
begin
if(rising_edge(adc_clk)) then
if(conv_integer(takts_count_cs)=0) then
adc_cs<='1';
else
adc_cs<='0' after 55 ns;
end if;
takts_count_cs<=takts_count_cs+1;
end if;
end process;
----------
--запись в din
--первый спад cs запись в контрольный регистр, 2 спад cs - получение преобразования
process(adc_clk,adc_cs)
begin
if(falling_edge(adc_clk)) then
if(adc_cs='0') then
if(conv_integer(takts_count)<12) then
din<=control_reg(11-conv_integer(takts_count));
--if(conv_integer(takts_count)=0) then
--control_reg(11-conv_integer(takts_count))<='0';
--end if;
end if;
takts_count<=takts_count+1;
else
takts_count<="0000";
end if;
end if;
end process;
--чтение из dout
--читается со 2 такта cs_n
process(adc_clk)
begin
if(falling_edge(adc_clk)) then
if(adc_cs='0')then
adc_dout(15-conv_integer(takts_count))<=dout;
if(conv_integer(takts_count)=15) then
leds<=adc_dout(11 downto 4);
end if;
end if;
end if;
end process;
end architecture;
результат работы никакой. Преобразование выводится на светодиоды, а они не горят. Контакты в плис я назначил правльно, т.е. как в документации к плате было написано.
Максимальная тактовая частота ацп 20 мгц, ( но я не знаю как из 50мгц сделать 20, поэтому поставил 16,(6)). Может кто знает где ошибка или может я принципиально что-то не так делаю?
Нажмите для просмотра прикрепленного файла