Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отладочная плата de1 работа с встроенным ацп
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
enzaime
написал вот такой код, основываясь на информации из документации ацп (ацп рабочий тестовый пример запускается нормально, но больше ничего полезного тестовый пример не дал, так как его код слишком сложен для моего понимания):
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;

результат работы никакой. Преобразование выводится на светодиоды, а они не горят. Контакты в плис я назначил правльно, т.е. как в документации к плате было написано.
Максимальная тактовая частота ацп 20 мгц, ( но я не знаю как из 50мгц сделать 20, поэтому поставил 16,(6)). Может кто знает где ошибка или может я принципиально что-то не так делаю?
Нажмите для просмотра прикрепленного файла
Maverick
Цитата(enzaime @ Sep 20 2014, 18:54) *
написал вот такой код...Может кто знает где ошибка или может я принципиально что-то не так делаю?


что в конструкции для синтеза делает
Цитата
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;


after 55 ns; ???
Вы знаете, что конструкция after 55 ns; применима для симуляции?
Для синтеза это не применимо!!!
Kuzmi4
2 Maverick
ну нравится так человеку biggrin.gif оно на результат синтеза обычно не влияет.

2 enzaime
как то у вас муторно написано,
вы бы словами и картинками рассказали что вы сделали с приведением кусков кода, а так - не знаю кто будет разбираться в том что вы написали...
iosifk
Цитата(enzaime @ Sep 20 2014, 19:54) *
написал вот такой код, основываясь на информации из документации ацп


Вообще код некрасивый. Куча вычитателей, схем сравнения и пр. А уж несинтезируемые конструкции годятся только для симулятора. И есть проблема с пониманием клоковых доменов...
Для того, чтобы сделать диаграмму, лучше всего использовать FSM.
Если хотите, то могу объяснить, как это делается. Но не буквами, а по скайпу.
Maverick
Цитата(Kuzmi4 @ Sep 21 2014, 10:34) *
2 Maverick
ну нравится так человеку biggrin.gif оно на результат синтеза обычно не влияет.

мне просто не понятен момент - enzaime знает что это только для симулятора или нет
только из-за этого я это написал... wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.