Я новичок в FPGA и трудно понять, как управление VGA сигналов и V взаимодействуют, и как правильно генерировать управление VGA сигналов (с Verilog) для более сложных спецификаций:Как управляющие сигналы VGA работают в Verilog/HDL?
Казалось бы, низкими порты в сигналах горизонтальной и вертикальной синхронизации соответствуют переходу от одной строки к следующей и переходу из нижнего правого угла в верхний левый угол соответственно. Но - это VGA «управляемый» этими низкими сигналами? Делают ли эти низкие сигналы «рассказывают» VGA, чтобы переключиться на следующую строку или вернуться к исходной точке?
Есть ли заднее крыльцо и переднее крыльцо для удовлетворения времени установки и провести время? Являются длительности подъездов приведены в VGA таблице синхронизации только требуемого минимум (т.е. я могу установить подъезды быть намного больше, чем заданных значений в таблице синхронизации?)
Это то, что меня смущает больше всего: от два непрерывных сигнала горизонтальной и вертикальной синхронизации , как на самом деле VGA знает (или я знаю) точно, что точка на экране отображается? Если выбор времени является единственным фактором, значит ли это, что я должен уделять большое внимание соответствующим сигналам управления RPG и сигналам h-sync и v-sync? Если ответ да, то у меня есть еще больше проблем, которые я могу только описать, используя мое назначение в качестве примера:
В этом задании мы используем встроенный 50MHz часами ПЛИС (Spartan стартер), а пиксели VGA - 800x600. Частота кадров задана равной 72 Гц.
В таблице синхронизации VGA дает следующие сигналы синхронизации структуры:
ч-синхронизации: | 0 --- back-porch (104) --- 103 | 104 --- дисплей (800) --- 903 | 904 --- передняя крыльца (16) --- 919 | 920__ ширина импульса (120) __ 1039 |
v-sync: | 0 --- back-porch (23) --- 22 | 23 --- дисплей (600) --- 622 | 623 --- передняя крыльца (37) --- 659 | 660__ ширина импульса (6) __ 665 |
Это означает, что для каждого пикселя в строке на экране я трачу 1 тактовый цикл (20 нс) на нем. Однако для многих сложных случаев я бы хотел бы контролировать цвет пикселя в зависимости от его местоположения на экране и, возможно, дополнительных условий, таких как отношение текущей позиции с другим местоположением, определенными состояниями и т. Д. Теперь , если местоположение пикселя зависит от горизонтальных и вертикальных счетчиков пикселей, а цвет зависит от местоположения, как я могу сопоставить их во времени? Кроме того, что, если моя логика должна потратить больше 20 нс, чтобы определить цвет пикселя? Это полностью разрушит изображение на экране VGA?
На самом деле я как-то закончил свое назначение, но я нахожу мой код грязный и я совершенно не имею, почему это сработало:
Например, часть задания требуется нам, чтобы показать звезду, меняет цвет каждые 0,5 сек.Моя реализация выглядит следующим образом:
//----------------pixel counters----------------
[email protected](posedge CLK or posedge RESET) begin
if(RESET) h_count <= 11'd 0;
else if (h_count >= 11'd 1039) h_count <= 11'd 0;
else h_count <= h_count + 11'd 1;
end
[email protected](posedge CLK or posedge RESET) begin
if(RESET) v_count <= 10'd 0;
else if (v_count >= 10'd 665) v_count <= 10'd 0;
else if (h_count == 11'd 1039) v_count <= v_count + 10'd 1;
else v_count <= v_count;
end
//----------------h- and v- sync----------------
[email protected](posedge CLK or posedge RESET) begin
if(RESET) VGA_HSYNC <= 1'b 0;
else VGA_HSYNC <= (h_count >= 11'd 0) & (h_count <= 11'd 919);
end
[email protected](posedge CLK or posedge RESET) begin
if(RESET) VGA_VSYNC <= 1'b 0;
else VGA_VSYNC <= (v_count >= 10'd 0) & (v_count <= 10'd 659);
end
//----------------a frame counter and a flag----------------
[email protected](posedge CLK or posedge RESET) begin
if(RESET) frame_count <= 6'd 0;
else if (frame_count >= 6'd 49) frame_count <= 6'd 0;
else if(v_count == 10'd 665) frame_count <= frame_count + 6'd 1;
else frame_count <= frame_count;
end
[email protected](posedge CLK or posedge RESET) begin
if(RESET) color_flag <= 1'd 0;
else if (frame_count == 6'd 49) color_flag <= ~(color_flag);
else color_flag <= color_flag;
end
//----------------RGB control----------------
[email protected](posedge CLK or posedge RESET) begin
if(RESET) VGA_RGB <= 3'b 000;
else if(display) begin //display is high when counters in valid range
casez({tree, star, snow}) //these are outputs from submodules that decides the "shapes" of objects on screen
3'b ??1: VGA_RGB <= 3'b 111; //white snow
3'b ?10: VGA_RGB <= (color_flag) ? (3'b 110) : (3'b 111);
//switching between yellow and white
3'b 100: VGA_RGB <= 3'b 010; //green tree
default: VGA_RGB <= 3'b 001; //blue background
endcase
end
else VGA_RGB <= 3'b 000; //for transitions
end
Мне кажется, что мой h_count и v_count напрямую решает мою VGA_HSYNC и VGA_VSYNC. Но мой VGA_RGB зависит, по крайней мере, от color_flag, что в дальнейшем зависит от frame_count, который зависит от h_count и v_count. Разве это не должно задерживать несколько тактов? Код был синтезирован и сделал то, что я хотел показать. Но как же моя VGA_RGB синхронизировала с VGA_HSYNC и VGA_VSYNC во времени ??? Могу ли я переубедить эту проблему? Или мне просто повезло? Что я упустил?
Чтобы частично ответить на ваш вопрос, как правило, вы хотите иметь некоторый блок памяти (либо на или вне чипа), чтобы хранить ваши пиксельные данные. Таким образом, вы можете работать с ним (вносить изменения, обновлять и т. Д.) Независимо от контроллера VGA, и может занять столько времени, сколько вы хотите/должны внести какие-либо изменения. – wilcroft