Я поддерживаю производственный код, связанный с FPGA-устройством. Более старые резисторы на FPGA имеют 32 бита, и чтение/запись в эти регистры работают отлично. Но оборудование изменено и поэтому сделал FPGA-устройство и с последней версией FPGA-устройства у нас возникли проблемы с чтением и записью в регистр FPGA. После некоторого R & D мы узнали, что регистры FPGA больше не 32-битные, теперь это 31-битные регистры и то же самое было заявлено производителем устройств FPGA.Как я могу справиться с данным situtaion, связанным с аппаратным изменением
Таким образом, необходимо изменить и небольшой код. Раньше мы проверяли, что адрес регистров равен 4 байтам или нет (поскольку регистры имеют 32 бита) теперь с текущим сценарием, который мы должны проверить, адрес выравнивается по 31 бит . Так же мы будем проверять , если установлен самый старший бит адреса (что означает, что он не является допустимым 31 бит). Наверное, мы здесь.
Теперь второй сценарий для меня немного сложный. , если чтение/запись для нескольких регистров, которые пройдут через границу 0x7fff-fffc (которая является максимальным адресом в 31-битной схеме), затем должны обрабатывать запрос тщательно.
Чтение и запись для нескольких регистров занимает длину как аргумент, который представляет собой не что иное, как число регистров для чтения или записи.
Например, если чтение начинается с 0x7fff-fff8, а длина для чтения равна 5. Тогда на самом деле мы можем читать только 2 регистра (то есть 0x7fff-fff8 и 0x7fff-fffc).
Теперь кто-то может предложить мне какую-то псевдо-код для обработки этой ситуации
Некоторые думают, что, как показано ниже
while(lenght>1)
{
if(!(address<<(lenght*31) <= 0x7fff-fffc))
{
length--;
}
}
Я знаю, что это не достаточно хорошо, но что-то в той же строке, которые я могу использовать.
EDIT
Я пришел с куском кода, который может выполнить мое требование
int count;
Index_addr=addr;
while(Index_add <= 7ffffffc)
{
/*Wanted to move register address to next register address,each register is 31 bit wide and are at consecutive location. like 0x0,0x4 and 0x8 etc.*/
Index_add=addr<<1; // Guess I am doing wrong here ,would anyone correct it.
count++;
}
length=count;
Так же, как точка терминологии, 31-битное адресное пространство не называется «31-разрядным выровненным». Это всего лишь 31-битное адресное пространство с адресом от 0x00000000' до '0x7FFFFFFF'. Кроме того, я не уверен, что понимаю синтаксис кода C с помощью <<0x7fff-fffc'. Я предполагаю, что вы имеете в виду '0x7ffffffc'? – lurker
Каков тип данных 'address' (как он объявлен)? – lurker
Ну @mbratch может быть терминологией мудрым Я поступил не так, мы можем сказать, 31-бит проверки границы или что-то еще. Да, вы правы его просто 0x7ffffffc. –