|
|
  |
FIFO на CoolRunner-II, Или как без него жить? |
|
|
|
Dec 30 2008, 10:20
|
Частый гость
 
Группа: Свой
Сообщений: 161
Регистрация: 19-01-08
Из: Питер
Пользователь №: 34 234

|
Сразу оговорюсь, в программируемой логике я зелен как огурец. Но встала задача, а мне интересно сделать её самому. Имеется CPLD CoolRunner-II, в который данные закачиваются контроллером по SPI, который тактируется тоже контроллером. Задача принять по нему байт и далее произвести обработку. Проблема в том, что клок SPI не совпадает с клоком, на котором работает все остальное. Подсказывают взять асинхронный FIFO, но в Xilinx Core Generator не хочет его генерировать для CoolRunner'а. Отсюда вопрос, как грамотно и с наименьшим геморроем перекинуть данные из регистра с одного клока на другой? P.S.: Всех с наступающим
Сообщение отредактировал DMax - Dec 30 2008, 10:20
|
|
|
|
|
Dec 30 2008, 13:04
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418

|
Цитата(DMax @ Dec 30 2008, 13:20)  Отсюда вопрос, как грамотно и с наименьшим геморроем перекинуть данные из регистра с одного клока на другой? Как я понимаю, поток данных не очень большой? По клоку СПИ данные грузятся в регистр и перекидывается строб на принимающий клок. На принимающем клоке строб захватывается через 2 триггера и ловится факт изменения его состояния (итого 3 триггера). По этой отмашке с регистра, который на клоке СПИ, данные подхватываются и начинается обработка.
|
|
|
|
|
Dec 30 2008, 14:07
|
Частый гость
 
Группа: Свой
Сообщений: 161
Регистрация: 19-01-08
Из: Питер
Пользователь №: 34 234

|
Цитата(Kuzmi4 @ Dec 30 2008, 14:08)  А так на пальцах - в идеале вам нужно былоб поставить 2-х клоковое асинхроннойе фифо (клок на запись и клок на чтение) и слева загружать в неё данные по своему клоку - а справа по FullFlag смотреть когда загружено и вычитывать по своему клоку (как всё вычитаете - выставится EmptyFlag и слева логика опять начнёт загрузку данных - и так по кругу). Ну так я об этом и написал. Проблема только в том, что ядра для асинхронного фифо нет. Или асинхронный фифо - это то, что должен уметь писать каждый ламмер? Я просто, ей богу, первый раз за это взялся. Цитата(LordVader @ Dec 30 2008, 16:04)  Как я понимаю, поток данных не очень большой? Ну где-то в 4 раза медленней, чем клок CPLD. Цитата(LordVader @ Dec 30 2008, 16:04)  По клоку СПИ данные грузятся в регистр и перекидывается строб на принимающий клок. На принимающем клоке строб захватывается через 2 триггера и ловится факт изменения его состояния (итого 3 триггера). По этой отмашке с регистра, который на клоке СПИ, данные подхватываются и начинается обработка. А триггеры эти какими клоками запитывать? Чего-то погуглил по кузьмичевским ключевым словам. Сходу ничего полезного не нашлось  (
|
|
|
|
|
Dec 30 2008, 14:12
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418

|
Цитата(DMax @ Dec 30 2008, 17:07)  А триггеры эти какими клоками запитывать? На клоке СПИ схема грузит данные в регистр и перекидывает строб На принимающем клоке строб ресинхронизируется (2 триггера) и ловится изменение его состояния (ещё один). Ну и грузятся выходы регистра на клоке СПИ. Предполагается, что выход регистра СПИ не изменяется в течение всего процесса ресинхронизации.
|
|
|
|
|
Dec 30 2008, 15:14
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 DMax - на счёт так сказать оцифровывания - глобальная идея такова: Код process(<clock>) begin if (<clock>'event and <clock> = '1') then if (<reset> = '1') then Q1 <= '0'; Q2 <= '0'; Q3 <= '0'; else Q1 <= D_IN; Q2 <= Q1; Q3 <= Q2; end if; end if; end process; В результате у вас получается 3 тригера в цепочке - 1-й - входной(на него подавать данные), 3-й выходной(с него забирать данные). А на счёт фифо - на кулранере фифо не организовывал - не скажу как это, но нормальное фифо на CPLD - по моему это малореально.. Вот тема - я тут как раз подымал вопрос асинхронного сигнала(немного не то, но идею объяснит я думаю). Как раз счас колупаю что то похожее - данные на вход подаются асинхронно глобальному клоку FPGA(клок рождается в FPGA он обсолютно идентичен тому на которой работает дизайн, но выходит наружу, там перепетии разные, потом заходт в другую FPGA(которая на другой плате), и она по нему уже выдаёт данные) - и что самое интересное дизайн собран так что оно даже правильно ловит  , вот только если что-то тронуть - всё валится (видимо имеет место очень большое везение что ли) Кстати, а сколько кулранера уже занято ?
|
|
|
|
|
Dec 31 2008, 15:02
|
Частый гость
 
Группа: Свой
Сообщений: 161
Регистрация: 19-01-08
Из: Питер
Пользователь №: 34 234

|
Цитата(Kuzmi4 @ Dec 30 2008, 18:14)  2 DMax - на счёт так сказать оцифровывания - глобальная идея такова: Код process(<clock>) begin if (<clock>'event and <clock> = '1') then if (<reset> = '1') then Q1 <= '0'; Q2 <= '0'; Q3 <= '0'; else Q1 <= D_IN; Q2 <= Q1; Q3 <= Q2; end if; end if; end process; В результате у вас получается 3 тригера в цепочке - 1-й - входной(на него подавать данные), 3-й выходной(с него забирать данные). Хм... а в чем принцип, если не секрет? То есть, что будет, если Q1 <= D_IN и фронт клока произойдет где-то по середине фронта D_IN? В Q1 окажется какая-то хрень, а что дальше? Она перекачует на следующем такте в Q2, а потом в Q3. И не понятно, как делу помогает, то что регистра три, а не пять или 10. Цитата(Kuzmi4 @ Dec 30 2008, 18:14)  А на счёт фифо - на кулранере фифо не организовывал - не скажу как это, но нормальное фифо на CPLD - по моему это малореально.. А почему? Там нет блочного ОЗУ? А разве на распределенной ФИФО нельзя сделать?
|
|
|
|
|
Jan 3 2009, 08:36
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(DMax @ Dec 31 2008, 18:02)  Хм... а в чем принцип, если не секрет? То есть, что будет, если Q1 <= D_IN и фронт клока произойдет где-то по середине фронта D_IN? В Q1 окажется какая-то хрень, а что дальше? Она перекачует на следующем такте в Q2, а потом в Q3. И не понятно, как делу помогает, то что регистра три, а не пять или 10. Это стандартная схема подавления метастабильности. Как и почему она работает -- ищите в гугле. Цитата А почему? Там нет блочного ОЗУ? А разве на распределенной ФИФО нельзя сделать? Там никакой памяти нет. Там нет LUT, которая и представляет собой распределённую память. Там даже очень мало триггеров. Структура CPLD сильно отличается о структуры FPGA. Посмотрите уже datasheet на ту CPLD, с которой работаете.
|
|
|
|
|
Jan 4 2009, 19:35
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418

|
Цитата(DMax @ Dec 31 2008, 18:02)  Хм... а в чем принцип, если не секрет? То есть, что будет, если Q1 <= D_IN и фронт клока произойдет где-то по середине фронта D_IN? В Q1 окажется какая-то хрень, а что дальше? Она перекачует на следующем такте в Q2, а потом в Q3. И не понятно, как делу помогает, то что регистра три, а не пять или 10. Эта вот "какая-то хрень" за время между тактами стабилизируется на лог. 0 или лог. 1 и в Q2 запишется уже стабильное значение. А Q3 используется для определения фронта сигнала (Q2!=Q3).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|