Jump to content
    

Microblaze+DDR2+UART

топ файл - это транзитный файл для сигналов.

Те что идут с шины проца в нем преобразауются для удобства и идут в юзер файл

те что идут с наружи плис транзитом проходят в юзер

те что идут из юзера на шину, преобразуются для понимания шиной и отдаются процу

те что из юзера идут на ружу проходят транзитом

 

если вы сигналами внутри юзера модули соединили, то и ладно, не надо сигнал выводить в топ, там соединять с другим и заводить обратно.

в целом в топе не должно быть связей, он сделан только для разбора шины и преобразования ее в удобный для работы вид.

 

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

 

это именно в этом месте нельзя добавлять и менять, для вас выделили местечко повыше, там написано типа пользовательские сигналы добавляйте здесь, или по ниже...

 

это условное разделение на области для удобства чтения

Share this post


Link to post
Share on other sites

Я так понял выход с ацп нужно приязывать будет ко входу одного из регистров. А что за шаблон-модуль с указанием регистров? Как его создавать?

данные что хотите подать на АЦП по СПИ протоколу, надо передать спец модулем, взять готовый или сделать свой, который будет получать данные по шине в регистр и выдавливать его СПИ интерфейсов на вход АЦП
Мне это точно не нужно. Работа с ацп и получением данных на вход описана в моем модуле, что я добавляю. Делал строго по даташиту

Share this post


Link to post
Share on other sites

еще разок...

в платформ студии есть

hardware -> create or add perif...

в ней можно выбрать create new, ну вы это делали судя по тому что у вас есть модуль.

 

так вот где то по ходу визарда можно указать сколько регистров вы хотите.

я не пробовал хотеть 1 регистр:), всегда хотел несколько, потому у меня всегда в юзер был добавлен кусок где идет разбор адреса и запись - чтение этих регистров.

 

у вас навярняка тоже есть такой кусок.

сделайте wire подключите его к выходу вашего АЦП, а при чтении какого хотите из регистров, выдайте этот сигнал на шину вместо него, или просто каждый такт сохраняйте значение wire в регистр...

 

ну вообщем и целом проявите сообразительность) слишком долго вы уже топчитесь вокруг несложной штуки...

Share this post


Link to post
Share on other sites

Не этот случайно?)

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;

Share this post


Link to post
Share on other sites

если только случайно...

 

это что? похоже на какую то обертку от ФИФО для подключения к шине. Я уверен что если написать в яндексе код верилог или код ВХДЛ вы найдете огромное количество программного кода, только какой в этом всем смысл?

 

Я все больше и больше уверяюсь в том что вы решаете задачу методом ленивого перебора. То есть даже анализ выбранных методом тыка элементов вы хотите повесить на других.

 

вам стоит еще раз перечитать все выше сказанное и аккуратно не торопясь сесть все делать...

Share this post


Link to post
Share on other sites

Хорошо. Да я этот код юзал уже. Xps его сгенерил под ddr2 мою. Что-то не могу найти эти регистры. Где этот кусок находится? В user Точно нету.

Edited by vitali36

Share this post


Link to post
Share on other sites

signal slv_reg0 : std_logic_vector(0 to C_SLV_DWIDTH-1);

signal slv_reg1 : std_logic_vector(0 to C_SLV_DWIDTH-1);

signal slv_reg2 : std_logic_vector(0 to C_SLV_DWIDTH-1);

signal slv_reg3 : std_logic_vector(0 to C_SLV_DWIDTH-1);

signal slv_reg_write_sel : std_logic_vector(0 to 3);

signal slv_reg_read_sel : std_logic_vector(0 to 3);

signal slv_ip2bus_data : std_logic_vector(0 to C_SLV_DWIDTH-1);

signal slv_read_ack : std_logic;

signal slv_write_ack : std_logic;

 

Это?) Ну и там дальше логика описана их.. Заново просто создал проект(там кол-во 4 указал как ты сказал)

Edited by vitali36

Share this post


Link to post
Share on other sites

вот можете если хотите:)

 

теперь если вы подключите этот модуль ничего не меняя то сможете писать и читать ваши регистры

Адрес модуля + Адрес регистра. Адреса через 4 байта.

 

 

Дальше вам надо изменить этот модуль так чтобы данные АЦП сохранялись в регистр.

 

А дальше чтобы данные АЦП сохранялись в фифо, а выход фифо в регистр по каждому чтению из регистра.

 

я уверен вы справитесь!

Share this post


Link to post
Share on other sites

Дальше вам надо изменить этот модуль так чтобы данные АЦП сохранялись в регистр.

signal t_adc_a ( 13 downto 0 ) - тот wire, про который вы говорили. Он же связан с выходом ацп (adc_a => t_adc_a). Этому сигналу мне и нужно выполнять присвоение : допустим если регистр 2, то slv_reg2 <= t_adc_a . Так?

И еще: я добавил вот эти порты в описания портов в user : t_spi_adc : in std_logic; --LOC = D16;

t_amp_done : out std_logic; --LOC = R20;

t_adc_done : out std_logic; --LOC = T19;

t_adc_start : out std_logic; --LOC = U20;

t_amp_cs : out std_logic; --LOC = V20;

t_start_conv : out std_logic; --LOC = Y6;

t_spi_mosi : out std_logic; --LOC = AB14;

t_spi_sck : out std_logic; --LOC = AA20;

Их мне нужно будет потом на ножки вывести. Правильно?

Share this post


Link to post
Share on other sites

в целом да.

 

есть одна тонкость

slv_reg2 может быть записан через шину из проца. Так что присваивать в него данные надо либо под тем же клоком по которому происходит запись, либо убрать вообще его из списка записываемых. А то будет конфликт 2 источника данных у регистра.

Share this post


Link to post
Share on other sites

По сути можно вообще один регистр юзать) зачем их 4) Алгоритм работы fifo пока не писать, сначала просто данные с ацп в регистр и с регистра по uart да? Кстати, я еще щас добавлю мои модули работы uart(там приемник и передатчик). Но в проце уже есть uart(автоматически сгенеринный) и там похоже свой алгоритм. Как он узнает что нужно на мои модули uart ориентироваться?

Edited by vitali36

Share this post


Link to post
Share on other sites

можно и 1, но еще хорошо настройки ацп как то передавать, это второй регистр, выбирать чего - то и так далее... были бы регистры, а там придумаете...

 

вы подключите ваш уарт, как процессор узнает что это уарт?... если вас тревожит вопрос как проц узнает что принтф надо отправлять в уарт, так это делается через спец библиотеку, которая по специальному хедеру определяет модули уарта написанные ксалинксом и в них обращается, это чисто для отладки, потому что даже между 2 ксалиновских уартов эта функция не разбирается. В настройках проекта можно указывать куда идет вывод спринтфа и с этим лучше не играть.

 

К ксалинковскому уарту есть библиотека как в него писать и читать, рекомендую воспользоваться ей для передачи своих данных по уарту, а спринтф оставить для отладки и не более.

 

Ваш уарт надо делать через тот же интерфейс с регистрами на шине...

 

 

Share this post


Link to post
Share on other sites

Не, с спринтфом я ничего не хочу делать. Это все для отладки в sdk. Я просто наверно плохо объяснил. Когда я создал проект в xps(без ip), я экспортнул его в sdk, чтобы протестировать. При создании проекта я указывал что в проце будет rs-232 dce. Потом в sdk создал тестовые проекты, так вот все работало, и по uart там передавалось что память инициализирована или тот же hello world. Если бы я просто хотел бы увидеть оцифрованные данные в том же com-port toolkit, то без проблем. Но мне нужно платой то управлять из программы(c#), там у меня есть кнопка которая открывает порт, потом жму кнопку настроить ацп и предусилитель(по uart посылется команда, загораются диоды что все ок), и потом уже жму кнопку считать данные на комп. Т.е нужно мои модули работы uart еще добавить, и некоторые порты тоже наружу вывести

Share this post


Link to post
Share on other sites

это не уарт, это модуль настройки АЦП с УАРТ интерфейсом.

 

Нет он не только не нужен, а и вреден!

вы писали модуль с автоматом который принимает данные и настраивает АЦП, теперь у вас есть процессор, он и должен это сделать.

 

Так что система у вас должна быть КОМП -----------(УАРТ) МикроБлайз (ШИНА)------------ АЦП

Никаких прямых каналов КОМП - АЦП быть не должно. Микроблайз должен настроить АЦП, обработать, собрать данные, и послать в компьютер. Он теперь ядро вашей системы. Единственное что можно это организовать ДМА канал АЦП - ПАМЯТЬ. И если есть отдельный не управляющий УАРТ то сделать второй канал ПАМЯТЬ - этот УАРТ. Но управлять всем должен микроблайз согласно данным по основному уарту.

 

На канале комп - микроблайз вам надо сделать интерфейс, лучше что-то стандартное подобрать, модбас или что-то подобное

 

Share this post


Link to post
Share on other sites

Микроблайз должен настроить АЦП, обработать, собрать данные, и послать в компьютер. Он теперь ядро вашей системы

Микроблайз все это делает автоматически? Если он автоматически включает мой ацп, собирает и отправляет, то тогда вообще идеально. Я просто с компа приму данные и все)

Edited by vitali36

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...