Jump to content

    
Sign in to follow this  
Alexey87

VGA доступ к пикселю

Recommended Posts

прямоугольник я рисовал так:

assign r = video_on && hcounter > 0 & hcounter < 799 & vcounter > 0 & vcounter < 599 ? 1'b1 : 1'b0;

и экран моргает.

а если так:

assign r = hcount > 0 ? 1'b1 : 1'b0;

то экран заполняется красными пикселами.

Буду искать ошибки.

p.s. код "синхрогенератора":

Spoiler

module vga_sync(
input clk,
output hsync, vsync,
output r, g, b,
output [10:0]pixel_x, pixel_y
);

parameter 
//Horyzontal timing
HVisible_area	= 800,
HFront_porch	= 16,
HSync_pulse		= 80,
HBack_porch		= 160,
//Vertical timing
VVisible_area	= 600,
VFront_porch	= 1,
VSync_pulse		= 3,
VBack_porch		= 21;

reg [10:0] hcounter, vcounter;
reg video_on;

always@(posedge clk)
begin
	if(hcounter == HVisible_area - 1'b1 + HFront_porch + HSync_pulse + HBack_porch)
	begin
		hcounter	<= 10'd0;
		if (vcounter == VVisible_area - 1'b1 + VFront_porch + VSync_pulse + VBack_porch)
		vcounter	<= 10'd0;
		else
		vcounter	<= vcounter + 1'b1;
	end
		else
		hcounter	<= hcounter + 1'b1;
end

always@(posedge clk)
begin
	video_on	<= (hcounter <= HVisible_area - 1'b1 && vcounter <= VVisible_area - 1'b1) ? 1'b1 : 1'b0;
end

	assign	hsync		= hcounter > HVisible_area - 1'b1 + HFront_porch && hcounter < HVisible_area + HFront_porch + HSync_pulse;
	assign	vsync		= vcounter > VVisible_area - 1'b1 + VFront_porch && vcounter < VVisible_area + VFront_porch + VSync_pulse;
	assign	pixel_x		= (hcounter <= HVisible_area - 1'b1) ? hcounter : 0;
	assign	pixel_y		= (vcounter <= VVisible_area - 1'b1) ? vcounter : 0;
	
	//прямоугольник на всю область экрана
	assign r = video_on && hcounter > 0 && hcounter < 799 && vcounter > 0 && vcounter < 599 ? 1'b1 : 1'b0;
endmodule

 

 

вот результаты с логического анализатора (сигналы hsync и vsync и timing):

 

 

 

general_timing.jpg

hsync.jpg

vsync.jpg

Edited by Alexey87

Share this post


Link to post
Share on other sites
В 17.09.2019 в 19:59, Alexey87 сказал:

 

Желаю удачи в решении Вашей задачи с таким синхрогенератором :dash2:

За то экономите аж 10 триггеров ! 

Share this post


Link to post
Share on other sites

Лишняя "-1", и все выходы должны быть однозначными и низкочастотными, т.е. синхронными, а сейчас от звона у монитора законно едет крыша.

Share this post


Link to post
Share on other sites
2 hours ago, Flip-fl0p said:

Желаю удачи в решении Вашей задачи с таким синхрогенератором

если посмотреть на данные с лог. анализатора, то там вроде небольшие отличия (может ли это стать причиной?...) или необходимо добиться точно таких же значений как в таблице timing?

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

Share this post


Link to post
Share on other sites
9 hours ago, Alexey87 said:

сравнивать полученные результаты с чем?

Ну наверняка же есть где-то стандарт (описание) - что должно быть в идеале. Сравнивать с таким стандартом - самое правильное.

Вернее - взять стандарт за  исходные данные и воспроизвести заложенные в нем требования.

Edited by Yuri124

Share this post


Link to post
Share on other sites
9 часов назад, Alexey87 сказал:

если посмотреть на данные с лог. анализатора, то там вроде небольшие отличия (может ли это стать причиной?...) или необходимо добиться точно таких же значений как в таблице timing?

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

Тайминги должны быть точными и соответствовать стандартам vesa. Все остальное на Ваш страх и риск. Можете попробовать сделать как меня (фактически переписать на verilog). Но главное не бездумно переписывать чужой код,  главное понимать зачем было так сделано...

Share this post


Link to post
Share on other sites
14 минут назад, Alexey87 сказал:

с этим я и не могу разобраться...

Задавайте вопросы. Хотя у меня код снабжен комментариями, и порой даже они слегка избыточны. Но я уже объяснял, как он работает, читайте внимательнее.

Share this post


Link to post
Share on other sites
On 7/26/2019 at 12:24 AM, Flip-fl0p said:

Ждем время back porch --> отрисовываем видимую область --> ждем время front_porch_st --> выдаем импульс горизонтальной синхронизации --> Ждем время back porch... И.Т.Д

т.е. в конечном автомате я буду использовать:

Spoiler

Visible area = 800
Front porch  = 16
Sync pulse   = 80
Back porch   = 160
Whole line   = 1056

 

например counter (это счётчик), тогда:

 

Spoiler

	case(counter)
		visible_area: что-то сделать;
		Front_porch:что-то сделать;
		Sync_pulse:что-то сделать;
		Back_porch:что-то сделать;
		Whole_line:что-то сделать;
		default:если ничего не "подходит";
	endcase

 

правильно ли я понимаю?

 

Share this post


Link to post
Share on other sites
43 минуты назад, Alexey87 сказал:

т.е. в конечном автомате я буду использовать:

  Скрыть контент


Visible area = 800
Front porch  = 16
Sync pulse   = 80
Back porch   = 160
Whole line   = 1056

 

например counter (это счётчик), тогда:

 

  Скрыть контент


	case(counter)
		visible_area: что-то сделать;
		Front_porch:что-то сделать;
		Sync_pulse:что-то сделать;
		Back_porch:что-то сделать;
		Whole_line:что-то сделать;
		default:если ничего не "подходит";
	endcase

 

правильно ли я понимаю?

 

неправильно. Изучайте что такое конечный автомат. У меня автомат, который циклически " прыгает" по состояниям. Сколько находится в том или ином состоянии определяется счётчиком, в который загружаются необходимые тайминги vesa. 

Share this post


Link to post
Share on other sites

посмотрел в описание монитора у китайцев и:

Экран: 7-дюймовый высокой яркости светодиодный 16:10

Разрешение: 1024*600/800*480

ссылка на монитор

попробовал нарисовать квадрат на станд. мониторе и получилось, а на этом моргает...

Но если подключать от видеокарты комп., то (этот 7") картинку рисует.

Share this post


Link to post
Share on other sites

Верить описанию на Али экспрессе - ну не знаю, не знаю. Я верю официальным таймингам Vesa, в соответствии с которыми и должны работать все мониторы. 

Share this post


Link to post
Share on other sites
17 minutes ago, Flip-fl0p said:

в соответствии с которыми и должны работать все мониторы. 

дело в том что квадрат (800x600) нормально отобразился на мониторе (стандартном), а на этом всё моргает...

этот монитор автомобильный, а у них разрешение/я отличные от стандартных вот например

Edited by Alexey87

Share this post


Link to post
Share on other sites
Только что, Alexey87 сказал:

дело в том что квадрат (800x600) нормально отобразился на мониторе (стандартном), а на этом всё моргает...

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

P.S. Только вот ПК мониторы, как правило, содержат в себе достаточно умные контроллеры, которые могут "проглотить" кривые тайминги, не соответствующие vesa.А дешёвые китайские нет... Я не понимаю Вас, Вы хотите убедить всех, что у Вас хороший код и проблема в железе ? Только вот Ваши доводы неубедительны. Могли бы давно разобраться и сделать...

Share this post


Link to post
Share on other sites
26 minutes ago, Flip-fl0p said:

Вы хотите убедить всех, что у Вас хороший код и проблема в железе ?

конкретно этот синхрогенератор (640x480) я взял для проверки из книги "FPGA Prototyping By Verilog Examples":

Spoiler

// Listing 13.1
module sync
   (
    input wire clk, reset,
    output wire hsync, vsync, video_on, p_tick,
    output wire [9:0] pixel_x, pixel_y,
    output r, g, b
   );

   // constant declaration
   // VGA 640-by-480 sync parameters
   localparam HD = 640; // horizontal display area
   localparam HF = 48 ; // h. front (left) border
   localparam HB = 16 ; // h. back (right) border
   localparam HR = 96 ; // h. retrace
   localparam VD = 480; // vertical display area
   localparam VF = 10;  // v. front (top) border
   localparam VB = 33;  // v. back (bottom) border
   localparam VR = 2;   // v. retrace

   // mod-2 counter
   reg mod2_reg;
   wire mod2_next;
   // sync counters
   reg [9:0] h_count_reg, h_count_next;
   reg [9:0] v_count_reg, v_count_next;
   // output buffer
   reg v_sync_reg, h_sync_reg;
   wire v_sync_next, h_sync_next;
   // status signal
   wire h_end, v_end, pixel_tick;

   // body
   // registers
   always @(posedge clk, posedge reset)
      if (reset)
         begin
            mod2_reg <= 1'b0;
            v_count_reg <= 0;
            h_count_reg <= 0;
            v_sync_reg <= 1'b0;
            h_sync_reg <= 1'b0;
         end
      else
         begin
            mod2_reg <= mod2_next;
            v_count_reg <= v_count_next;
            h_count_reg <= h_count_next;
            v_sync_reg <= v_sync_next;
            h_sync_reg <= h_sync_next;
         end

   // mod-2 circuit to generate 25 MHz enable tick
   assign mod2_next = ~mod2_reg;
   assign pixel_tick = mod2_reg;

   // status signals
   // end of horizontal counter (799)
   assign h_end = (h_count_reg==(HD+HF+HB+HR-1));
   // end of vertical counter (524)
   assign v_end = (v_count_reg==(VD+VF+VB+VR-1));

   // next-state logic of mod-800 horizontal sync counter
   always @*
      if (pixel_tick)  // 25 MHz pulse
         if (h_end)
            h_count_next = 0;
         else
            h_count_next = h_count_reg + 1;
      else
         h_count_next = h_count_reg;

   // next-state logic of mod-525 vertical sync counter
   always @*
      if (pixel_tick & h_end)
         if (v_end)
            v_count_next = 0;
         else
            v_count_next = v_count_reg + 1;
      else
         v_count_next = v_count_reg;

   // horizontal and vertical sync, buffered to avoid glitch
   // h_sync_next asserted between 656 and 751
   assign h_sync_next = (h_count_reg>=(HD+HB) &&
                         h_count_reg<=(HD+HB+HR-1));
   // vh_sync_next asserted between 490 and 491
   assign v_sync_next = (v_count_reg>=(VD+VB) &&
                         v_count_reg<=(VD+VB+VR-1));

   // video on/off
   assign video_on = (h_count_reg<HD) && (v_count_reg<VD);

   // output
   assign hsync = h_sync_reg;
   assign vsync = v_sync_reg;
   assign pixel_x = h_count_reg;
   assign pixel_y = v_count_reg;
   assign p_tick = pixel_tick;
//прямоугольник
   assign r = pixel_x > 0 && pixel_x < 639 && pixel_y > 0 && pixel_y < 479 ? 1'b1 : 1'b0;
endmodule

 

и проверяю при помощи логического анализатора (анализатор), но на стандартном мониторе всё рисует, а на 7" нет (моргает).

 

640x480.jpg

у меня то код кривой я согласен, но из этой книги...

Edited by Alexey87

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this