Size: a a a

2020 October 28

EF

Elvis Fox in Deus Volt!
Vadimatorik
Вопрос по ПЛИС
Делаю сейчас простое устройство по работе. По сути, конфигурируемый PWM генератор (ну только под задачу и достаточно странный. Готовых нет. МК - не вариант)
На вход: шина SPI-слейв. По переходу CS в low (active) происходит фиксация параметров регистров, которые далее отправляются в ответ. Если установлен еще 1 бит физической линии, то в момент отправки значений регистров в мастера производится еще и установка параметров звеньев (о них далее).
На выход: есть 16-32 звена (блоки, которые генерируют ШИМ (почти). Все одинаковы. На каждый надо 3 32-х битных конфигурационных значения (3 регистра)). Каждый модуль еще с обратной связью и может в регистры конфигурации биты выставлять.
Вопрос: как организовать лучше эксклюзивный доступ на чтение-запись?
Мои варианты решения:
1. Создать регистровый файл на нужное количество регистров (для всех модулей PWMn) и модуль, который проходится по всем регистрам и дублирует их регистры-дубликаты из каждого модуля.
2. Сделать у регистрового файла кучу шин. Чтобы все были независимы. Уже звучит как говнокод.
обычно описываю управляющие регистры прямо в блоке периферии (у вас 3 регистра, я так понимаю), далее я бы проинстанциировал массив блоков PWM, вывел шины и в одну строку бы замаскировал valid в зависимости от нескольких битов адреса.
источник

EF

Elvis Fox in Deus Volt!
в IO мапе описать три регистра с Z стейтами там где номер блока (при условии что там casez)
источник

EF

Elvis Fox in Deus Volt!
с rdata решение опять же либо мультиплексировать, либо просто выдавать нули, когда не активен доступ, и делать OR. В результате синтеза может даже получиться одно и то же
источник

V

Vadimatorik in Deus Volt!
Примерно понял, о чем вы. Дочитаю главу за сегодня и, думаю, точно пойму.
А у вас не найдется примера на git? Пишу на system verilog.
источник

EF

Elvis Fox in Deus Volt!
на github к сожалению нет, но когда-то я такое делал, надо поискать
источник

V

Vadimatorik in Deus Volt!
Elvis Fox
на github к сожалению нет, но когда-то я такое делал, надо поискать
Буду благодарен) Раньше не сталкивался просто с такой задачей. Обычно всегда были задачи от одного входа к одному выходу. Иногда с обратной связью. Но не более.
источник

EF

Elvis Fox in Deus Volt!
Я перечитал ваше первое сообщение, и не уверен, что полностью правильно понял задачу. В чем заключается обратная связь? Меняется состояние регистров PWM блока? Или всё же PWM блок меняет регистры другого блока?
источник

В

Владимир in Deus Volt!
Илья
Так-с, JLink сегодня были ко мне отправлены, предварительно 2-го ноября начнется рассылка
В Томске собирали?
источник

V

Vadimatorik in Deus Volt!
Переслано от Vadimatorik
Вот тут уточню.
источник

V

Vadimatorik in Deus Volt!
Переслано от Vadimatorik
Писать в регистр может всегда один. То есть вот регистры каждого модуля.
CFG - пишет только SPI
ERR - пишет PWM
ARR - пишет только SPI
источник

V

Vadimatorik in Deus Volt!
Переслано от Vadimatorik
CMP - пишет только SPI
источник

И

Илья in Deus Volt!
Владимир
В Томске собирали?
Ага, вот они: https://exteh.ru/mounting.html
источник

V

Vadimatorik in Deus Volt!
При этом каждый pwm перезагружает счетчик, когда переполняется. То есть загружает в счетчик значение из регистра. Может оказаться так, что все 16 счетчиков обновятся в один момент и захотят данные из регистров.
источник

V

Vadimatorik in Deus Volt!
Читать могут все у всех.
источник

V

Vadimatorik in Deus Volt!
То есть pwmn читает данные всех своих регистров, когда ему нужны эти данные для принятия решения.
А spi, когда требуется защелкнуть текущее состояние данных и ответить ими по spi.
источник

EF

Elvis Fox in Deus Volt!
Архитектурно делать каждый блок мастером на шине - это плохое решение - сложно и множество нюансов, арбитры нужны и т.д.
Если блок меняет только свои регистры, то лучше эти регистры описать прямо в блоке и вывести из него шину. Не обязательно вообще делать 1-в-1 соответствие регистра и того что читается/пишется через I/O. Там может присутствовать дополнительная логика между шиной и непосредственно регистрами.
источник

EF

Elvis Fox in Deus Volt!
Vadimatorik
То есть pwmn читает данные всех своих регистров, когда ему нужны эти данные для принятия решения.
А spi, когда требуется защелкнуть текущее состояние данных и ответить ими по spi.
Тут надо разделить что значит "читает". Это последовательный доступ (через шину) или комбинаторный доступ (выход регистра идет прямо на какую-то логику).
источник

V

Vadimatorik in Deus Volt!
Elvis Fox
Архитектурно делать каждый блок мастером на шине - это плохое решение - сложно и множество нюансов, арбитры нужны и т.д.
Если блок меняет только свои регистры, то лучше эти регистры описать прямо в блоке и вывести из него шину. Не обязательно вообще делать 1-в-1 соответствие регистра и того что читается/пишется через I/O. Там может присутствовать дополнительная логика между шиной и непосредственно регистрами.
Вот тоже думал. Что нет общего регистрового файла. Наружу только адрес записи/чтения и шина данных записи/чтения.
источник

EF

Elvis Fox in Deus Volt!
Да, это стандартный подход, и если он устраивает, то лучше так и сделать =)
источник

V

Vadimatorik in Deus Volt!
Elvis Fox
Тут надо разделить что значит "читает". Это последовательный доступ (через шину) или комбинаторный доступ (выход регистра идет прямо на какую-то логику).
PWM - комбинированный из регистра cfg и последовательный для вершины счетчика.
источник