Перейти к содержанию
    

Pomogite otkrit kartinku v Verilog

Kak vobshe proisxodit zagruzka v pamyat iz file'?

I kakim obrazom mojno sozdat pixel'ny (binary) potok s kartinki (file) v pamyat?

Spasibo zaranie.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я полагаю что вопрос стоит о загрузке картинки из файла в память симулятора (верилог модели)?

я делал наспех поэтому немного коряво:

написал програмку на Си, которая читает файл формата BMP (градация серого, без палитры[1]), отбрасыбает заголовок в отдельный файл[2], само поле с картинкой трансформирует из бинарного представления в ascii заданного формата[3] и скидывает в отдельный файл, далее в модели памяти пользуюсь верилоговской функциeй

$readmemh(input_pic_file,mem,n);

,которая и работает с ascii представлением шестнадцатиричных чисел (загружает из файла в верилоговский массив). (в идеале конечно нужно создавать PLI/DPI расширение для целостности модели верилога)

если же идёт речь о работе в аппаратуре - то это сами понимаете вопрос творческий.

 

 

[1]- при необходимости цветность легко изменить, а вот с палитрой нужно возиться, (но это особо ни к чему, потому что картинку можно предваритрльно обработать в любом граф. редакторе и сделать её без пол-литры)

[2]- для того чтобы после обработке в симуляторе можно сохранить его обратно в BMP если конечно размеры картинки при обработке не меняются

[3]- в моём случае это 4 числа в строчке, каждое число - ascii представлениe 8-цифрового шеснадцатиричного числа - т.е. каждый пиксел представлен 8-циферным ascii кодом, по 4 пиксела в строчку (как изменить формат закомментированно в исxоднике)

 

чего-то файлик не грузится - киньте мне адрес электронной почты в приватном сообщение, если вам нужен исxодник

 

или даже вот как

// The program extracts a bitmap field of a *.bmp(binary) file and converts it to an ascii file of a given format
// made by CaPpuCcino TM
// the program reads in a *.bmp file (gray-scale only, without palette) extract the information from the bmp header and store it in the file
// specified by a user (bmp header is stored for back conversion), store the bitmap field in another file (pic.mem) in a given format, write dimention of a picture to the third file (dimention.mem)
// program is a command-line executable. the first argument is a source file name the second is the output file name for the bmp header
#include <stdio.h>
#include <stdlib.h>


unsigned int byte_arrange(unsigned int four_bytes)
{
    unsigned int rearranged=0;
    unsigned int temp_dword=0;
    temp_dword=(four_bytes)&255;
    rearranged=rearranged|temp_dword;
    rearranged=rearranged<<8;
    temp_dword=(four_bytes>>8)&255;
    rearranged=rearranged|temp_dword;
    rearranged=rearranged<<8;
    temp_dword=(four_bytes>>16)&255;
    rearranged=rearranged|temp_dword;
    rearranged=rearranged<<8;
    temp_dword=(four_bytes>>24)&255;
    rearranged=rearranged|temp_dword;
    return rearranged;
}
int main(int argc, char* argv[])
{
    int i;
    unsigned long j=0;
    unsigned char buf[4];
    unsigned char byte_buf[1];
    unsigned long dword_buf[1];

    FILE *file_in, *file_out, *dimention_mem, *pic_mem;
    unsigned long four_bytes=0;
    unsigned long pic_start=0;
    unsigned long output=0;
    unsigned short two_bytes=0;
    unsigned long end_of_file;
    unsigned long num_dwords;
    
    long ddword=0;

    printf("argc = %d \n\n",argc);
    printf("Parameters\n\n");
    for (i=0; i<=argc; i++)
        printf(" argv[%d]: %s\n",i,argv[i]);
    if (argv[1]==NULL)
    {
        printf("Choose a source file \n");
        return(1);
    }
    if (argv[2]==NULL)
    {
        printf("Choose a destination file \n");
        return(1);
    }
    if((file_in = fopen(argv[1],"rb"))==NULL)
    {
     fprintf(stderr, "The file cannot be opened \n");
     return(1);
    }
    if((file_out = fopen(argv[2],"wb"))==NULL)
    {
     fprintf(stderr, "The file cannot be opened  \n");
     return(1);
    }
    if((pic_mem = fopen("pic.mem","wb"))==NULL)
    {
     fprintf(stderr, "The file cannot be opened \n");
     return(1);
    }
    if((dimention_mem = fopen("dimention.mem","wb"))==NULL)
    {
     fprintf(stderr, "The file cannot be opened \n");
     return(1);
    }

    fread( buf, sizeof( unsigned char ), 2, file_in );
    if ((buf[0]!='B')&&(buf[1]!='M'))
    {
        fprintf(stderr, "Not a BitMap file \n");
        fclose(file_in);
        fclose(file_out);
        return 1;
    }
    fread( buf, sizeof( unsigned char ), 4, file_in );
    for (i=0;i<4;i++)
    {
        four_bytes=four_bytes<<8;
        four_bytes=four_bytes|buf[i];
    }
    output=byte_arrange(four_bytes);
    end_of_file=output;
    printf(" File length: %X = %d bytes\n",output,output);
    fread( buf, sizeof( unsigned char ), 4, file_in );
    fread( buf, sizeof( unsigned char ), 4, file_in );
    for (i=0;i<4;i++)
    {
        four_bytes=four_bytes<<8;
        four_bytes=four_bytes|buf[i];
    }
    output=byte_arrange(four_bytes);
    printf(" Pixel array starts from %X (%d) byte from the beginning of the file\n",output,output);
    pic_start=output;
    fread( buf, sizeof( unsigned char ), 4, file_in );
    for (i=0;i<4;i++)
    {
        four_bytes=four_bytes<<8;
        four_bytes=four_bytes|buf[i];
    }
    output=byte_arrange(four_bytes);
    printf(" Length of BitMap Info header %X (%d)\n",output,output);
    fread( buf, sizeof( unsigned char ), 4, file_in );
    for (i=0;i<4;i++)
    {
        four_bytes=four_bytes<<8;
        four_bytes=four_bytes|buf[i];
    }
    output=byte_arrange(four_bytes);
    fprintf( dimention_mem, "%04X\n",output);
    printf(" Picture width %X (%d)\n",output,output);

    fread( buf, sizeof( unsigned char ), 4, file_in );
    for (i=0;i<4;i++)
    {
        four_bytes=four_bytes<<8;
        four_bytes=four_bytes|buf[i];
    }
    output=byte_arrange(four_bytes);
    fprintf( dimention_mem, "%04X\n",output);
    printf(" Picture height %X (%d)\n",output,output);
    fread( buf, sizeof( unsigned char ), 4, file_in );
    for (i=0;i<4;i++)
    {
        four_bytes=four_bytes<<8;
        four_bytes=four_bytes|buf[i];
    }
    four_bytes=four_bytes&65535;
    four_bytes=four_bytes>>8;
    printf(" Bits per pixel %X (%d)\n",four_bytes,four_bytes);

    rewind(file_in);
    for (j=0;j<pic_start;j++)
    {
        fread( byte_buf, sizeof( unsigned char ), 1, file_in );
        fwrite( byte_buf, sizeof( unsigned char ), 1, file_out);
    }
        rewind(file_in);    
        num_dwords=(end_of_file-pic_start);
    printf(" Cycles: %d\n",num_dwords);
    fseek (file_in,pic_start,SEEK_SET);                    
    for (j=0;j<num_dwords;j++)// format of file output:
    {

        fseek (file_in,pic_start+j,SEEK_SET);// starting from the berinning of the bitmap 
        fread( byte_buf, sizeof( unsigned char ), 1, file_in );// read each byte of the bitmap field to buffer
        fprintf( pic_mem, "%08X",*byte_buf); // and output the buffer content to the destination file in the format of hex, 8 possitiions, preceeding 0 if necessary
        if ((j&3)==3) fprintf(pic_mem, "\n"); // start a new line in the output file after each four samples (modify the number in if-clause for another string length)

    }
    printf(" Cycles: %d\n",j);

    fclose(file_in);
    fclose(file_out);
    fclose(dimention_mem);
    fclose(pic_mem);
    return 0;
}

Изменено пользователем CaPpuCcino

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TO CaPpuCcino:

 

Spasibo ogromnoe, ya dumayu eto nam ochen pomojet.

A vot esli u menya vse proisxodit v real-time i image potok postupaet srazu s kameri na FPGA? To kakim obrazom ya budu perevodit kartinku v ascii format?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TO CaPpuCcino:

 

Spasibo ogromnoe, ya dumayu eto nam ochen pomojet.

A vot esli u menya vse proisxodit v real-time i image potok postupaet srazu s kameri na FPGA? To kakim obrazom ya budu perevodit kartinku v ascii format?

ну так это совсем другое дело и отношение конкретно к верилогу не имеет да и к файлу тоже

если у вас стоит камера - то с неё действительно поступает поток - но не файл скорее всего (хотя лучше это уточните - в том числе и формат файла) осмелюсь снова предположить что камера промышленная - вероятно с каким-то видео интерфейсом (осмелюсь снова предположить что какой-нибудь CameraLink/ChannelLink) в этом случае вам нужно работать как и с любым другим интерфейсом - создать контроллер этого интерфейса (фрейм-грэббер) и отсылать поток на хранение в локальную памят на плате (если плата расширения слать данные в память ПК не советую - слишком много информации гонять по шине расширения) а на лету у вас скорее всего видеопоток обрабатывать не получится.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне кажется что человека интересовал процесс создания алгоритмики на ВХДЛ, то есть это первый опыт работы человека с плисами, если так то любой последовательно связанный код, то есть где одно действие должно выполнятся после другого пишется на плисах при помощи конечного автомата. То есть каждый такт по внешнему синхроимпульсу делается действие и меняется состояние автомата. Ну а далее как вам и сказали, обработал информацию с камеры реализовав интерфейс камеры, поскладывал ее в память (если налету обработать нельзя), потом из памяти выбрал, обработал и положил в другую память или отдал дальше. 2 блока могут работать в параллель. И по кругу каждый кадр...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...