2013-10-05 1 views
0

Я поддерживаю производственный код, связанный с 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; 
+0

Так же, как точка терминологии, 31-битное адресное пространство не называется «31-разрядным выровненным». Это всего лишь 31-битное адресное пространство с адресом от 0x00000000' до '0x7FFFFFFF'. Кроме того, я не уверен, что понимаю синтаксис кода C с помощью <<0x7fff-fffc'. Я предполагаю, что вы имеете в виду '0x7ffffffc'? – lurker

+0

Каков тип данных 'address' (как он объявлен)? – lurker

+0

Ну @mbratch может быть терминологией мудрым Я поступил не так, мы можем сказать, 31-бит проверки границы или что-то еще. Да, вы правы его просто 0x7ffffffc. –

ответ

1

Я не совсем уверен, что я интерпретировать данный сценарий правильно. Но вот выстрел в него:

// Assuming "address" starts 4-byte aligned and is just defined as an integer 
unsigned uint32_t address; // (Assuming 32-bit unsigned longs) 

while (length > 0) // length is in bytes 
{ 
    // READ 4-byte value at "address" 
    // Mask the read value with 0x7FFFFFFF since there are 31 valid bits 

    // 32 bits (4 bytes) have been read 
    if ((--length > 0) && (address < 0x7ffffffc)) 
     address += 4; 
} 
+0

Спасибо @mbratch за ваш ответ. ваш код будет идеальным в сценарии, где адрес, переданный функции fpga_read, равен 0x7ffffffc, а длина здесь 2 (номер регистра, который нужно читать), но он может читать только только один регистр, поэтому параметр длины должен сокращаться до одного и он тогда читает один регистр начинается по адресу 0x7ffffffc ?? –

+0

@AmitSinghTomar Я только что обновил свой ответ, исходя из вашего ответа на мой вопрос о типе данных. Он должен прочитать правильное количество регистров, исходя из указанной длины. Поэтому, если длина равна 1, она должна считывать один регистр. Он будет читать только один регистр, если длина не превышает 4, тогда он будет читать более одного, если необходимо. – lurker

+0

Г-н опилок сделал здесь довольно точную точку, вместо того, чтобы обрабатывать 31-битные регистры FPGA как места памяти, они должны быть абстрагированы. Мы не можем рассматривать регистры FPGA, адресованные в память, поэтому добавление 4 к адресу может не работать вы ожидаете, и почему length = -4, могу ли я ожидать, что это будет lenght = -1?. Что вы говорите @mbratch на том же самом. –

1

Коренная проблема, похоже, в том, что программа неправильно обрабатывает регистры FPGA.
Инкапсуляция данных помогла бы, и вместо обработки 31-битных регистров FPGA в качестве мест памяти они должны быть абстрагированы.

FPGA следует рассматривать как вектор (одномерный массив) регистров.
Вектор N Регистры FPGA должны быть адресованы register index в диапазоне от 0x0000 до N-1.
Регистры FPGA представляют собой память, отображаемую по адресу base addr.
Таким образом, memory address = 4 * FPGA register index + base addr.

Доступ к регистрам FPGA должен быть воплощен путем чтения и записи процедур:

int read_fpga_reg(int reg_index, uint32_t *reg_valp) 
{ 

    if (reg_index < 0 || reg_index >= MAX_REG_INDEX) 
     return -1; /* error return */ 

    *reg_valp = *(uint32_t *)(reg_index << 2 + fpga_base_addr); 
    return 0; 
} 

Пока MAX_REG_INDEX и fpga_base_addr правильно определены, то этот код никогда не будет генерировать недопустимый доступ к памяти.

+0

спасибо за ваш ответ, я согласен с тем, что вы сделали вместо того, чтобы рассматривать 31-битные регистры FPGA как места памяти, их следует абстрагировать. Как узнать, будет ли ваш код обрабатывать второй сценарий, упомянутый мной в моем вопросе, я думаю, что все нам нужно отрезать параметр длины до некоторого подходящего значения. Я попрошу вас объяснить свой код немного больше, например, что reg_index и reg_valp.Max_REG_INDEX будет 0x7ffffffc, если я отношусь к моему делу. –

Смежные вопросы