Vitis: сохранить 16-байтовую переменную в 4 32-разрядных регистрах

#fpga #xilinx #vivado #zynq

#fpga #xilinx #vivado #zynq

Вопрос:

У меня есть постоянный ввод без знака символа, 16 байт. И мне нужно сохранить ее в 4 32-разрядных регистрах. Vitis позволяет сохранять 32-разрядную переменную в 32-разрядный регистр с помощью Xil_Out32. Но я не знаю, как я могу разделить 16-байтовый ввод на 4 части.

 #define MY_REGISTER  XPAR_AES_ENCDEC_0_S00_AXI_BASEADDR /*Get the register address*/
#define MY_REGISTER_1  MY_REGISTER   0
#define MY_REGISTER_2  MY_REGISTER   4
#define MY_REGISTER_3  MY_REGISTER   8
#define MY_REGISTER_4  MY_REGISTER   12

void key_init(const unsigned char key[]);
     Xil_Out32(MY_REGISTER, /*4 byte key*/);

 

Это ключ, который я получу. Входной тестовый стенд из кода VHDL:

ключ <= x»00112233445566778899aabbccddeeff»;

И я хочу поместить ее в 4 регистра. Я уже получил базовый адрес регистра: 00112233 для MY_REGISTER_1, 44556677 для MY_REGISTER_2, 8899aabb для MY_REGISTER_3, ccddeeff для MY_REGISTER_4.

Комментарии:

1. Как ваш 16-байтовый ввод представлен, в виде массива какого типа, в виде структуры чего? Пожалуйста, предоставьте еще немного контекста. Вы также должны четко указать, как вы хотите распределить байты по регистрам.

2. Я думаю, что тип является типом char, поскольку он является const unsigned char . Я думаю, что это массив типа char

Ответ №1:

Вы можете преобразовать указатель на байты в указатель на 32-разрядные значения и использовать это для чтения значений для регистров.

 void key_init(const unsigned char key[]) {
    const u32* pointer = (const u32*)key;
    Xil_Out32(MY_REGISTER_1, pointer[0]);
    Xil_Out32(MY_REGISTER_2, pointer[1]);
    Xil_Out32(MY_REGISTER_3, pointer[2]);
    Xil_Out32(MY_REGISTER_4, pointer[3]);
}
 

Примечания:

Массив, заданный в качестве параметра функции, преобразуется в указатель.

Доступ pointer[index] эквивалентен *(pointer index) .

Пожалуйста, учитывайте порядковый номер, вам может потребоваться использовать Xil_Out32BE() или Xil_Out32LE() или изменить последовательность индексов на pointer .

Ваш байтовый массив должен быть выровнен по u32 границе, если это необходимо вашему процессору. В любом случае, если байтовый адрес не преобразуется в u32 указатель из-за выравнивания, это неопределенное поведение. Это может сработать, но только для вашей конкретной цели.

Комментарии:

1. Спасибо! Я попробую