Jump to content

    
Sign in to follow this  
flammmable

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

Recommended Posts

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

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

Share this post


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

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

Share this post


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

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

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

 

12 minutes ago, Flip-fl0p said:

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

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

Edited by flammmable

Share this post


Link to post
Share on other sites

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

25 minutes ago, Flip-fl0p said:

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
1 minute ago, RobFPGA said:

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

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

Share this post


Link to post
Share on other sites

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

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.

Share this post


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

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

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

 

Удачи! Rob.

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

Share this post


Link to post
Share on other sites

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

5 minutes ago, Flip-fl0p said:

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

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

 

Удачи! Rob.

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