Alexey87 0 17 сентября, 2019 Опубликовано 17 сентября, 2019 (изменено) · Жалоба прямоугольник я рисовал так: 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): Изменено 17 сентября, 2019 пользователем Alexey87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 17 сентября, 2019 Опубликовано 17 сентября, 2019 · Жалоба В 17.09.2019 в 19:59, Alexey87 сказал: Желаю удачи в решении Вашей задачи с таким синхрогенератором За то экономите аж 10 триггеров ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 167 17 сентября, 2019 Опубликовано 17 сентября, 2019 · Жалоба Лишняя "-1", и все выходы должны быть однозначными и низкочастотными, т.е. синхронными, а сейчас от звона у монитора законно едет крыша. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 17 сентября, 2019 Опубликовано 17 сентября, 2019 · Жалоба 2 hours ago, Flip-fl0p said: Желаю удачи в решении Вашей задачи с таким синхрогенератором если посмотреть на данные с лог. анализатора, то там вроде небольшие отличия (может ли это стать причиной?...) или необходимо добиться точно таких же значений как в таблице timing? устройство попробую конечно переделать, на что вы посоветаете "равняться" (сравнивать полученные результаты с чем?)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 18 сентября, 2019 Опубликовано 18 сентября, 2019 (изменено) · Жалоба 9 hours ago, Alexey87 said: сравнивать полученные результаты с чем? Ну наверняка же есть где-то стандарт (описание) - что должно быть в идеале. Сравнивать с таким стандартом - самое правильное. Вернее - взять стандарт за исходные данные и воспроизвести заложенные в нем требования. Изменено 18 сентября, 2019 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба 9 часов назад, Alexey87 сказал: если посмотреть на данные с лог. анализатора, то там вроде небольшие отличия (может ли это стать причиной?...) или необходимо добиться точно таких же значений как в таблице timing? устройство попробую конечно переделать, на что вы посоветаете "равняться" (сравнивать полученные результаты с чем?)? Тайминги должны быть точными и соответствовать стандартам vesa. Все остальное на Ваш страх и риск. Можете попробовать сделать как меня (фактически переписать на verilog). Но главное не бездумно переписывать чужой код, главное понимать зачем было так сделано... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба 1 hour ago, Flip-fl0p said: главное понимать зачем было так сделано... с этим я и не могу разобраться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба 14 минут назад, Alexey87 сказал: с этим я и не могу разобраться... Задавайте вопросы. Хотя у меня код снабжен комментариями, и порой даже они слегка избыточны. Но я уже объяснял, как он работает, читайте внимательнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба 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 правильно ли я понимаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 19 сентября, 2019 Опубликовано 19 сентября, 2019 · Жалоба посмотрел в описание монитора у китайцев и: Экран: 7-дюймовый высокой яркости светодиодный 16:10 Разрешение: 1024*600/800*480 ссылка на монитор попробовал нарисовать квадрат на станд. мониторе и получилось, а на этом моргает... Но если подключать от видеокарты комп., то (этот 7") картинку рисует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 19 сентября, 2019 Опубликовано 19 сентября, 2019 · Жалоба Верить описанию на Али экспрессе - ну не знаю, не знаю. Я верю официальным таймингам Vesa, в соответствии с которыми и должны работать все мониторы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 19 сентября, 2019 Опубликовано 19 сентября, 2019 (изменено) · Жалоба 17 minutes ago, Flip-fl0p said: в соответствии с которыми и должны работать все мониторы. дело в том что квадрат (800x600) нормально отобразился на мониторе (стандартном), а на этом всё моргает... этот монитор автомобильный, а у них разрешение/я отличные от стандартных вот например Изменено 19 сентября, 2019 пользователем Alexey87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 19 сентября, 2019 Опубликовано 19 сентября, 2019 · Жалоба Только что, Alexey87 сказал: дело в том что квадрат (800x600) нормально отобразился на мониторе (стандартном), а на этом всё моргает... Ну значит у Вас правильный и рабочий теплый ламповый синхрогенератор. А во всем виновата буржуйская железяка. P.S. Только вот ПК мониторы, как правило, содержат в себе достаточно умные контроллеры, которые могут "проглотить" кривые тайминги, не соответствующие vesa.А дешёвые китайские нет... Я не понимаю Вас, Вы хотите убедить всех, что у Вас хороший код и проблема в железе ? Только вот Ваши доводы неубедительны. Могли бы давно разобраться и сделать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 19 сентября, 2019 Опубликовано 19 сентября, 2019 (изменено) · Жалоба 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" нет (моргает). у меня то код кривой я согласен, но из этой книги... Изменено 19 сентября, 2019 пользователем Alexey87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться