Преобразование 8-разрядной шины в 7-разрядную с помощью ПЛИС

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
super_bum
Сообщения: 162

Сообщение super_bum » 10 янв 2018, 10:55

Всем привет. Помогите придумать алгоритм преобразования 8-битной шины в 7-битную. По 8-битной шине приходят пачки байт с временными промежутками между ними. За это время(пачка+пауза) нужно эту же информацию отстучать с помощью 7-битной шины. Как это лучше сделать?

Аватара пользователя
BSVi
Адепт
Сообщения: 3466
Откуда: Киев

Сообщение BSVi » 10 янв 2018, 11:44

Использовать 6 разрядную шину, и выделить одну линию под фазу передачи передачи. Итого, все передастся за 2 такта. Фаза 0 + первые 6 бит, фаза 1 + оставшиеся 2 бита

super_bum
Сообщения: 162

Сообщение super_bum » 10 янв 2018, 12:46

Проблема в том, что все это делать нужно синхронно. На вход приходят пачки по 204 байта, промежутки между ними 52 байта(или такта). 1 такт - на вход приходят 8 бит, на выходе появляются 7 бит. 2 такт - на входе следующие 8 бит, на выходе 1 бит байта из такта 1, 6 бит из такта 2. 3 такт - на входе следующие 8 бит, на выходе 2 бита байта из такта 2 и 5 битов из такта 3. И так далее.

Аватара пользователя
BSVi
Адепт
Сообщения: 3466
Откуда: Киев

Сообщение BSVi » 10 янв 2018, 13:07

Можно и такую систему организовать, но нужна синхронизация в любом случае. 6 битную шину использовать не получится, поэтому должна быть какая-то запрещенная комбинация на шине. Если ее нет, то дела плохи и нужно более системно что-то придумывать.

T1m
Сообщения: 80
Откуда: г. Донецк

Сообщение T1m » 10 янв 2018, 21:37

Использовать манчестерское кодирование? Тогда самотактируемой шина будет. Правда на приемнике нужен будет достаточно вменяемый источник опорной частоты...

Аватара пользователя
BSVi
Адепт
Сообщения: 3466
Откуда: Киев

Сообщение BSVi » 10 янв 2018, 23:05

Манчестер требует двойной полосы.

super_bum
Сообщения: 162

Сообщение super_bum » 11 янв 2018, 01:35

С этим тоже напряг, тактовая частота только одна, ФАПЧ отсутствует.

T1m
Сообщения: 80
Откуда: г. Донецк

Сообщение T1m » 11 янв 2018, 14:39

Так, стоп, у тебя есть тактовая частота (у шины?) И она не пропадает во время паузы в передаче 8-битной шины?
И ты ее можешь до принимающей стороны довести?
Тогда проблем нет, щас накидаю логическую схему.

UPD:неосилил это сделать в logisim, а VHDL/Verilog я не знаю.
Опишу словами: нужен сдвиговый регистр 204 бит длиной, сдвигающий на 7 бит за такт (сдвиг по низкому уровню тактового сигнала)
По высокому уровню мы заталкиваем по 8 бит в сдвиговый регистр, каждый такт смещаясь на 1 бита - т.е. сначала записываем в биты 0..7, потом в 1..8 и т.д.
Последний раз редактировалось T1m 11 янв 2018, 17:26, всего редактировалось 2 раза.

super_bum
Сообщения: 162

Сообщение super_bum » 11 янв 2018, 17:09

Конечно тактовая есть, шины не самотактируемые. Однако бодрейт на входе и на выходе должен быть одинаковый.
Почему на 6? Сдвиг до определенного момента будет разным.

T1m
Сообщения: 80
Откуда: г. Донецк

Сообщение T1m » 11 янв 2018, 17:25

Аай, ошибся я со сдвигом, у нас же выходная шина 7 бит.
исправил предыущий пост.

super_bum
Сообщения: 162

Сообщение super_bum » 11 янв 2018, 17:49

Тоже над таким вариантом думал, но получится ли одновременно писать и читать данные из одной и той же ячейки? Мне кажется, вряд ли.

Аватара пользователя
TAN
Сообщения: 122
Откуда: РФ

Сообщение TAN » 11 янв 2018, 20:36

Бехрам, а зачем писать и читать одновременно?

Если шина не скоростная, то можно сделать два счетчика и общий ФСМ контроля. Первый счетчик бы формировал адрес для записи, а ФСМ писал бы в память побитно из входного буфера 8 бит, инкрементя первый счетчик. После этого второй счетчик формировал бы адреса для чтения, а ФСМ писал бы из памяти побитно в выходной буфер группами по 7 бит, инкрементя второй счетчик. И все. Главное, шоб ресурсы позволяли енто проделывать за время между посылками.

Это первое, что на ум пришло.

super_bum
Сообщения: 162

Сообщение super_bum » 12 янв 2018, 09:48

ЯННП :D
Клок примерно 27МГц, фпга предполагается макс 10, думаю, мощи хватит.
> а ФСМ писал бы в память побитно из входного буфера 8 бит
Как? Он только пачками по 8 бит сможет писать. Частота клока в 2 раза выше частоты входного сигнала, поэтому на считывание данных из буфера есть только 1 такт.

Аватара пользователя
TAN
Сообщения: 122
Откуда: РФ

Сообщение TAN » 12 янв 2018, 19:50

Поэтому я и написал о скорости. Давай еще раз уточним, как приходят данные: по параллельной шине 8 бит с частотой обновления данных 54 МГЦ или как-то иначе? Что за внешний клок и как он завязан на входной и выходной буферы? Сколько длится пауза между записью и выплевыванием? От всего этого зависит дизайн. Из твоих сообщений ничего этого не понятно.

super_bum
Сообщения: 162

Сообщение super_bum » 12 янв 2018, 20:49

Данные приходят по параллельной 8-битной шине с частотой примерно 27МГц. Клок привязан к частоте входных данных. Он глобальный, на выходе будет он же. Я вот в квартусе диаграмму набросал. Data - вход, out - выход. Clock - тактирование. Паузы между записью и выплевыванием быть не должно(если это возможно).

На рисунке, на шине out, выделен первый пришедший байт. Видно что он забивает все 7 линий первого такта и одну линию 2 такта. И так далее, каждый раз будет осуществляется сдвиг на 1 бит.

На вход приходят пачки по 204 байта, пауза между ними 52 такта. За время паузы нужно выплюнуть все, что накопилось в буфере.

Как-то так.
Вложения
Снимок экрана (6).png

Аватара пользователя
TAN
Сообщения: 122
Откуда: РФ

Сообщение TAN » 12 янв 2018, 22:33

>Паузы между записью и выплевыванием быть не должно(если это возможно).

Пауза будет в любом случае и не меньше одного периода клока ПЛИС, который может быть меньше глобального клока, ибо схема синхронная. Это требование бредовое.

Данная задача требует битовой адресации буфера, это очевидно.

Так что три варианта:

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

2. Либо с битовым массивом, как выше написали, но надо плиску пошустрее.

3. Можно сделать в лоб, на массиве распределенной памяти и жестких коммутаторах шин записи-чтения. Это будет жрать меньше всего тактов. Нетлист такой кракозябры сформировать автоматически.

P.S. Я бы, наверное, попробовал 3й вариант.

super_bum
Сообщения: 162

Сообщение super_bum » 13 янв 2018, 13:55

TAN писал(а):1. Для уменьшения числа тактов плиски в пределах такта глобального клока

ФАПЧ нет, поэтому нет возможности повысить частоту внутре плиски, к сожалению, нет. С фапчем, конечно, было бы гораздо проще.

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 1225
Откуда: Киев

Сообщение iEugene0x7CA » 25 янв 2018, 13:18

super_bum писал(а):ФАПЧ нет, поэтому нет возможности повысить частоту внутре плиски, к сожалению, нет. С фапчем, конечно, было бы гораздо проще.

Повысить нельзя... Но ведь можно же снизить?
Воткнуть генератор пошустрее и наделать нужных клоков таймерами. :lol:

Вообще сейчас загуглил и странно: https://www.altera.com/en_US/pdfs/liter ... clkpll.pdf
Упоминаются и PLL, и встроенный генератор клока вплоть до 116 МГц.

Еще, это касается глобально цифровой логики — есть хитрая техника по удвоению и даже учетверению клока без всяких PLL, используя небольшую аналоговую хитрость.
http://dqydj.com/how-to-double-clock-fr ... tal-logic/
В данном случае используется элемент XOR с некоторой задержкой на одном из входов.
На низкой частоте это может быть RC цепочка, на более высокой длинная дорожка на плате.
XOR детектит состояние, когда на одном входе есть 1, а на другом 0, и получается такой себе генератор импульсов с частотой 2X от входной.
Если в добавок юзать передний и задний фронты клока — получится учетверение. Ну, или можно сразу юзать передний и задний фронты для удвоения. ;)

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость