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

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

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

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

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


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

В 17.09.2019 в 19:59, Alexey87 сказал:

 

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

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

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


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

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

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


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

2 hours ago, Flip-fl0p said:

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

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

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

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


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

9 hours ago, Alexey87 said:

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

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

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

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

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


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

9 часов назад, Alexey87 сказал:

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

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

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

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


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

1 hour ago, Flip-fl0p said:

главное понимать зачем было так сделано...

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

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


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

14 минут назад, Alexey87 сказал:

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

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

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


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

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

 

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

 

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


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

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. 

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


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

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

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

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

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

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

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

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


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

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

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


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

17 minutes ago, Flip-fl0p said:

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

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

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

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

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


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

Только что, Alexey87 сказал:

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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