flammmable 0 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба Вопрос по стилю написания кода. Я написал код на SystemVerilog, выдающий из ПЛИСа видеосигнал HDMI через трансивер TFP410. В трансивер заходят сигналы DE, HSYNC, VSYNC, R[7:0], G[7:0], B[7:0] и ряд дополнительных сигналов, специфичных для TFP410. Сами сигналы DE, HSYNC, VSYNC формируются исходя из стандартных таймингов (с учетом всяких front porch, back porch, sync width и т.д.). Тестовый видеосигнал (заливка цветом) выдается четкий и устойчивый. Но весь код пока написан в одном модуле. Вопрос: как лучше/правильнее разбить код по модулям для повторного использования в будущем? Будет ли лучше его разбить на нижний модуль для TFP410; средний для формирования стандартных таймингов; и верхний, выдающий координату точки, принимающий цвет данной точки и пробрасывающий через себя интерфейс от нижнего модуля TFP410 на выходы ПЛИСа? Как лучше организовать выбор стандартных таймингов: группами параметров, которые можно переключать при ifdef и глобального дефайна? Или можно сделать какой-нибудь входной параметр для среднего модуля, формирующего SYNC-и и им выбирать группы параметров? Или еще как-нибудь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба 3 минуты назад, flammmable сказал: Вопрос по стилю написания кода. Я написал код на SystemVerilog, выдающий из ПЛИСа видеосигнал HDMI через трансивер TFP410. В трансивер заходят сигналы DE, HSYNC, VSYNC, R[7:0], G[7:0], B[7:0] и ряд дополнительных сигналов, специфичных для TFP410. Сами сигналы DE, HSYNC, VSYNC формируются исходя из стандартных таймингов (с учетом всяких front porch, back porch, sync width и т.д.). Тестовый видеосигнал (заливка цветом) выдается четкий и устойчивый. Но весь код пока написан в одном модуле. Вопрос: как лучше/правильнее разбить код по модулям для повторного использования в будущем? Будет ли лучше его разбить на нижний модуль для TFP410; средний для формирования стандартных таймингов; и верхний, выдающий координату точки, принимающий цвет данной точки и пробрасывающий через себя интерфейс от нижнего модуля TFP410 на выходы ПЛИСа? Как лучше организовать выбор стандартных таймингов: группами параметров, которые можно переключать при ifdef и глобального дефайна? Или можно сделать какой-нибудь входной параметр для среднего модуля, формирующего SYNC-и и им выбирать группы параметров? Или еще как-нибудь? Тайминги для мониторов выдаются в соответствии со стандартами VESA. Собственно можете называть их как в стандарте. Например VESA_800x600_60Hz или VESA_640x480_85Hz. Соответственно и выбирать тайминги проще через глобальный дефайн. А разве модуль, который выдает координату точки и формирует тайминги - это не один и тот-же модуль ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 2 декабря, 2020 Опубликовано 2 декабря, 2020 (изменено) · Жалоба 12 minutes ago, Flip-fl0p said: Тайминги для мониторов выдаются в соответствии со стандартами VESA. Собственно можете называть их как в стандарте. Например VESA_800x600_60Hz или VESA_640x480_85Hz. Соответственно и выбирать тайминги проще через глобальный дефайн. Есть некоторое неприятие использования глобального чего-угодно относящегося не ко всему проекту, а лишь к его части. Вот думал, может есть более изящный путь. 12 minutes ago, Flip-fl0p said: А разве модуль, который выдает координату точки и формирует тайминги - это не один и тот-же модуль ? Да, пожалуй, вы правы. Изменено 2 декабря, 2020 пользователем flammmable Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба Приветствую! 25 minutes ago, Flip-fl0p said: Собственно можете называть их как в стандарте. Например VESA_800x600_60Hz или VESA_640x480_85Hz. Соответственно и выбирать тайминги проще через глобальный дефайн. IMHO Более правильный путь (а тем более для SV) все же через параметры модуля . В этом случае модуль получается независим от глобальных сущностей. Можно передавать в параметрах как отдельные времена, но все же лучше enum режима, а сами enum как и значения времянок режимов описать в соответствующем package. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба 1 minute ago, RobFPGA said: все же лучше enum режима, а сами enum как и значения времянок режимов описать в соответствующем package. Если не трудно, можете чуть подробней изложить, как это будет выглядеть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба Приветствую! 28 minutes ago, flammmable said: Если не трудно, можете чуть подробней изложить, как это будет выглядеть? Примерно так. Spoiler package vga_pkg; // typedef enum { MODE_640_320 = '0, MODE_800_600 } e_MODES_t; // typedef struct { int x; int y; } st_MODE_t; st_MODE_t all_modes[2] ='{ '{640, 320}, '{800, 600} }; endpackage `timescale 1ns/1ps `default_nettype none module vga_test #( parameter vga_pkg::e_MODES_t MODE = vga_pkg::MODE_640_320 ) ( input wire clk, // Clock input wire din, output logic out ); import vga_pkg::*; st_MODE_t cur_mode = all_modes[MODE]; initial begin $display("Mode %1d:(%s): x:%4d, y:%4d", MODE, MODE.name(), cur_mode.x, cur_mode.y); end endmodule `default_nettype wire Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба 46 минут назад, RobFPGA сказал: Приветствую! IMHO Более правильный путь (а тем более для SV) все же через параметры модуля . В этом случае модуль получается независим от глобальных сущностей. Можно передавать в параметрах как отдельные времена, но все же лучше enum режима, а сами enum как и значения времянок режимов описать в соответствующем package. Удачи! Rob. Так почти все мониторы работают на стандартных таймингах VESA. Для пользовательских таймингов можно задать отдельный дефайн. Так проще. Опыт мне подсказывает что в 99% случаев будет использоваться какой-то один стандартный тайминг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 2 декабря, 2020 Опубликовано 2 декабря, 2020 · Жалоба Приветствую! 5 minutes ago, Flip-fl0p said: Так почти все мониторы работают на стандартных таймингах VESA. Для пользовательских таймингов можно задать отдельный дефайн. Так проще. Опыт мне подсказывает что в 99% случаев будет использоваться какой-то один стандартный тайминг. Вопрос простоты кода не так прост на самом деле Что проще - помнить о всех зависимостях от глобальных define и следить за консистентностью в коде, тестбенчах и P&R проекте, или аккуратно типизировать все в SV package? Тут каждый решает по своему. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться