2015-08-18 3 views
0

Я преобразовал файл изображения в шестнадцатеричный файл, который имеет значения R, G, B и альфа в нескольких столбцах. Например:Чтение файла hex в testbench: Verilog

3с 48 36 и далее 1d 2b 19 и далее 08 18 06 FF 08 17 05 FF 14 1f 0d далее 1б 22 11 и далее 1a 1f 0e и далее 1a 1b 0b и далее 1d 1a 0b и далее 20 1a 0b и далее 23 1a 0c ff 23 1c 0d ff 24 1d 0e ff 24 1d 0e ff 21 1c 0d ff 23 1c 0d ff 1f 1a 0b ff 1e 19 0a ff 1c 19 0a ff 1e 1a 0b ff 20 1a 0b ff 24 18 0b ff 23 18 0a ff 21 18 0a ff

Теперь я хочу, чтобы прочитать и сохранить эти данные в виде коллекции из 32 бит (т.е. 4 байта). Если я не знаю, как байты присутствуют в файле (так как файл может быть любого размера), как я могу это достичь?

ответ

0

Если у вас есть файл в этом заданном формате, вы можете использовать $readmemh системный вызов принять эти значения и поместить их в массив Verilog:

localparam MAX_SIZE 1024 /* Set this to the maxium image size in bytes */ 

reg [7:0] image_8[MAX_SIZE-1:0]; 
reg [31:0] image_32[(MAX_SIZE/4)-1:0]; 
integer i; 

initial begin 
    $readmemh("file.hex", image); 
    for (i = 0; i < MAX_SIZE/4; i = i + 1) begin 
    image_32[i] = ({24'b0, image_8[i*4]} << 24) | ({24'b0, image_8[i*4 + 1]} << 16) | ({24'b0, image_8[i*4 + 2]} << 8) | (image_8[i*4 + 3]); 
    end 
end 

Что вы должны получить изображение в виде массива Verilog , причем каждый элемент имеет длину 32 бит.

(Обратите внимание, что файлы меньшего размера оставит кучу 'x значений в массиве, так что вы можете проверить это, чтобы определить длину при необходимости)

+0

Спасибо за ответ :) – ssgr

+0

Есть ли способ, что я могу избегать этих значений «x» для файлов меньшего размера? Потому что мне нужно снова преобразовать выходные данные в изображение. Поэтому слишком много значений «x» могут не дать мне требуемое изображение. – ssgr

+0

Если вам нужно создать выходной шестнадцатеричный файл, вы можете использовать '$ writememh' и включать начальный и конечный адреса, где конечный адрес не является максимальным размером, но истинным размером; например '$ writememh (" out.hex ", image_32, 0, image_size - 1);'. Вы также можете всегда определять размер как параметр, а не максимальный размер, но вам нужно перекомпилировать для каждого нового изображения, если вы это сделаете. – Unn

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