Как наиболее эффективно получить изображение rgb в FPGA, используя verilog

Я пытаюсь написать код Verilog для программирования FPGA, где я буду реализовывать приложение VGA. Я использую Quartus II и Altera DE2.

На данный момент моя цель - получить изображение 640x480 rgb во время компиляции (метод не имеет значения, главное, чтобы он работал и был эффективен). Лучшее решение, которое я придумал, - преобразовать изображение в шестнадцатеричные файлы rgb с помощью Matlab и использовать $readmemh, чтобы получить их в регистр.

Но, как обсуждалось здесь: verilog $readmemh тоже занимает много времени для изображения RGB размером 50x50 пикселей

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

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

отчет о компиляции для попытки readmemh 200x200: отчет о компиляции 200x200


person ozgeneral    schedule 24.05.2015    source источник
comment
Еще раз: можете ли вы показать скриншот с отчетом о компиляции (ctrl+r), а не с сообщениями об ошибках/предупреждениями?   -  person Qiu    schedule 24.05.2015
comment
Вот извините за непонимание   -  person ozgeneral    schedule 25.05.2015
comment
Вы можете загрузить изображение во время выполнения. DE2 имеет слот для карты памяти на борту. И, насколько я помню, Terasic предоставляет пример для этого (по крайней мере, для DE2-115).   -  person Alexey Birukov    schedule 25.05.2015


Ответы (1)


Основываясь на вашем отчете о компиляции, я бы рекомендовал вам использовать блочную память ROM (или RAM) вместо регистров для хранения вашего образа.

На данный момент вы используете распределенную оперативную память, то есть память, доступную внутри каждого небольшого логического блока FPGA. Это делает распределенную оперативную память идеальной для памяти небольшого размера. Но когда дело доходит до больших объемов памяти, это может привести к дополнительным задержкам подключения и увеличить время синтеза (синтезатору необходимо подключить все эти блоки).

С другой стороны, блочное ОЗУ — это выделенная двухпортовая память, содержащая несколько килобит (в зависимости от вашего устройства и производителя) ОЗУ. Вот почему вы должны использовать блочную RAM для памяти большого размера, а распределенную RAM для памяти FIFO или памяти небольшого размера. Cyclone IV EP4CE115F29 (доступен в DE2-115) имеет 432 блока памяти M9K (3981312 бит памяти).

Одна важная вещь: операция READ является асинхронной для распределенной ОЗУ (данные считываются из памяти сразу после получения адреса, не дожидаясь перепада тактового сигнала), но синхронной для блочной ОЗУ.

Пример однопортовой ПЗУ (Шаблон Quartus II Verilog):

module single_port_rom
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=8)
(
    input [(ADDR_WIDTH-1):0] addr,
    input clk, 
    output reg [(DATA_WIDTH-1):0] q
);

    // Declare the ROM variable
    reg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];

    initial
    begin
        $readmemh("single_port_rom_init.txt", rom);
    end

    always @ (posedge clk)
    begin
        q <= rom[addr];
    end

endmodule
person Qiu    schedule 25.05.2015
comment
Код, который привел к отчету о компиляции (и проблеме с размером), имел следующую структуру: reg [7:0] mem_R[0:39999]; //200x200 image initial begin $readmemh("menuR.txt", mem_R); end, который, вероятно, использовал ОЗУ, как вы предложили, что имеет смысл. Но можете ли вы сказать мне, какая часть в вашем примере определяет разницу между ПЗУ и ОЗУ? Я не смог найти разницы в структуре, за исключением того, что пример ПЗУ объявлен как модуль. Может ли это иметь такое существенное значение? - person ozgeneral; 26.05.2015
comment
Вы должны быть уверены, что использовали синхронное чтение и какой-то сигнал, который работает как addr. Если вы забыли об этом, синтезатор Quartus не будет делать вывод о памяти RAM/ROM. - person Qiu; 26.05.2015
comment
Только что удалось получить изображение, это как раз то, что мне нужно, большое спасибо! - person ozgeneral; 29.05.2015