Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Avalon & WaitRequest
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Kuzmi4
Здравствуйте.

Делал тут я недавно периферийку - и решил её запхнуть в NIOSII систему.
Чтобы не муксить клоки, решил чтение синхронизовать с входным клоком для периферии.И потом выдавать флаг.
Значится про WaitRequest нашёл такое:
Нажмите для просмотра прикрепленного файла
Потом сварганил враппер чтоб он работал как на вышеприведённой картинке, просимулил его.
Нажмите для просмотра прикрепленного файла
Как видно из рисунка, WaitRequest взводится как раз до начала rising_edge(основной клок - 25МГц).
Но в результате тестов в железе - имеем чтение только 1-го символа с фифо - остальные - идентичны(что 10 что 20 символов) wacko.gif
Вчера клок даже до 10 МГц опускал - всё равно все символы одинаковые (чтение остальных регистров, что без WaitRequest - нормально)...
Файлы прицепил.
Нажмите для просмотра прикрепленного файла
Есть у кого идеи отчего так может быть ?
07.gif

Если кто-то раньше дизайнил периферию с WaitRequest - можете прицепить экзампл - чтоб я посмотрел как оно точно работает. help.gif
Спасибо.
Postoroniy_V
Цитата(Kuzmi4 @ Jul 25 2008, 17:21) *
Здравствуйте.

Делал тут я недавно периферийку - и решил её запхнуть в NIOSII систему.
Чтобы не муксить клоки, решил чтение синхронизовать с входным клоком для периферии.И потом выдавать флаг.
Значится про WaitRequest нашёл такое:
Нажмите для просмотра прикрепленного файла
Потом сварганил враппер чтоб он работал как на вышеприведённой картинке, просимулил его.
Нажмите для просмотра прикрепленного файла
Как видно из рисунка, WaitRequest взводится как раз до начала rising_edge(основной клок - 25МГц).
Но в результате тестов в железе - имеем чтение только 1-го символа с фифо - остальные - идентичны(что 10 что 20 символов) wacko.gif
Вчера клок даже до 10 МГц опускал - всё равно все символы одинаковые (чтение остальных регистров, что без WaitRequest - нормально)...
Файлы прицепил.
Нажмите для просмотра прикрепленного файла
Есть у кого идеи отчего так может быть ?
07.gif

Если кто-то раньше дизайнил периферию с WaitRequest - можете прицепить экзампл - чтоб я посмотрел как оно точно работает. help.gif
Спасибо.

чисто от безделия и от интереса к фразе Чтобы не муксить клоки глунял и при..фигел
у вас два клок домена и от одного к другому готовность вы передаёте так вот просто и не затейливо
Avalon_waitrequest <= read_from_data_reg and (not data_now_prepared);
data_now_prepared - это как раз от вашего компонента....
мне вот не кажется что вам срочно нужно почитать про всякую там метасбильность и там синхронность ну и прочую фигню

ну а я бы использовал двух портовое двух клочное озу для таких целей как у вас
Удачи!
Kuzmi4
2 Postoroniy_V - спрашивал уже... глухо..

А на счёт простого перехода - тут вы правы - без перехода в avalon_clock клоковый домен, но есть примерчик, тоесть вырезка из рабочего прожекта. Там приблизительно такое :
Код
rxf_chipselect_s <= '1' when chipselect='1' and address(3 downto 0) = ADD_RXFIFO else '0';
rxf_read_s <= rxf_chipselect_s and read_signal;
process(clk,reset)
begin
    if(reset='1') then
        rxf_waitcycle_s <='0';
        rxf_read_ack_s <= '0';
    elsif(rising_edge(clk)) then
        if(rxf_read_s='1') then
            if(rxf_waitcycle_s='1') then
                rxf_read_ack_s <= '1';
            else
                rxf_waitcycle_s <= '1';
            end if;
        else
            rxf_waitcycle_s<='0';
            rxf_read_ack_s <= '0';
        end if;
    end if; -- RST_i
end process;
waitrequest <= rxf_read_s and not rxf_read_ack_s;

Нажмите для просмотра прикрепленного файла
Тут в принципе на одном клоковом домене, но всё же если посмотреть на временную диаграммку всё равно получается что waitrequest поднимается и опускается относительно клока не совсем я бы сказал синхронно..
sad.gif
А вот где кстати про эти ужасы метасбильности, синхронности ну и самое главное прочую фигню где можно прочитать?
Postoroniy_V
Цитата(Kuzmi4 @ Jul 25 2008, 23:10) *
2 Postoroniy_V - спрашивал уже... глухо..

....
А вот где кстати про эти ужасы метасбильности, синхронности ну и самое главное прочую фигню где можно прочитать?

загляните в faq

waitreqeust может быть выставлен когда угодно, но он должен быть стабилен до следующего переднего фронта тактовой на авалон шине а не вашей input_clk

глянул ещё раз в код и не понял

Data_prepared <= delay_chain(3);
....
elsif (falling_edge(Input_clk)) then
delay_chain <= delay_chain(2 downto 0) & Read_request;

то есть работает всё верное! как вы и написали! по идее waitreqeust может остаться навечно в 1

Кузмич, извините но, что-то я устал....почему вы не читаете доки или читаете по диагонали?
Asb
Цитата(Kuzmi4 @ Jul 25 2008, 18:10) *
А вот где кстати про эти ужасы метасбильности, синхронности ну и самое главное прочую фигню где можно прочитать?

http://www.sunburst-design.com/papers/
Правда по английски и с примерами на Verilog, но вообще очень не плохо в частности
"Synthesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs"
Kuzmi4
2 Asb - спасибо, почитаемс..

2 Postoroniy_V -
спецификации авалона читал, оттуда собно и узнал проWaitRequest и что он должен быть установлен до следующего rising_edge авалоновского клока.
И собственно говоря это я и получаю =>
Цитата
read_from_data_reg and (not data_now_prepared)
даёт нам установленный WaitRequest через 10 с копейками нс после выставления нужной комбинации (пока всё декодится и пройдёт через луты).
Далее, data_now_prepared устанавливается как раз после того как был импульс на clock_enable компонента:
delay_chain <= delay_chain(2 downto 0) & Read_request - это мы подгоняем наш Read_request под Input_clock.
далее, логика
Цитата
strobe <= (not delay_chain(2)) and delay_chain(1)

Выставляет нам строб, чтоб до rising_edge Input_clock он уже был установлен.
Ну а как раз после strobe будет идти delay_chain(3) что и будет знаком что данные готовы.
Итого - data_now_prepared привязана как раз к клокам Input_clock - так что пока Input_clock тикает, а оно тикает пока есть питание, то data_now_prepared будет выставлен всегда.
и того вроде как раз всё согласно картинке с спецификации авалона для работы с WaitRequest:
Нажмите для просмотра прикрепленного файла
Так что получается что всё вроде сделано согласно тому как написано в документации.
Единственное что я пока заметил с вопиющего - data_now_prepared у меня привязана к Input_clock а не авалоновскому клоку, хотя по правилам нужно было перейти к авалоновском клоковому домену. Сегодня переработаю.. Но не ужели из-за этого оно всё и не работает ????
Postoroniy_V
Цитата(Kuzmi4 @ Jul 26 2008, 00:16) *
2 Asb - спасибо, почитаемс..

2 Postoroniy_V -
спецификации авалона читал, оттуда собно и узнал проWaitRequest и что он должен быть установлен до следующего rising_edge авалоновского клока.
И собственно говоря это я и получаю => даёт нам установленный WaitRequest через 10 с копейками нс после выставления нужной комбинации (пока всё декодится и пройдёт через луты).
Далее, data_now_prepared устанавливается как раз после того как был импульс на clock_enable компонента:
delay_chain <= delay_chain(2 downto 0) & Read_request - это мы подгоняем наш Read_request под Input_clock.
далее, логика

Выставляет нам строб, чтоб до rising_edge Input_clock он уже был установлен.
Ну а как раз после strobe будет идти delay_chain(3) что и будет знаком что данные готовы.
Итого - data_now_prepared привязана как раз к клокам Input_clock - так что пока Input_clock тикает, а оно тикает пока есть питание, то data_now_prepared будет выставлен всегда.
и того вроде как раз всё согласно картинке с спецификации авалона для работы с WaitRequest:

Так что получается что всё вроде сделано согласно тому как написано в документации.
Единственное что я пока заметил с вопиющего - data_now_prepared у меня привязана к Input_clock а не авалоновскому клоку, хотя по правилам нужно было перейти к авалоновском клоковому домену. Сегодня переработаю.. Но не ужели из-за этого оно всё и не работает ????

неужели в самом деле погорели карусели smile.gif шучу
Раз не работает - значит что то сделано не согласно докам smile.gif
у вас клок что на инпуте, вы опускали до 10 МГц. так ведь? а ниос на какой частоте работал?
то есть до момента появления вайтреквеста может пройти более 30 нс а скажем у ниос тактовая 50 МГц...
понимаете о чём я?
Kuzmi4
Цитата
неужели в самом деле погорели карусели

smile.gif +1

На счёт 30 нан и 50МГц на ниосе - в симуляции говорится про 12 нан с момента выставления последнего нужного сигнал до установки WaitRequest`а - это ж и получается как раз предел частоты...
А на счёт понижения тактовой ниоса - я заводил NIOSII аж на 10MHz (там варнинги были что дебуг требует минимум 20 , но я как то решил что обойдётся..Может и тут надо было послушаться) - на 10 и получал идентичные...
Input_clock - сварганил тестовый - там около мегагерца.
Вот тут то и загвоздка как раз - вроде бы всё согласно требованиям, но в железе вообсче не ясно какое поведение....

Мне тут кроме правильного перехода на авалоновски клоковый домен больше ничего в голову не приходит.....
wacko.gif
мдя..
Kuzmi4
Значит перевёл data_now_prepared на Avalon-овский клок.
Проверил - симуляция показывает всё то же - что работать должно, а в реальном тесте на железе - всё то же самое => только 1-й байт... Систему заводил на 25 МГц..
Вот теперь точно тупик...Куда рыть ??
wacko.gif
Данные с симуляцией и VHDL
Postoroniy_V
Цитата(Kuzmi4 @ Jul 27 2008, 20:57) *
Значит перевёл data_now_prepared на Avalon-овский клок.
Проверил - симуляция показывает всё то же - что работать должно, а в реальном тесте на железе - всё то же самое => только 1-й байт... Систему заводил на 25 МГц..
Вот теперь точно тупик...Куда рыть ??
wacko.gif
Данные с симуляцией и VHDL

да всё туда же smile.gif
сигнал тап вас рассудит smile.gif

з.ы. плохо моделировали
Kuzmi4
2 Postoroniy_V
Цитата
да всё туда же

а можно поточнее ? - вроде ж теперь всё по правилам, с переходами с одного домена на другой, клок 40нс при времени реакции WaitRequest ~12нс ....
Postoroniy_V
Цитата(Kuzmi4 @ Jul 27 2008, 22:47) *
2 Postoroniy_V

а можно поточнее ? - вроде ж теперь всё по правилам, с переходами с одного домена на другой, клок 40нс при времени реакции WaitRequest ~12нс ....

ещё раз - воспользуйтесь сигнал тапом!
Kuzmi4
2 Postoroniy_V - та понял уже.
Начинаю хелпы читать по этой страшной шняге smile3046.gif , а то не сильно знаком с этой страшной штукой .......
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.