|
DC_FIFO, прошу помощи |
|
|
|
Dec 12 2016, 12:33
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Вот в чем вопрос. Есть 24 битный последовательный сигнал. Нужно ли его переводить в параллельный 24 битный для подачи на вход dual clock FIFO? (Разрядность вход - выход останется без изменений, 24 бита.) Или можно сделать FIFO с параметрами LPM_WIDTH - 1. На входа wrreg и rdreg подавать импульсы записи и чтения длиной 24 такта. Частоты wrclk и rdclk поданные на FIFO будут пока будут одинаковы, возможно rdclk будет в два раза выше. (Использовать кучу DFF в качестве синхронизатора просьба не предлагать.  )
|
|
|
|
|
Dec 12 2016, 13:06
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Evgeny72 @ Dec 12 2016, 15:33)  Вот в чем вопрос. Есть 24 битный последовательный сигнал. Нужно ли его переводить в параллельный 24 битный для подачи на вход dual clock FIFO? (Разрядность вход - выход останется без изменений, 24 бита.) Или можно сделать FIFO с параметрами LPM_WIDTH - 1. На входа wrreg и rdreg подавать импульсы записи и чтения длиной 24 такта. Частоты wrclk и rdclk поданные на FIFO будут пока будут одинаковы, возможно rdclk будет в два раза выше. (Использовать кучу DFF в качестве синхронизатора просьба не предлагать.  ) Да без проблем сделать 1 бит FIFO - будет у Вас на выходе такой же последовательный сигнал что и на входе. Я бы добавил еще бит для передачи признака начала (или конца) пакета раз при записи на входе уже формируется окно приема но это уж Вам виднее. Успехов! Rob.
|
|
|
|
|
Dec 12 2016, 13:40
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(RobFPGA @ Dec 12 2016, 16:06)  Да без проблем сделать 1 бит FIFO - будет у Вас на выходе такой же последовательный сигнал что и на входе. Я бы добавил еще бит для передачи признака начала (или конца) пакета раз при записи на входе уже формируется окно приема но это уж Вам виднее. Ксайлинкс позволяет иметь разную разрядность для двухпортовки... Один порт - битовый, другой - словами нужной разрядности... Признаки начала-конца и ошибки, так я и делал...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Dec 12 2016, 14:55
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Цитата(RobFPGA @ Dec 12 2016, 17:06)  Приветствую!
Да без проблем сделать 1 бит FIFO - будет у Вас на выходе такой же последовательный сигнал что и на входе. Я бы добавил еще бит для передачи признака начала (или конца) пакета раз при записи на входе уже формируется окно приема но это уж Вам виднее.
Успехов! Rob. Спасибо, Rob! По всей видимости, этого бита мне и не хватает. Если сигналы записи/чтения клоков синхронны, все все ок. Все выходные биты на месте. Как только имитирую разные клоки (сдвигаю клок чтения относительно клока записи на некоторое значение ns), конец первого пакета из 24 бит вываливается в начале второго пакета из 24 бит и т.д. Тестировал в симуляторе и в железе. Про бит передачи признака начала (или конца) пакета можете поподробнее написать?
|
|
|
|
|
Dec 12 2016, 15:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Evgeny72 @ Dec 12 2016, 17:55)  Спасибо, Rob! По всей видимости, этого бита мне и не хватает. Если сигналы записи/чтения клоков синхронны, все все ок. Все выходные биты на месте. Как только имитирую разные клоки (сдвигаю клок чтения относительно клока записи на некоторое значение ns), конец первого пакета из 24 бит вываливается в начале второго пакета из 24 бит и т.д. Тестировал в симуляторе и в железе. Про бит передачи признака начала (или конца) пакета можете поподробнее написать? На то оно и FIFO - на выходе вы видете только ФАКТ прихода бита а пакетную синхронизацию никто за вас делать не будет. А вот как ее делать и где ее проще соорудить сильно зависит от требуемой логики работы Вашего устройства Допустим на входе приходит НЕПРЕРЫВНЫЙ пакет из ФИКСИРОВАННОГО числа бит - соответственно есть строб записи пакета - либо внешний сигнал либо как то получен из данных В простейшем случае в FIFO пишете бит данных на каждом такте когда стоб==1 и в первом бите пакета или в последнем 1 во второй бит. Соответственно при чтении из FIFO увидев во втором бите 1 точно можно знать где начался/окончился пакет (ну а дальше трудится счетчик бит). Если пакет не фиксированной длинны то проще иметь доп 2 бита для старт/стоп отдельно. Успехов! Rob.
|
|
|
|
|
Dec 12 2016, 19:15
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Если я Вас, RobFPGA и krux, правильно понял, то: - создаю FIFO с параметрами LPM_WIDTH - 2 (2 битное), - на вход записи wrreg подаю импульс длиной 24 такта, - на стороне записи в FIFO формирую бит начала данных пакета, - на вход DATA[0] (1 бит FIFO) подаю данные, - на вход DATA[1] (2 бит FIFO) подаю бит начала данных пакета, - с выхода q[0] получаю данные, - с выхода q[1] считываю бит начала данных пакета который подаю на счетчик. Счётчик формирует импульс длиной 24 такта по приходу бита начала данных . Импульс с выхода счётчика подаю на вход чтения rdreg. Данные всегда 24 бита. Правильно?
|
|
|
|
|
Dec 13 2016, 02:17
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(Evgeny72 @ Dec 13 2016, 02:15)  Если я Вас, RobFPGA и krux, правильно понял, то: - создаю FIFO с параметрами LPM_WIDTH - 2 (2 битное), - на вход записи wrreg подаю импульс длиной 24 такта, - на стороне записи в FIFO формирую бит начала данных пакета, - на вход DATA[0] (1 бит FIFO) подаю данные, - на вход DATA[1] (2 бит FIFO) подаю бит начала данных пакета, - с выхода q[0] получаю данные, - с выхода q[1] считываю бит начала данных пакета который подаю на счетчик. Счётчик формирует импульс длиной 24 такта по приходу бита начала данных . Импульс с выхода счётчика подаю на вход чтения rdreg. Данные всегда 24 бита. Правильно? А не проще ли слепить комбинацию сдвиговый регистр + обычное фифо? И все разборки с границами 24-битного слова делать внутри этого сдвигового регистра (пишем по битовому клоку, выгружаем в фифошку по признаку конца слова) ?
|
|
|
|
|
Dec 13 2016, 04:26
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Цитата(Bad0512 @ Dec 13 2016, 06:17)  А не проще ли слепить комбинацию сдвиговый регистр + обычное фифо? И все разборки с границами 24-битного слова делать внутри этого сдвигового регистра (пишем по битовому клоку, выгружаем в фифошку по признаку конца слова) ? Возможно и проще.  только пока смутно представляю работу сего. и к выше написанному мною, надо добавить начальный начало считывания данных из FIFO, возможно по сигналу заполнения wrfull.
Сообщение отредактировал Evgeny72 - Dec 13 2016, 04:30
|
|
|
|
|
Dec 13 2016, 06:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Evgeny72 @ Dec 12 2016, 22:15)  Если я Вас, RobFPGA и krux, правильно понял, то: ... начала данных . Импульс с выхода счётчика подаю на вход чтения rdreg. Данные всегда 24 бита. Правильно? А вот тут не совсем правильно В данной схеме - НЕ гарнируется что на выходе fifo пакет будет "одним куском" в 24 бита - скорее наоборот так как скорость чтения выше чем записи. Нужно ваш "счетчик" and fifo_read_data_valid Если же требуется обеспечить вычитку именно целого пакета непрерывным куском то можно a ) fifo cо счетчиком слов на чтение - как увидели что слов в fifo >=24 начинаем читать. b ) 2 fifo :fifo А разрядностью 1 бит для данных, fifo B разрядностью 0 бит - наличие пакета для чтения как только записали в fifo A 24 бита записываем одно слово в fifo B - соответственно увидев наличие слова для чтения в B можно начинать считывания 24 бит из A c ) сгенерировать корку пакетного fifo d ) .... ... Цитата(Evgeny72) Возможно и проще. rolleyes.gif только пока смутно представляю работу сего. А вот этом главная проблема - потому как не поняв в целом задачу нельзя найти оптимальное решение. А тут еще и куча советников "помогают"  Успехов! Rob.
|
|
|
|
|
Dec 13 2016, 08:54
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Спасибо за советы! Посмотрев ещё раз документацию на FIFO, решил поиграться с длинами сигналов записи/чтения. В принципе, в симуляторе показывает верно. Таиминги прилагаю. Насколько корректно это сделано... Это для 20 бит.  задача простая - привязка двух входных сигналов (DATA_FIFO и примерно такой же сигнал, как wrreg ) к другому клоковому домену. Домены асинхронны. Делал на триггерах, не понравилось. Хочу попробовать на ФИФО сделать.
Сообщение отредактировал Evgeny72 - Dec 13 2016, 10:17
|
|
|
|
|
Dec 13 2016, 12:54
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(Flip-fl0p @ Dec 13 2016, 14:43)  Раз уж создана тема про FIFO... Не могли бы вы подсказать, а как правильно рассчитать глубину FIFO буфера. Гугл по запрусу "расчёт глубины FIFO" ничего не выдал... выбирается чаще на один или несколько пакетов данных Кроме или как дополнение к фифо можно рассматреть двойную буфферизацию Например в фифо записывается пакет данных, если данные прошли валидность (CRC проверку, дальнейшее декодирование(Хемминг, БЧХ, LDPC)), то данные переписываются буффер хранения данных (bram) Буффер хранения данных (bram) можно организовать в виде двойного буффера. В одну область только пишем из другой области памяти только читаем... Соответственно разные порты памяти. Все зависит от требований: скорости обновления информации на приемнике (как часто нужно обновлять данные) объемом передаваемых данных скорости передачи данных ошибок при передачи канал связи дуплекс/полудуплекс и т.д.
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Dec 13 2016, 14:15
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Цитата(vikk @ Dec 13 2016, 16:49)  По времянке куча вопросов: - если частоты на глаз одинаковы - почему сигнал чтения длиннее сигнала записи? и, на эту же тему - почему читаем из пустого фифо, если rdreq = сигнал чтения?
осенило )))) может в фифо есть защита от чтения пустого фифо... но тогда вопрос, как подсветить валидный пакет и не подсвечивать выход пустого фифо? судя по картинке задержка в такт от сигнала rdempty... если последний бит будет 1, то эта единица и будет висеть до прихода след. пакета. Очень нужна подсветка валидности. Дополнительные биты хорошая идея - для одинаковой длины больше ниче не надо, при разной добавляем еще счетчик, очень полезно - частота чтения смещена. Сейчас точно не напишу на сколько, возможно на 1,5 - 2,5 ns. "почему сигнал чтения длиннее сигнала записи?" сам хочу понять - почему? Судя по странице из документации, они должны быть одной "длины". При длине импульса чтения равным 20 - 24 такта, конец данных из первого пакета, выходит в начале второго пакета, конец второго вначале первого и т.д. Писал выше. Экспериментировал с длиной чтения/записи, получилось что надо, но, на мой взгляд, криво.
Сообщение отредактировал Evgeny72 - Dec 13 2016, 14:23
|
|
|
|
|
Dec 13 2016, 14:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Flip-fl0p @ Dec 13 2016, 15:43)  Раз уж создана тема про FIFO... Не могли бы вы подсказать, а как правильно рассчитать глубину FIFO буфера. Гугл по запрусу "расчёт глубины FIFO" ничего не выдал... О! это серьезная наука которую начинают постигать еще в школе с задачи о бассейне и двух трубах Очень зависит от типа/циклов работы входных - выходных потоков. В общем случае глубина_бассеина = ((средний_входной_поток_за_цикл - средний_выходной_поток_за_цикл)*t_цикла + (пиковый_входной_поток*задержка_на_чтение)) * К_с_потолка Успехов! Rob.
|
|
|
|
|
Dec 13 2016, 15:57
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(RobFPGA @ Dec 13 2016, 17:29)  Приветствую! О! это серьезная наука которую начинают постигать еще в школе с задачи о бассейне и двух трубах Очень зависит от типа/циклов работы входных - выходных потоков. В общем случае глубина_бассеина = ((средний_входной_поток_за_цикл - средний_выходной_поток_за_цикл)*t_цикла + (пиковый_входной_поток*задержка_на_чтение)) * К_с_потолка Успехов! Rob. Спасибо ! Что-то к концу дня мозги отключаются.  Ведь это действительно задача о бассейне школьного курса. В таком контексте я её не рассматривал. Ну почему всегда простые вещи оказываются сложными, а сложные оказываются простыми ?
|
|
|
|
|
Dec 25 2016, 11:03
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Приложите кто-нибудь схему реализации или тайминги сигналов пожалуйста. Перебрал несколько вариантов, и в симуляторе и в железе, не могу правильно считать (может быть записать) данные из ФИФО. Или данные плыть через некоторое время начинают или считываются не правильно или и то и другое.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|