VHDL 32-битный счетчик на 16-битной шине

Каков наилучший способ доступа к изменяющемуся 32-битному регистру (например, счетчику) через 16-битную шину данных? Я полагаю, что мне нужно "заморозить" или скопировать 32-битное значение при чтении LSB, пока MSB также не будет прочитано, и наоборот при записи, чтобы избежать повреждения данных, если LSB переполняется в MSB между двумя доступами. Есть ли стандартный подход к этому?

2 ответа

Решение

Как предлагается в вопросе и ответе Мортена, второй регистр для хранения значения во время чтения первой половины является распространенным методом. В некоторых MCU этот регистр является общим для нескольких устройств, что означает, что вам нужно либо отключить прерывания через два доступа, либо убедиться, что ISR не касаются дополнительного регистра. Записки обрабатываются аналогичным образом, часто в обратном порядке (запишите второе слово во временную память, затем запишите первое слово на устройстве, запустив, таким образом, устройство для чтения второго слова одновременно).

Также были случаи, когда вы просто не могли получить доступ к реестру атомарно. В таких случаях вам может понадобиться реализовать дополнительную логику, чтобы выяснить истинное значение. Пример такого алгоритма, предполагающего, что три чтения занимают намного меньше, чем 1<<15 Контр тики могут быть:

earlyMSB = highreg;
midLSB = lowreg;
lateMSB = highreg;
fullword = ((midLSB<0x8000 ? lateMSB : earlyMSB)<<16) | midLSB;

Другие варианты могут использовать флаг переполнения, чтобы сигнализировать, что более значимое слово нуждается в приращении (часто используется для реализации этой части счетчика в программном обеспечении).

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

Другие вопросы по тегам