#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. Спасибо! Я попробую