vitali36
Sep 10 2013, 11:22
Здравствуйте! Тема такая. Делал проект в ise, целью которого было принять данные на ацп , а потом отправить по com-port'у на компьютер. На C# написал программу которая принимает эти данные, которые я скидывал в массив и выводил график. Но данные похоже приходят неккоректно, поэтому решил задействовать память на борту spartan 3an ddr2 sdram. Создал Microblaze проект. Затем экспортнул в sdk,там протестировал память и перифирию - все работает. Т.е проект создан корректно. ТЕПЕРЬ ВОПРОС: мне нужно, чтобы данные с ацп приходили в память (на ацп поступает аналоговый сигнал извне) а уж потом шли по ком-порту на комп. Так вот как мне добавить к этому microblaze мой модуль, в котором описана работа АЦП. Это все нужно сделать же в ise. Есть еще uart модуль , но я так понял он мне не понадобиться больше, т.к uart в microblaze задействован. Вообщем подскажите как собрать этот проект. Еще раз: есть microblaze проект с ddr2 и uart и vhdl модуль с описанием работы ацп. Цель: данные с ацп записываются в ddr2 , а после отправляются по uart в комп.
Golikov A.
Sep 13 2013, 20:19
ответил в прошлой вашей теме..
если связались с микроблайзом, то ваши инструменты платформ студия и СДК, ISE теперь только для создания модулей. Собирать финальный проект в ISE не советую...
П.С. Все немного глючное, когда обновляете (после модификации) проц и экспортите его в сдк, в существующий проект, настойчиво рекомендую удалить все созданные софтварные проекты (только проекты из прожект эксплорера, не файлы на диске) и заново их импортнуть, потом сделать клинап проектов, всех, и заново их билднуть... а то иногда половина файлов остается старых, половина новых и вот тут уже вообще беда начинается... билдишь одно, запускаешь другое, редактируешь тертье...
Sergey_Bekrenyov
Sep 15 2013, 14:43
Цитата(vitali36 @ Sep 10 2013, 15:22)

Здравствуйте! Тема такая. Делал проект в ise, целью которого было принять данные на ацп , а потом отправить по com-port'у на компьютер. На C# написал программу которая принимает эти данные, которые я скидывал в массив и выводил график. Но данные похоже приходят неккоректно, поэтому решил задействовать память на борту spartan 3an ddr2 sdram. Создал Microblaze проект. Затем экспортнул в sdk,там протестировал память и перифирию - все работает. Т.е проект создан корректно. ТЕПЕРЬ ВОПРОС: мне нужно, чтобы данные с ацп приходили в память (на ацп поступает аналоговый сигнал извне) а уж потом шли по ком-порту на комп. Так вот как мне добавить к этому microblaze мой модуль, в котором описана работа АЦП. Это все нужно сделать же в ise. Есть еще uart модуль , но я так понял он мне не понадобиться больше, т.к uart в microblaze задействован. Вообщем подскажите как собрать этот проект. Еще раз: есть microblaze проект с ddr2 и uart и vhdl модуль с описанием работы ацп. Цель: данные с ацп записываются в ddr2 , а после отправляются по uart в комп.
Не нужен Вам Microblaze - только время потеряете. Контроллер DDR2 сгенерите прямо в ISE.
Только Вам для себя нужно ответить на пару вопросов
- как Вам поможет DDR получить правильные данные?
- какой объем Ваших данных? Вполне вероятно что они влезут в BRAM
Если уж сильно хочется майкроблэйз - добавьте туда еще один уарт. К одному подцепите свой старый, второй киньте на комп.
Maverick
Sep 15 2013, 16:39
Цитата(Sergey_Bekrenyov @ Sep 15 2013, 17:43)

Не нужен Вам Microblaze - только время потеряете. Контроллер DDR2 сгенерите прямо в ISE.
Только Вам для себя нужно ответить на пару вопросов
- как Вам поможет DDR получить правильные данные?
- какой объем Ваших данных? Вполне вероятно что они влезут в BRAM
Если уж сильно хочется майкроблэйз - добавьте туда еще один уарт. К одному подцепите свой старый, второй киньте на комп.
я такой совет уже давал...
Sergey_Bekrenyov
Sep 15 2013, 18:41
Цитата(Maverick @ Sep 15 2013, 20:39)

я такой совет уже давал...


Я в свое время отучился на Кзайлинкс тренингах по поводу встраиваемых микропроцессорных систем -без этого тяжко с нуля разбираться. Проще накодировать в ПЛИС, да и отлаживать проще.
vitali36
Sep 15 2013, 19:02
Цитата
- как Вам поможет DDR получить правильные данные?
Сергей, DDR2 поможет тем, что скорости уарта не хватает "хватать данные с ацп и передавать". С ацп они сыпятся быстрее. Буфер однозначно нужен. По поводу объема данных. Для теста хватит совсем чуть-чуть. К примеру записать 4096 отсчетов. Но а если будет работаь все в реале, т.е постоянно? нужно же будет накапливать отправлять, очищать и снова так по кругу(если я правилно понимаю).
Цитата
Если уж сильно хочется майкроблэйз - добавьте туда еще один уарт. К одному подцепите свой старый, второй киньте на комп.
Не совсем понял как это.
Sergey_Bekrenyov
Sep 15 2013, 19:37
Цитата(vitali36 @ Sep 15 2013, 23:02)

Сергей, DDR2 поможет тем, что скорости уарта не хватает "хватать данные с ацп и передавать". С ацп они сыпятся быстрее. Буфер однозначно нужен. По поводу объема данных. Для теста хватит совсем чуть-чуть. К примеру записать 4096 отсчетов. Но а если будет работаь все в реале, т.е постоянно? нужно же будет накапливать отправлять, очищать и снова так по кругу(если я правилно понимаю).
Не совсем понял как это.
Если не хватает скорости, то ничего не поможет! От того что Вы сложите данные в ДДР данных меньше не станет. Либо прореживать придется, либо фильтровать, либо нужен другой интерфейс - посмотрите в сторону Ethernet. На опенкорес вполне рабочий MAC лежит
Делаете систему с двумя уартами и ддр контроллером. Один цепляете к передатчику в FPGA (там можете скорость задрать), а второй к компьютеру. А уж между ними ставьте хоть ДДР буфер, хоть фильтр ...
Но все же сгенерите ДДР контроллер с помощью MIG - у Вас будет просто доступ ДДР через 2 FIFO. Микроблэйз для Вашей задачи слишком ресурсо-. энерго- и время- затратен
vitali36
Sep 15 2013, 20:43
Я в MIG пытался сделать. Сгенерил контроллер, добавил файлы в проект, их там куча просто. Сплошные компоненты. Ни разу не пользовался ранее MIG. Создал тестбенч(пустой).
В тесте задать можно только входы(clk и reset). А мне нужно же задать адрес, cntrl0_ddr2_a : OUT std_logic_vector(12 downto 0), банк, который буду использовать и т.д. cntrl0_ddr2_ba : OUT std_logic_vector(1 downto 0);
иначе рабоать то не будет. Плюс еще модуль ацп и уарт как туда запилить и связать...
Maverick
Sep 15 2013, 21:10
Цитата(vitali36 @ Sep 15 2013, 23:43)

Я в MIG пытался сделать. Сгенерил контроллер, добавил файлы в проект, их там куча просто. Сплошные компоненты. Ни разу не пользовался ранее MIG. Создал тестбенч(пустой).
В тесте задать можно только входы(clk и reset). А мне нужно же задать адрес, cntrl0_ddr2_a : OUT std_logic_vector(12 downto 0), банк, который буду использовать и т.д. cntrl0_ddr2_ba : OUT std_logic_vector(1 downto 0);
иначе рабоать то не будет. Плюс еще модуль ацп и уарт как туда запилить и связать...
Для начала Вам необходимо разобраться как записывать в память данные и читать из нее. Для этого используйте возможности тестбенч...
MIG должен вроде должен создавать тестбенч к топ-левелу...
Потом создайте FSM которая б это делала в ПЛИС
Можете применять интрумент для отладки чипскоп в железе - смотреть сигналы на входе/выходе...
Как-то так...
Это в кратце... дальше по мере поступления вопросов....
Golikov A.
Sep 16 2013, 04:03
Цитата(vitali36 @ Sep 16 2013, 00:43)

Я в MIG пытался сделать. Сгенерил контроллер, добавил файлы в проект, их там куча просто. Сплошные компоненты. Ни разу не пользовался ранее MIG. Создал тестбенч(пустой).
В тесте задать можно только входы(clk и reset). А мне нужно же задать адрес, cntrl0_ddr2_a : OUT std_logic_vector(12 downto 0), банк, который буду использовать и т.д. cntrl0_ddr2_ba : OUT std_logic_vector(1 downto 0);
иначе рабоать то не будет. Плюс еще модуль ацп и уарт как туда запилить и связать...
по описанию вы не топ левел компонент запустили...
lastpoint
Sep 16 2013, 07:06
Все же, возвращаясь к основной задаче, а Вы уверены, что использование DDR позволит передавать все данные с АЦП? Если проблема в том, что данные приходят не корректно, то скорее всего после отладки проекта при помощи chipscope ее можно будет локализовать и исправить, вполне может быть ошибка типа перепутанного MSB и LSB: все работает по одиночке, а вместе - нет. Вряд ли добавлением новых блоков все решится.
vitali36
Sep 16 2013, 09:32
Вот результат работы на графике оцифрованной синусоиды без использования DDR2(данные с ацп на uart и потом на комп).
И таким макаром весь график. Выложил естественно только часть. Сейчас пытаюсь к microblaze добавить ацп модуль. В user_logic добавил компонент и потом в port map связал так clk => Bus2IP_CLK,
rst => Bus2IP_Reset,
adc_a => IP2RFIFO_Data); Но потом выдает ошибку что еще оказывается нужно вход spi_adc с чем-то связать. С каким-то из этих портов?(как и rst, clk и adc_a)
Bus2IP_Clk : in std_logic;
Bus2IP_Reset : in std_logic;
Bus2IP_Data : in std_logic_vector(0 to C_SLV_DWIDTH-1);
Bus2IP_BE : in std_logic_vector(0 to C_SLV_DWIDTH/8-1);
Bus2IP_RdCE : in std_logic_vector(0 to C_NUM_REG-1);
Bus2IP_WrCE : in std_logic_vector(0 to C_NUM_REG-1);
IP2Bus_Data : out std_logic_vector(0 to C_SLV_DWIDTH-1);
IP2Bus_RdAck : out std_logic;
IP2Bus_WrAck : out std_logic;
IP2Bus_Error : out std_logic;
IP2RFIFO_WrReq : out std_logic;
IP2RFIFO_Data : out std_logic_vector(0 to C_SLV_DWIDTH-1);
IP2RFIFO_WrMark : out std_logic;
IP2RFIFO_WrRelease : out std_logic;
IP2RFIFO_WrRestore : out std_logic;
RFIFO2IP_WrAck : in std_logic;
RFIFO2IP_AlmostFull : in std_logic;
RFIFO2IP_Full : in std_logic;
RFIFO2IP_Vacancy : in std_logic_vector(0 to log2(C_RDFIFO_DEPTH));
IP2WFIFO_RdReq : out std_logic;
IP2WFIFO_RdMark : out std_logic;
IP2WFIFO_RdRelease : out std_logic;
IP2WFIFO_RdRestore : out std_logic;
WFIFO2IP_Data : in std_logic_vector(0 to C_SLV_DWIDTH-1);
WFIFO2IP_RdAck : in std_logic;
WFIFO2IP_AlmostEmpty : in std_logic;
WFIFO2IP_Empty : in std_logic;
WFIFO2IP_Occupancy : in std_logic_vector(0 to log2(C_WRFIFO_DEPTH))
lastpoint
Sep 16 2013, 12:46
Цитата
Вот результат работы на графике оцифрованной синусоиды без использования DDR2(данные с ацп на uart и потом на комп).
И таким макаром весь график. Выложил естественно только часть
Вы пробовали подключаться к входу с АЦП (какой вид графика уже там)? Еще интересна частота АЦП и синусоиды
vitali36
Sep 16 2013, 12:54
Частота дискретизации 3мегасемпла. Частота сигнала не помню какую точно задавал ( около 1кГц ). От полтора кГц уже плохо начинает отрисовывать.
Golikov A.
Sep 16 2013, 13:12
Я бы поступил так.
я бы передавал не данные АЦП, а данные АЦП + Временная метка. тогда сразу было бы ясно теряется что-то или повторяется.
то есть в модуле что принимает данные на каждый принятый отсчет надо увеличивать счетчик и отправлять его вместе с данными АЦП.
думаю 8 бит хватит, чтобы понять что происходит.
а в поступлении отсчетов есть перерывы? И какая максимальная частота поступления отсчетов? Или у Вас считал - передал, и максимальная частота определяется каналом?
lastpoint
Sep 16 2013, 13:13
Цитата
Частота дискретизации 3мегасемпла. Частота сигнала не помню какую точно задавал ( около 1кГц )
- значит на форме где-то 1/100 периода ? И еще, если АЦП 8-битное (это 24000000бит/сек) , а com-port настроен на 9600 бит/сек, то как происходит передача данных на ПК :принял семпл-передал, остальные пропустил или принял несколько семплов-отослал, потом опять часть принял-отослал)? в первом случае частота семплирования намного меньше, чем ожидается, а во втором должны выходить куски сигнала, не связанные с собой
vitali36
Sep 16 2013, 14:55
Ацп 14-ти разрядный. Данные я разделяю. Сначала 8, потом 6 дополненные двумя нулями. А в самой программе на c# данные скидываю в массив, но т.к ацп 14 разрдядный я просто делаю конкатенацию 0 элемент с 1, 2 c 3 и т.д. Скорость 921600. Вы мне скажите график не похож что ли?
Golikov.A. Да, частота определяется самим ацп. Писалось по даташиту все - там прежде чем ацп запустить нужно предусилитель настроить. По поводу временной метки, не очень понял. Вообще я сейчас хочу все это доделать с памятью, вывести график и посмотреть как что) . Только вот не пойму все входы с ацп ли нужно к microblaze подключать. rst, clk и выход с ацп я подключил, ругается потом xps на spi_adc. Вообще хочу спасибо всем сказать что помогаете мне - тратите свое личное время
Sergey_Bekrenyov
Sep 16 2013, 15:10
Цитата(vitali36 @ Sep 16 2013, 18:55)

Ацп 14-ти разрядный. Данные я разделяю. Сначала 8, потом 6 дополненные двумя нулями. А в самой программе на c# данные скидываю в массив, но т.к ацп 14 разрдядный я просто делаю конкатенацию 0 элемент с 1, 2 c 3 и т.д. Скорость 921600. Вы мне скажите график не похож что ли?
Golikov.A. Да, частота определяется самим ацп. Писалось по даташиту все - там прежде чем ацп запустить нужно предусилитель настроить. По поводу временной метки, не очень понял. Вообще я сейчас хочу все это доделать с памятью, вывести график и посмотреть как что) . Только вот не пойму все входы с ацп ли нужно к microblaze подключать. rst, clk и выход с ацп я подключил, ругается потом xps на spi_adc. Вообще хочу спасибо всем сказать что помогаете мне - тратите свое личное время
Прицепите Чипскоп и он выведет Вам график. Вы пытаетесь настроить кучу модулей одновременно.
vitali36
Sep 16 2013, 16:21
Мне не график нужно вывести в данный момент. Я добавляю ацп ( vhdl модуль к микроблейз) . Вернее уже добавил, теперь хочу связать входы-выходы. clk, rst от ацп привязал к Bus2IP_CLK, Bus2IP_Reset, а выход ацп с данными к IP2RFIFO_Data. но ругается xps потом на вход spi_adc. С чем его связать нужно?
Maverick
Sep 16 2013, 16:40
Опишите для ясности чем Вы владеете
- какое ацп
- с помощью какой микросхемы передаете порядка 1 мегабита по юарту (просто возможно передача и на большей скорости например через FIFO, SPI, например это возможно у FTDI)
Golikov A.
Sep 16 2013, 17:35
Модуль АЦП человек написал сам, как я понимаю
учтите что обычно ресет шины (Bus2IP_Reset) обратный, посмотрите какой уровень у нее при ресете, там что-то не как обычно в микросхемах насколько я помню.
Не очень понятно как вы хотите привязать АЦП к фифо, я что-то такого фифо не припоминаю, по описанию оно для чего сделано? Это не от Езернета фифо случаем оторвали?
Про времянную метку я предлагаю вот что
берем счетчик 8 бит, который каждое считывание ацп увеличиваем на 1. и ваши данные с АЦП превращаем
временная метка + данные ацп, то есть 14+8 = 22 бита, потом это передаете на компьютер то есть не 2 байта на отсчет а 3.
если все хорошо там будет
1 АДЦ_код
2 АДЦ код
....
в таком варианте ваши точки графика получают не только Y но и Х координату, и уже можно будет определеннее сказать у вас нарушение данных или их последовательности, может какие то пропускаются, а какие то принимаются слишком долго с паузами.... Если есть какое то синхронизирующее устройство, то времянную метку лучше брать с него, запустить на нем такой же счетчик и забирать каждую синхропосылку...
Смысл локализовать проблему, а потом уже решать ее, а не крутить кучу блоков, половину которых вы соединяете методом тыка (как у меня создается впечатление)
vitali36
Sep 16 2013, 18:26
Ацп Linear Technology LTC1407A-1 ADC. Я так же хочу сделать как в этом примере
http://www.fpgadeveloper.com/2008/10/integ...peripheral.html , только вместо модуля умножителя мой модуль ацп. Фифо не отрывал ни откуда: xps сгенерил вместе с ddr2 похоже. Вот мой проект ( не microblaze ) . там все с комментариями.
Sergey_Bekrenyov
Sep 16 2013, 19:50
Цитата(vitali36 @ Sep 16 2013, 22:26)

Ацп Linear Technology LTC1407A-1 ADC. Я так же хочу сделать как в этом примере
http://www.fpgadeveloper.com/2008/10/integ...peripheral.html , только вместо модуля умножителя мой модуль ацп. Фифо не отрывал ни откуда: xps сгенерил вместе с ddr2 похоже. Вот мой проект ( не microblaze ) . там все с комментариями.
замените данные АЦП на счетчик - проверите стык uart и Ваш софт. И начните с 8 бит
vitali36
Sep 17 2013, 07:44
Ребят, ну выконечно разогнались)) В данный момент пока что задача состоит только в том, чтобы проверить то же самое(не меняя ничего в модклях, без добавления временных меток и т.д), только задействовав память. Посмотреть результат и уже от этого отталкиваться. Для этого я решил использовать microblaze. Создал проект microblaze, в sdk протестировал память и uart - работает. Следующий шаг - добавление модуля ацп. В этой статье(уже кидал ссылку)
http://www.fpgadeveloper.com/2008/10/integ...peripheral.html показано добавление модуля на примере умножителя(два числа перемножаются, записываются в fifo, считываются и по uart передаются на комп). Вот я хочу сделать также, только вместо этого умнжителя мой модуль ацп.
Golikov A.
Sep 17 2013, 10:39
хотите я кину пример где через езернет настраиваются драйверы шаговых двигателей, и вы попробуете свое АЦП вместо мотора воткнуть?..
У вас есть модуль сбора данных с ацп? он может полученные данные выдать на параллельную шину, и дернуть одной ножкой вверх-вниз?
Не может - допишите это дело 10 минут.
Дальше делаете так
микроблайз + уарт
дальше добавляете стандартную IPcore fifo
у него есть вход и выход, подаете данные АЦП на вход, и дергаете ножкой они сохраняются в ФИФО.
дальше это фифо вешаете на шину процессора, для того чтобы забрать данные надо будет просто прочитать из адресного пространства этого модуля и все.
дальше процессором в вечном цикле читаете данные из фифо и кладете в память, а потом читаете из памяти и кладете в уарт, и делаете что хотите...
но реально проблему решаете не с того конца.
я бы взял написал модуль что читает данные с ацп и пихает их в фифо. Для этого сделал бы фифо не на шину проца, а нативным, там есть такая галочка.
Обернул бы этот модуль в модуль что данные из фифо по запросу выдает на проц, это тоже делается через визард (создается шаблон модуля с регистровым доступом и чуть дописывается внутри)
дальше бы все это запустил и читал бы данные из фифо и слал бы их наверх, размер фифо может быть до полумегобайта (зависит от плис). Оттестировтаь тракт хватит. Но только реально никакая память не решит проблемы разности скорость приема и передачи, при условии бесконечности данных...
vitali36
Sep 17 2013, 11:00
Цитата
хотите я кину пример где через езернет настраиваются драйверы шаговых двигателей, и вы попробуете свое АЦП вместо мотора воткнуть?..
Т.е вместо uart попробовать спользовать ethernet и тогда память никакая не нужна?
Цитата
У вас есть модуль сбора данных с ацп? он может полученные данные выдать на параллельную шину, и дернуть одной ножкой вверх-вниз?
Модуль сбора данных с ацп есть. Выдать данные на параллельную шину - это можно организовать.
Цитата
Дальше делаете так
микроблайз + уарт
Микроблайз с uart есть. Сделал проект а xps. Там же ddr2 у меня(при создании проекта указывал).
Цитата
дальше добавляете стандартную IPcore fifo
Это каким образом добавить и где его взять?
Golikov A.
Sep 17 2013, 11:53
Цитата
Т.е вместо uart попробовать спользовать ethernet и тогда память никакая не нужна?
это был сарказм на тему что вы используете не те модули что вам надо, а те что у вас есть...
Вам надо понять так называемый workflow, перестать спешить, сделать 1 раз хорошо а не много раз плохо.
И так, вот как все делается:
1. в платформ студии делаете процессор микроблайз, добавляете уарт, память все что вам надо.
2. в платформ студии делаете шаблон нового модуля
-Hardware -> create or import ... -> create template for new....
задаете где положить модуль, даете ему имя и версию, выбираете тип шины к которой он подключится и так далее
в самом конце не забудьте попросить визард сделать ISE и XST проекты. не делайте сразу мастер, сделайте сначала слейв
3. открываете ISE в нем открываете только что сделанный проект вашего модуля.
в нем вы увидите какие то файлы, есть основной верхний файл, и в нем есть файл user.v(vhd) зависит от того верилог или вхдл вы попросите у визарда.
Это файл - ваша модуль, в нем есть кусок доступа к регистрам со стороны процессора, кусок чтения и записи.
4. теперь в ISE делаете добавить новый модуль, и там выбираете IP core, в выпавшем меню выбираете FIFO, просите сделать его нативным а не на шину (так проще с ним работать в вашем модуле)
5. можете добавить ваш модуль сбора данных с ацп, и собираете все во едино, ваша задача чтобы данные с АЦП попадали в ФИФО, а при запросе на чтение регистра процессором, туда пихались данные из ФИФО.
как диагностировать пустоту фифо придумывайте сами.
6. имплементируете проект в ISE и возвращаетесь в платформ студию
7. в платформ студии импортируете модуль
- hardware -> create or import ... -> import exist
выбираете ваш модуль, теперь в списке доступных модулей в разедел пользовательских (user) добавлен ваш модуль, перетаскиваете его и подключаете к процессору.
8. создаете процессор, и экспортите его в сдк
9. открываете сдк пишите программу.
это базовый поток, НАСТОЯТЕЛЬНО рекомендую по нему пройти, сделать простенький модуль, почитать пописать регистры, по получать данные.
Далее вы сможете сделать модуль который будет мастером на шине, сможет сам пихать данные в ДДР без процессора и так далее, но на первом этапе поскольку процессор у вас ничем не занят можете спокойно перегружать данные из АЦП в память полингом, а фифо позволит не терять их в момент обмена...
также добавление IP core возможны и в платформ студии к процессору напрямую или к другим вашим модулям, среди них множество всяких полезностей: UART, SPI, Ethernert-mac, таймеры, порты ввода-вывода и куча куча куча всего
vitali36
Sep 17 2013, 12:30
Ладно, буду делать все по порядку, как ты сказал. Сгенерил проект в xps, открыл в ise, при добавлении fifo в ip core можно выбрать fifo generator v. 8.5 или 9.1. Но рядом колонки Axi4, axi4-stream, axi4 - lite. Мне не plb случаем нужно?
Golikov A.
Sep 17 2013, 13:21
если фифо к процу на прямую, то плб, если такого нет, то есть переходник.
Но для использования в вашем модуле внутри ISE надо натив фифо, оно вообще не на шину, у него параллельный выход - выход, клок, и строб разрешения чтения и записи...
vitali36
Sep 17 2013, 16:00
у меня ise не ниже 14. Толоко axi4 interface. Может другую ise скачать?
Golikov A.
Sep 17 2013, 17:54
соберитесь, там в начале есть галочка натив фифо! Вам не нужен фифо на шину. Вам нужно встроить фифо в свой модуль, нафига создавать кучу сигналов для шинного фифо. Да, надо будет написать вывод данных в шину через регистр, но это не сложно, полчасика с отладкой...
vitali36
Sep 17 2013, 18:50
Не нахожу такого. Вот скрин.
Golikov A.
Sep 17 2013, 20:15
это когда вы уже выберите фифо
memory and storage-> FIFOs -> fifo Generator
элемент сделается и добавится в проект, потом по нему 2 раза кликните откроется (или сразу по добавлению откроется) визард.
на первой странице натив - акси, ставьте галку натив.
работает оно так, у него есть шина входная и выходная, клок, ресет, и врайт енайбл и реад енайбл. Если фифо не в ресете, то на каждый клок при установленном реад енайбле на выходе появляются данные, а при установленном врайт енайбле данные со входа пихаются в фифо.
то есть алгоритм
считали данные а АЦП, поставили на вход фифо, дернули на 1 клок врайт енайбл и готово.
дальше каждое чтение из регистра с шины (со стороны проца) выставляете данные с выхода фифо на шину, а сами на 1 клок дергаете реад енайбл. вот и все... остается только следить за опустошением - переполнением фифо, в нем есть счетчик данных и соотвествующие сигналы
кстати эти сигналы очень для вас важны, если фифо опустошится значит скорости передачи хватает, если переполнится то нет. Потерь данных с фифо не должно быть, если оно не переполнилось и не опустошилось
vitali36
Sep 17 2013, 21:10
Посмтотри пожалуйста правильно ли там все, вот что получилось пока что(модуль ацп еще не добавлял). Его добавить его то просто как add source? Где его вставить как компонент и связать порты (в каком из файлов). И алгоритм, что ты описал где мне кодить?(спасибо, кстати, что подробно так его описал)).
Golikov A.
Sep 18 2013, 09:48
все делается в файле user. Это файл предоставлен для вас, все остальные файлы - это файлы обертки, максимум когда их надо редактировать это если вы хотите какие то сигналы прокинуть на ружу из вашего юзера. Тогда эти порты объявляется во внешнем файле и прокидываются во внутрь юзера.
архивчик я смог посмотреть только структуру, сами файлики недоступны почему то архив поврежден пишет, 2 раза скачивал, может при заливке сдох...
vitali36
Sep 18 2013, 10:22
Щас еще раз выложу
Golikov A.
Sep 18 2013, 10:28
во я лошара

это у меня среда vhd файл приняла за какой то образ диска)...
ну да ладно. я увидел пустой юзер файл, это не есть верно) его стоило бы наполнить.
А импортить модуль в проект надо уже после того как в ISE вы его напишите, проверите и имплементнете.
Честно не очень понимаю чего вы хотите чтобы я посмотрел

если вас беспокоит что по коду, то лучше кидайте код суда, я его погляжу глазьями, а если по соединениям, то опять же лучше картинки.
У меня виндоус 8 и 64 бита, а для ксалинкса - это приговор, так что работаю на виртуалке (не спрашивайте почему так получилось, это карма

), и надо сделать кучу действий чтобы открыть проект, это утомляет...
vitali36
Sep 18 2013, 10:45
Юзер пустой, потому что я еще не писал там ничего и не добавлял). Вообщем я так понял сейчас я должен сделать вот что: 1) вставить мой vhdl модуль в проект
2) В user файле где написано USER signal declarations added here, as needed for user logic вставить мой компонент моего ацп модуля.
3) Там же в user где написано --USER logic implementation added here связываю с помощью port map мой ацп компонент с портами user файла.
4) И там же в архитектуре описать алгоритм чтения-записи, что ты мне сказал.
Golikov A.
Sep 18 2013, 11:17
да
только есть еще 5 пункт
5. в верхнем модуле в который вставлен ваше user надо "прокинуть" порты что вы добавите на ружу. Ну то есть добавить такие же порты в верхнем модуле, и соединить их со входами юзера.
дальше проверки и имплементайшен
потом импорт его в платформ студию, добавление к процу и так далее...
для начала попробуйте без фифо, просто организовать считывание данных с АЦП в процессор через шину.
vitali36
Sep 18 2013, 11:31
Цитата
для начала попробуйте без фифо, просто организовать считывание данных с АЦП в процессор через шину.
Т.е пока без 4 пункта сделать? (без фифо)
Golikov A.
Sep 18 2013, 12:54
ну да, сделайте шаблон на 4 регистра к примеру. Там будет процедура записи и чтения по адресам регистров, уже визардом сделанная.
Данные с АЦП просто пихайте в один из регистров, а с проца попробуйте почитать по адресу. Если все получится между АЦП и регистром вставите фифо. Совсем в начале можно даже без АЦП

просто поймите как оно все работает...
vitali36
Sep 18 2013, 15:10
Спасибо , буду пробовать)
vitali36
Sep 19 2013, 07:11
Вообщем добавил ацп модуль, добавил ацп как компонент в user , возник вопрос: при связывании портов adc с user портами не знаю, к чему подключить spi_adc(in). И еще: мне похоже нужно будет добавить еще модули приемника и передатчика, т.к я платой управляю(настраиваю предусилитель и включаю ацп) с компа(посылаю по uart команды).
Golikov A.
Sep 19 2013, 08:17
что такое spi_adc(in). Это данные от АЦП или к АЦП.
вам надо юзере сделать такой порт, и к нему подключить. Потом во внешнем модуле сделать такой же порт и подключить его к этому порту юзера.
а уж последний подключить через констраин к нужной ноге плис.
Логично сделать чтобы команды с компа по уарт принимал процессор микроблайз, раскодировал, понимал что надо и делал это. Доступ к ацп все через те же регистры этого же модуля...
vitali36
Sep 19 2013, 09:03
Spi_adc - это вход с ацп. Данные от ацп adc_a : out std_logic_vector(13 downto 0) я привязал к Bus2IP_Data .
Цитата
вам надо юзере сделать такой порт, и к нему подключить.
Т.е я могу в user, где описаны порты Bus2IP_Clk : in std_logic;
Bus2IP_Reset : in std_logic;
Bus2IP_Data : in std_logic_vector(0 to C_SLV_DWIDTH-1);
Bus2IP_BE : in std_logic_vector(0 to C_SLV_DWIDTH/8-1);
Bus2IP_RdCE : in std_logic_vector(0 to C_NUM_REG-1);
Bus2IP_WrCE : in std_logic_vector(0 to C_NUM_REG-1);
IP2Bus_Data : out std_logic_vector(0 to C_SLV_DWIDTH-1);
IP2Bus_RdAck : out std_logic;
IP2Bus_WrAck : out std_logic;
IP2Bus_Error : out std_logic создавать порты, которые мне будут нужны и потом привязывать? Там просто написано Bus protocol ports, do not add to or delete
Т.е, например у меня есть N количество портов в ацп модуле. Этот модуль я вставляю в проект, потом как компонент в user файл. Порты ацп, которые мне не нужно связывать с портами user файла , но их нужно вывести потом наружу (задать в ucf ) я добавляю к user портам и связываю. А порты ацп, которые мне не нужно ни связывать с user портами, ни выводить наружу, я просто объявляю сигналы(с таким же названием) и связываю их с ними . И в топ файле верхнего уровня сделать тоже самое. Так я понимаю?))
Golikov A.
Sep 19 2013, 13:17
топ файл - это транзитный файл для сигналов.
Те что идут с шины проца в нем преобразауются для удобства и идут в юзер файл
те что идут с наружи плис транзитом проходят в юзер
те что идут из юзера на шину, преобразуются для понимания шиной и отдаются процу
те что из юзера идут на ружу проходят транзитом
если вы сигналами внутри юзера модули соединили, то и ладно, не надо сигнал выводить в топ, там соединять с другим и заводить обратно.
в целом в топе не должно быть связей, он сделан только для разбора шины и преобразования ее в удобный для работы вид.
Цитата(vitali36 @ Sep 19 2013, 13:03)

Spi_adc - это вход с ацп. Данные от ацп adc_a : out std_logic_vector(13 downto 0) я привязал к Bus2IP_Data .
нет так нельзя.
Bus2IP_Data - это вообще входные данные шины преобразованные для вашего удобства в вектор.
шина к айпи ( 2 - это тип two, фонетическое сокращение to)
IP2Bus_Data - это данные от вашего модуля на шину, но и к ним нельзя привязывать АЦП, потому что есть еще адрес и прочая лабудень
при создании шаблона модуля укажите что вы хотите в нем иметь 4 регистра, и посмотрите, там будет 2 блока
в одном эти регистры будут записываться данными с шины, а в другом выдавать на шину, в зависимости от значения чипселекта - который есть декодировка адреса
вам надо с ацп получить данные, и записать их в один из этих регистров, тогда при чтении по нужному адресу вы получите данные.
данные что хотите подать на АЦП по СПИ протоколу, надо передать спец модулем, взять готовый или сделать свой, который будет получать данные по шине в регистр и выдавливать его СПИ интерфейсов на вход АЦП. Среди IP корок было готово СПИ, но его и самому сделать хоть в вашем юзере делов то на часик.
Цитата
Там просто написано Bus protocol ports, do not add to or delete
это именно в этом месте нельзя добавлять и менять, для вас выделили местечко повыше, там написано типа пользовательские сигналы добавляйте здесь, или по ниже...
это условное разделение на области для удобства чтения
vitali36
Sep 19 2013, 17:28
Я так понял выход с ацп нужно приязывать будет ко входу одного из регистров. А что за шаблон-модуль с указанием регистров? Как его создавать?
Цитата
данные что хотите подать на АЦП по СПИ протоколу, надо передать спец модулем, взять готовый или сделать свой, который будет получать данные по шине в регистр и выдавливать его СПИ интерфейсов на вход АЦП
Мне это точно не нужно. Работа с ацп и получением данных на вход описана в моем модуле, что я добавляю. Делал строго по даташиту
Golikov A.
Sep 19 2013, 17:53
еще разок...
в платформ студии есть
hardware -> create or add perif...
в ней можно выбрать create new, ну вы это делали судя по тому что у вас есть модуль.
так вот где то по ходу визарда можно указать сколько регистров вы хотите.
я не пробовал хотеть 1 регистр

, всегда хотел несколько, потому у меня всегда в юзер был добавлен кусок где идет разбор адреса и запись - чтение этих регистров.
у вас навярняка тоже есть такой кусок.
сделайте wire подключите его к выходу вашего АЦП, а при чтении какого хотите из регистров, выдайте этот сигнал на шину вместо него, или просто каждый такт сохраняйте значение wire в регистр...
ну вообщем и целом проявите сообразительность) слишком долго вы уже топчитесь вокруг несложной штуки...
vitali36
Sep 19 2013, 18:39
Не этот случайно?)
FIFO_CNTL_SM_COMB : process( WFIFO2IP_empty, WFIFO2IP_RdAck, RFIFO2IP_full, RFIFO2IP_WrAck, fifo_cntl_cs ) is
begin
-- set defaults
fifo_rdreq_cmb <= '0';
fifo_wrreq_cmb <= '0';
fifo_cntl_ns <= fifo_cntl_cs;
case fifo_cntl_cs is
when IDLE =>
-- data is available in the write fifo and there's space in the read fifo,
-- so we can start transfering the data from write fifo to read fifo
if ( WFIFO2IP_empty = '0' and RFIFO2IP_full = '0' ) then
fifo_rdreq_cmb <= '1';
fifo_cntl_ns <= RD_REQ;
end if;
when RD_REQ =>
-- data has been read from the write fifo,
-- so we can write it to the read fifo
if ( WFIFO2IP_RdAck = '1' ) then
fifo_wrreq_cmb <= '1';
fifo_cntl_ns <= WR_REQ;
end if;
when WR_REQ =>
-- data has been written to the read fifo,
-- so data transfer is done
if ( RFIFO2IP_WrAck = '1' ) then
fifo_cntl_ns <= IDLE;
end if;
when others =>
fifo_cntl_ns <= IDLE;
end case;
end process FIFO_CNTL_SM_COMB;
FIFO_CNTL_SM_SEQ : process( Bus2IP_Clk ) is
begin
if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then
if ( Bus2IP_Reset = '1' ) then
IP2WFIFO_RdReq <= '0';
IP2RFIFO_WrReq <= '0';
fifo_cntl_cs <= IDLE;
else
IP2WFIFO_RdReq <= fifo_rdreq_cmb;
IP2RFIFO_WrReq <= fifo_wrreq_cmb;
fifo_cntl_cs <= fifo_cntl_ns;
end if;
end if;
end process FIFO_CNTL_SM_SEQ;
Golikov A.
Sep 19 2013, 18:45
если только случайно...
это что? похоже на какую то обертку от ФИФО для подключения к шине. Я уверен что если написать в яндексе код верилог или код ВХДЛ вы найдете огромное количество программного кода, только какой в этом всем смысл?
Я все больше и больше уверяюсь в том что вы решаете задачу методом ленивого перебора. То есть даже анализ выбранных методом тыка элементов вы хотите повесить на других.
вам стоит еще раз перечитать все выше сказанное и аккуратно не торопясь сесть все делать...