Преобразование 8-разрядной шины в 7-разрядную с помощью ПЛИС
Всем привет. Помогите придумать алгоритм преобразования 8-битной шины в 7-битную. По 8-битной шине приходят пачки байт с временными промежутками между ними. За это время(пачка+пауза) нужно эту же информацию отстучать с помощью 7-битной шины. Как это лучше сделать?
Использовать 6 разрядную шину, и выделить одну линию под фазу передачи передачи. Итого, все передастся за 2 такта. Фаза 0 + первые 6 бит, фаза 1 + оставшиеся 2 бита
Проблема в том, что все это делать нужно синхронно. На вход приходят пачки по 204 байта, промежутки между ними 52 байта(или такта). 1 такт - на вход приходят 8 бит, на выходе появляются 7 бит. 2 такт - на входе следующие 8 бит, на выходе 1 бит байта из такта 1, 6 бит из такта 2. 3 такт - на входе следующие 8 бит, на выходе 2 бита байта из такта 2 и 5 битов из такта 3. И так далее.
Можно и такую систему организовать, но нужна синхронизация в любом случае. 6 битную шину использовать не получится, поэтому должна быть какая-то запрещенная комбинация на шине. Если ее нет, то дела плохи и нужно более системно что-то придумывать.
Использовать манчестерское кодирование? Тогда самотактируемой шина будет. Правда на приемнике нужен будет достаточно вменяемый источник опорной частоты...
С этим тоже напряг, тактовая частота только одна, ФАПЧ отсутствует.
Так, стоп, у тебя есть тактовая частота (у шины?) И она не пропадает во время паузы в передаче 8-битной шины?
И ты ее можешь до принимающей стороны довести?
Тогда проблем нет, щас накидаю логическую схему.
UPD:неосилил это сделать в logisim, а VHDL/Verilog я не знаю.
Опишу словами: нужен сдвиговый регистр 204 бит длиной, сдвигающий на 7 бит за такт (сдвиг по низкому уровню тактового сигнала)
По высокому уровню мы заталкиваем по 8 бит в сдвиговый регистр, каждый такт смещаясь на 1 бита - т.е. сначала записываем в биты 0..7, потом в 1..8 и т.д.
И ты ее можешь до принимающей стороны довести?
Тогда проблем нет, щас накидаю логическую схему.
UPD:неосилил это сделать в logisim, а VHDL/Verilog я не знаю.
Опишу словами: нужен сдвиговый регистр 204 бит длиной, сдвигающий на 7 бит за такт (сдвиг по низкому уровню тактового сигнала)
По высокому уровню мы заталкиваем по 8 бит в сдвиговый регистр, каждый такт смещаясь на 1 бита - т.е. сначала записываем в биты 0..7, потом в 1..8 и т.д.
Последний раз редактировалось T1m 11 янв 2018, 17:26, всего редактировалось 2 раза.
Конечно тактовая есть, шины не самотактируемые. Однако бодрейт на входе и на выходе должен быть одинаковый.
Почему на 6? Сдвиг до определенного момента будет разным.
Почему на 6? Сдвиг до определенного момента будет разным.
Аай, ошибся я со сдвигом, у нас же выходная шина 7 бит.
исправил предыущий пост.
исправил предыущий пост.
Тоже над таким вариантом думал, но получится ли одновременно писать и читать данные из одной и той же ячейки? Мне кажется, вряд ли.
Бехрам, а зачем писать и читать одновременно?
Если шина не скоростная, то можно сделать два счетчика и общий ФСМ контроля. Первый счетчик бы формировал адрес для записи, а ФСМ писал бы в память побитно из входного буфера 8 бит, инкрементя первый счетчик. После этого второй счетчик формировал бы адреса для чтения, а ФСМ писал бы из памяти побитно в выходной буфер группами по 7 бит, инкрементя второй счетчик. И все. Главное, шоб ресурсы позволяли енто проделывать за время между посылками.
Это первое, что на ум пришло.
Если шина не скоростная, то можно сделать два счетчика и общий ФСМ контроля. Первый счетчик бы формировал адрес для записи, а ФСМ писал бы в память побитно из входного буфера 8 бит, инкрементя первый счетчик. После этого второй счетчик формировал бы адреса для чтения, а ФСМ писал бы из памяти побитно в выходной буфер группами по 7 бит, инкрементя второй счетчик. И все. Главное, шоб ресурсы позволяли енто проделывать за время между посылками.
Это первое, что на ум пришло.
ЯННП
Клок примерно 27МГц, фпга предполагается макс 10, думаю, мощи хватит.
> а ФСМ писал бы в память побитно из входного буфера 8 бит
Как? Он только пачками по 8 бит сможет писать. Частота клока в 2 раза выше частоты входного сигнала, поэтому на считывание данных из буфера есть только 1 такт.
Клок примерно 27МГц, фпга предполагается макс 10, думаю, мощи хватит.
> а ФСМ писал бы в память побитно из входного буфера 8 бит
Как? Он только пачками по 8 бит сможет писать. Частота клока в 2 раза выше частоты входного сигнала, поэтому на считывание данных из буфера есть только 1 такт.
Поэтому я и написал о скорости. Давай еще раз уточним, как приходят данные: по параллельной шине 8 бит с частотой обновления данных 54 МГЦ или как-то иначе? Что за внешний клок и как он завязан на входной и выходной буферы? Сколько длится пауза между записью и выплевыванием? От всего этого зависит дизайн. Из твоих сообщений ничего этого не понятно.
Данные приходят по параллельной 8-битной шине с частотой примерно 27МГц. Клок привязан к частоте входных данных. Он глобальный, на выходе будет он же. Я вот в квартусе диаграмму набросал. Data - вход, out - выход. Clock - тактирование. Паузы между записью и выплевыванием быть не должно(если это возможно).
На рисунке, на шине out, выделен первый пришедший байт. Видно что он забивает все 7 линий первого такта и одну линию 2 такта. И так далее, каждый раз будет осуществляется сдвиг на 1 бит.
На вход приходят пачки по 204 байта, пауза между ними 52 такта. За время паузы нужно выплюнуть все, что накопилось в буфере.
Как-то так.
На рисунке, на шине out, выделен первый пришедший байт. Видно что он забивает все 7 линий первого такта и одну линию 2 такта. И так далее, каждый раз будет осуществляется сдвиг на 1 бит.
На вход приходят пачки по 204 байта, пауза между ними 52 такта. За время паузы нужно выплюнуть все, что накопилось в буфере.
Как-то так.
>Паузы между записью и выплевыванием быть не должно(если это возможно).
Пауза будет в любом случае и не меньше одного периода клока ПЛИС, который может быть меньше глобального клока, ибо схема синхронная. Это требование бредовое.
Данная задача требует битовой адресации буфера, это очевидно.
Так что три варианта:
1. Для уменьшения числа тактов плиски в пределах такта глобального клока можно писать в буфер не побитно, а побайтно. А читать по-очереди два соседних байта, из которых потом комбинаторной схемой выделять требуемые семь бит. Сдвиг комбинаторной схемы, как и адреса байтов для записи и чтения задаются счетчиками с разным модулем пересчета.
2. Либо с битовым массивом, как выше написали, но надо плиску пошустрее.
3. Можно сделать в лоб, на массиве распределенной памяти и жестких коммутаторах шин записи-чтения. Это будет жрать меньше всего тактов. Нетлист такой кракозябры сформировать автоматически.
P.S. Я бы, наверное, попробовал 3й вариант.
Пауза будет в любом случае и не меньше одного периода клока ПЛИС, который может быть меньше глобального клока, ибо схема синхронная. Это требование бредовое.
Данная задача требует битовой адресации буфера, это очевидно.
Так что три варианта:
1. Для уменьшения числа тактов плиски в пределах такта глобального клока можно писать в буфер не побитно, а побайтно. А читать по-очереди два соседних байта, из которых потом комбинаторной схемой выделять требуемые семь бит. Сдвиг комбинаторной схемы, как и адреса байтов для записи и чтения задаются счетчиками с разным модулем пересчета.
2. Либо с битовым массивом, как выше написали, но надо плиску пошустрее.
3. Можно сделать в лоб, на массиве распределенной памяти и жестких коммутаторах шин записи-чтения. Это будет жрать меньше всего тактов. Нетлист такой кракозябры сформировать автоматически.
P.S. Я бы, наверное, попробовал 3й вариант.
TAN писал(а):1. Для уменьшения числа тактов плиски в пределах такта глобального клока
ФАПЧ нет, поэтому нет возможности повысить частоту внутре плиски, к сожалению, нет. С фапчем, конечно, было бы гораздо проще.
- iEugene0x7CA
- Адепт
- Сообщения: 1570
- Откуда: Киев
super_bum писал(а):ФАПЧ нет, поэтому нет возможности повысить частоту внутре плиски, к сожалению, нет. С фапчем, конечно, было бы гораздо проще.
Повысить нельзя... Но ведь можно же снизить?
Воткнуть генератор пошустрее и наделать нужных клоков таймерами.
Вообще сейчас загуглил и странно: 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 от входной.
Если в добавок юзать передний и задний фронты клока — получится учетверение. Ну, или можно сразу юзать передний и задний фронты для удвоения.
Вернуться в «Микроконтроллеры и ПЛИС»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей