2016-04-01 5 views
0

Я реализую протокол видео XGA (1024x768) с FPGA Altera. У меня есть отображение изображений с правильным цветом и четким вертикальным отображением (т. Е. Установка каждого n-го вертикального пикселя на черный приводит к резкой горизонтальной линии без наложения изображений). Тем не менее, горизонтальный дисплей (вертикальные линии) очень искажен, при этом линии шириной 1 пиксель «размазаны» шириной от 3 до 4 пикселей. Кроме того, ширина отображаемого сигнала слишком широка. Попытка создать ровную сетку высоты и ширины приводит к тому, что ячейки становятся шире, чем высокие.Реализация сигнала Verilog VGA: «растянутый горизонтальный»

Я проверил все свои тайминги через логический анализатор от these values, и они предельно точны, с точностью до сотых.

Основываясь на этом описании проблемы, любые идеи о том, где искать отладки? Учитывая, что вертикаль спот-на, я думаю, что это имеет какое-то отношение к моей горизонтальной синхронизации? Код генерации сигнала VGA:

module vga_sig_gen 
(
    clk, 
    reset_n, 
    vga_BLANK_N, 
    vga_SYNC_N, 
    vga_HS, 
    vga_VS, 
    vga_R, 
    vga_G, 
    vga_B 
); 

// XGA signals 
input clk; 
input reset_n; 
output reg vga_BLANK_N; 
output reg vga_SYNC_N; 
output reg vga_HS; 
output reg vga_VS; 
output reg [7:0] vga_R; 
output reg [7:0] vga_G; 
output reg [7:0] vga_B; 

// Frame/line position 
reg [11:0] hor_pos; 
reg [9:0] vert_pos; 

always @ (posedge clk) begin 
    if(!reset_n) begin 
     {vga_R, vga_G, vga_B} <= 24'h000000; 
     hor_pos <= 12'd0; 
     vert_pos <= 10'd0; 
    end 
    else begin 
     // Update RGB values 
     {vga_R, vga_G, vga_B} <= (hor_pos % 48 == 0) || (vert_pos % 48 == 0) ? 24'd0 : 24'hB93E06; 

     // Update line/fram position 
     hor_pos <= (hor_pos == 12'd1343) ? 12'd0 : hor_pos + 12'd1; 
     if(hor_pos == 12'd1343) begin 
      if(vert_pos == 10'd805) begin 
       vert_pos <= 10'd0; 
      end 
      else begin 
       vert_pos <= vert_pos + 10'd1; 
      end 
     end 
    end 

    // Generate VGA signals 
    vga_BLANK_N <= ((hor_pos > 12'd319) && (vert_pos > 10'd37)) ? 1'b1 : 1'b0; 
    vga_HS <= ((hor_pos > 12'd23) && (hor_pos < 12'd160)) ? 1'b0 : 1'b1; 
    vga_VS <= ((vert_pos > 10'd2) && (vert_pos < 10'd9)) ? 1'b0 : 1'b1; 
    vga_SYNC_N <= 1'b0; 
end 

endmodule 

ответ

0

Проблема заключалась в том, что нативное соотношение сторон моего ЖК-монитора вызывало растяжение. Ответ Джона может быть причиной, если внутренние часы были слишком медленными, чтобы справиться с этим, однако на 50 МГц с 65 МГц PLL-мультипликатором это не было проблемой (как показывает осциллограф).

2

Похоже, вы пытаетесь создать сетку, отправив черный пиксель каждые 48 пикселей. Это верно?

Основываясь на том, что вы говорите, у вас может быть проблема с настройкой в ​​ваших регистрах vga_R/G/B. Вероятно, это связано с тем, что если явное использование% 48, которое не является простой операцией

Более простым решением может быть добавление другого счетчика, который подсчитывается от 0-47, и выводит черный пиксель, когда этот счетчик равен 47 Вам понадобится этот счетчик как по вертикали, так и по горизонтали

+0

Благодарим за идею, однако в конечном итоге это было родное разрешение ЖК-монитора, которое это делало. – Answoquest

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