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

Как грамотнее оформить код SV для HDMI?

Вопрос по стилю написания кода.

Я написал код на 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-и и им выбирать группы параметров? Или еще как-нибудь?

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


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

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. Соответственно и выбирать тайминги проще через глобальный дефайн.

А разве модуль, который выдает координату точки и формирует тайминги - это не один и тот-же модуль ? 

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


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

12 minutes ago, Flip-fl0p said:

Тайминги для мониторов выдаются в соответствии со стандартами VESA. Собственно можете называть их как в стандарте. Например VESA_800x600_60Hz или VESA_640x480_85Hz. Соответственно и выбирать тайминги проще через глобальный дефайн.

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

 

12 minutes ago, Flip-fl0p said:

А разве модуль, который выдает координату точки и формирует тайминги - это не один и тот-же модуль ? 

Да, пожалуй, вы правы.

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

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


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

Приветствую!

25 minutes ago, Flip-fl0p said:

Собственно можете называть их как в стандарте. Например VESA_800x600_60Hz или VESA_640x480_85Hz. Соответственно и выбирать тайминги проще через глобальный дефайн.

IMHO Более правильный путь (а тем более для SV) все же  через параметры модуля .  В этом случае  модуль получается  независим от глобальных сущностей.
Можно передавать в параметрах как отдельные времена, но все же лучше enum режима, а сами enum как и значения времянок режимов описать  в соответствующем package. 

 

Удачи! Rob.

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


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

1 minute ago, RobFPGA said:

все же лучше enum режима, а сами enum как и значения времянок режимов описать  в соответствующем package. 

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

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


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

Приветствую!

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.

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


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

46 минут назад, RobFPGA сказал:

Приветствую!

IMHO Более правильный путь (а тем более для SV) все же  через параметры модуля .  В этом случае  модуль получается  независим от глобальных сущностей.
Можно передавать в параметрах как отдельные времена, но все же лучше enum режима, а сами enum как и значения времянок режимов описать  в соответствующем package. 

 

Удачи! Rob.

Так почти все мониторы работают на стандартных таймингах VESA. Для пользовательских таймингов можно задать отдельный дефайн. Так проще. Опыт мне подсказывает что в 99% случаев будет использоваться какой-то один стандартный тайминг.

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


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

Приветствую!

5 minutes ago, Flip-fl0p said:

Так почти все мониторы работают на стандартных таймингах VESA. Для пользовательских таймингов можно задать отдельный дефайн. Так проще. Опыт мне подсказывает что в 99% случаев будет использоваться какой-то один стандартный тайминг.

Вопрос простоты кода не так прост на самом деле :wink2:  
Что проще - помнить о всех зависимостях от глобальных define и следить за консистентностью в коде, тестбенчах и P&R проекте, или аккуратно типизировать все в SV package? Тут  каждый решает по своему. 

 

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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