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

Использование Record type

у меня есть данные которые я хочу логировать для отладки

L_ADC_VAL_3MS  : out std_logic_vector(17 downto 0);
L_ADC_VAL_6MS  : out std_logic_vector(17 downto 0);
L_ADC_VAL_9MS  : out std_logic_vector(17 downto 0);
L_ADC_VAL_12MS : out std_logic_vector(17 downto 0);
	 
R_ADC_VAL_3MS  : out std_logic_vector(17 downto 0);
R_ADC_VAL_6MS  : out std_logic_vector(17 downto 0);
R_ADC_VAL_9MS  : out std_logic_vector(17 downto 0);
R_ADC_VAL_12MS : out std_logic_vector(17 downto 0);
		
L_DAC_VAL_1    : in std_logic_vector(15 downto 0);  
L_DAC_VAL_2    : in std_logic_vector(15 downto 0);  
L_DAC_VAL_3    : in std_logic_vector(15 downto 0);  
	 
R_DAC_VAL_1    : in std_logic_vector(15 downto 0); 
R_DAC_VAL_2    : in std_logic_vector(15 downto 0);  
R_DAC_VAL_3    : in std_logic_vector(15 downto 0);   

но у меня 20 таких каналов. я подумал сделать так

type TUBE_DATA is record
    L_ADC_VAL_3MS  : std_logic_vector(17 downto 0);
    L_ADC_VAL_6MS  : std_logic_vector(17 downto 0);
    L_ADC_VAL_9MS  : std_logic_vector(17 downto 0);
    L_ADC_VAL_12MS : std_logic_vector(17 downto 0);
	 
    R_ADC_VAL_3MS  : std_logic_vector(17 downto 0);
    R_ADC_VAL_6MS  : std_logic_vector(17 downto 0);
    R_ADC_VAL_9MS  : std_logic_vector(17 downto 0);
    R_ADC_VAL_12MS : std_logic_vector(17 downto 0);
		
    L_DAC_VAL_1    : std_logic_vector(15 downto 0);  
    L_DAC_VAL_2    : std_logic_vector(15 downto 0); 
    L_DAC_VAL_3    : std_logic_vector(15 downto 0);  
	 
    R_DAC_VAL_1    : std_logic_vector(15 downto 0); 
    R_DAC_VAL_2    : std_logic_vector(15 downto 0);  
    R_DAC_VAL_3    : std_logic_vector(15 downto 0);  
end record TUBE_DATA;  

type array_tube_data is array (0 to 20) of TUBE_DATA;

и потом по индексу логировать соответсвующий канал. так вообще можно делать?

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

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


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

type array_tube_data is array (0 to 20) of TUBE_DATA;

signal data : array_tube_data;


data(0).L_ADC_VAL_3MS <= ...;

... <= data(20).R_DAC_VAL_3;

 

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


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

2 hours ago, andrew_b said:

type array_tube_data is array (0 to 20) of TUBE_DATA;

signal data : array_tube_data;


data(0).L_ADC_VAL_3MS <= ...;

... <= data(20).R_DAC_VAL_3;

 

спасибо. а это вообще нормально работать с таким типом? или это только для тестбенч подходит?

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


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

55 minutes ago, jenya7 said:

спасибо. а это вообще нормально работать с таким типом? или это только для тестбенч подходит?

record синтезируется. очень удобная вещь

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


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

SignalTap не видит мой log_data

type array_prog_data is array (0 to 20) of PROG_DATA;
  
signal log_data : array_prog_data;

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

 

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


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

Логи наверное пишутся и нигде не читаются. Оптимизатор их выкинул. Надо аттрибут поставить на них, чтобы не выкидывал.

Я на все логи накладываю аттрибут. Тогда в сигналтапе потом глянуть можно

reg 	log /*synthesis noprune*/;

 

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


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

1 hour ago, new123 said:

Логи наверное пишутся и нигде не читаются. Оптимизатор их выкинул. Надо аттрибут поставить на них, чтобы не выкидывал.

process (CLK)

variable l_idx   : integer range 0 to 20 := 0; 
variable r_idx   : integer range 0 to 20 := 0; 

variable l_num   : std_logic_vector(4 downto 0); 
variable r_num   : std_logic_vector(4 downto 0); 

begin

    if (rising_edge(CLK)) then 
	 
	     case LoggerState is
		  
	         when ST_IDLE =>
	             if (trig_3 = '1') then
		             LoggerState <= ST_LOG_1; 
						 new_log <= '0';
		          end if;
					 
				when ST_LOG_1 =>
				    if (ms_counter >= X"32") then
					     l_idx := to_integer(unsigned(PROGRAM(5 downto 1)));
						  r_idx := to_integer(unsigned(PROGRAM(10 downto 6)));
					     
					     LoggerState <= ST_LOG_2;
					 end if;
					 
				when ST_LOG_2 =>
				
				    new_log <= '1';
					
				    if (l_idx > 0 and l_idx < 20) then
					 
					     log_data(l_idx).L_ADC_VAL_3MS <= L_ADC_VAL_3MS;
						  log_data(l_idx).L_ADC_VAL_6MS <= L_ADC_VAL_6MS;
						  log_data(l_idx).L_ADC_VAL_9MS <= L_ADC_VAL_9MS;
						  log_data(l_idx).L_ADC_VAL_12MS <= L_ADC_VAL_12MS;
						  
						  log_data(l_idx).L_DAC_VAL_1 <= L_DAC_VAL_1;
						  log_data(l_idx).L_DAC_VAL_2 <= L_DAC_VAL_2;
						  log_data(l_idx).L_DAC_VAL_3 <= L_DAC_VAL_3;
						  
						  log_data(l_idx).L_TUBE_NUM <= t_num_l;
						  
					 end if;
					 
					 if (r_idx > 0 and r_idx < 20) then
					 
					     log_data(r_idx).R_ADC_VAL_3MS <= R_ADC_VAL_3MS;
						  log_data(r_idx).R_ADC_VAL_6MS <= R_ADC_VAL_6MS;
						  log_data(r_idx).R_ADC_VAL_9MS <= R_ADC_VAL_9MS;
						  log_data(r_idx).R_ADC_VAL_12MS <= R_ADC_VAL_12MS;
						  
						  log_data(r_idx).R_DAC_VAL_1 <= R_DAC_VAL_1;
						  log_data(r_idx).R_DAC_VAL_2 <= R_DAC_VAL_2;
						  log_data(r_idx).R_DAC_VAL_3 <= R_DAC_VAL_3;
						  
						  log_data(r_idx).R_TUBE_NUM <= t_num_r;
						  
					 end if;
					 
				    LoggerState <= ST_IDLE;
				
		      when others =>
				    LoggerState <= ST_IDLE;
				
		  end case;
	     
	 end if;

end process;

вроде всё нормально.

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


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

2 минуты назад, jenya7 сказал:

SignalTap не видит мой log_data

Где вы его ищете?

Ищите в SignalTap:Pre-synthesis.

 

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


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

2 minutes ago, jenya7 said:

вроде всё нормально.

наверное нормаль ). Но вот вы логи записываете, а дальше ни в какой логике их не используете. Конечно оптимизатор это все выкинет. Я не сразу увидел, что у вас VHDL, вам нужно в таком стиле аттрибут наложить

https://www.intel.com/content/www/us/en/programmable/quartushelp/17.0/hdl/vhdl/vhdl_file_dir_noprune.htm

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


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

1 hour ago, new123 said:

наверное нормаль ). Но вот вы логи записываете, а дальше ни в какой логике их не используете. Конечно оптимизатор это все выкинет. Я не сразу увидел, что у вас VHDL, вам нужно в таком стиле аттрибут наложить

https://www.intel.com/content/www/us/en/programmable/quartushelp/17.0/hdl/vhdl/vhdl_file_dir_noprune.htm

да. работает!

signal log_data : array_prog_data;
attribute noprune: boolean; attribute noprune of log_data: signal is true; 

и я вижу все 20 каналов - log_data(0) - log_data(20).

 

чтож я раньше так мучался :))

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


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

1 minute ago, jenya7 said:

чтож я раньше так мучался :))

я бы еще кое-что полезное выделил в использовании record

Допустим, есть очень далекий по иерархии вложенности модулей блочек test_module, который нужно конфигурировать (en, step, pause, threshold и т.п.). Если по старинке, то добавление каждого нового порта конфигурации в блок test_module приводит к добавлению этого порта во все промежуточные блоки по иерархии. А с использованием record и объявлении его в общем pkg на проект, промежуточные блоки дорабатывать не придется. Добавление нового сигнала в record произойдет автоматически во всех блоках.
 

type cfg_t is record

    en 			: std_logic;

    step 		: std_logic;

    ...

    threshold 		: std_logic_vector(DW_BYTE - 1 downto 0);

end record cfg_t;

 

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


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

1 hour ago, quato_a said:

я бы еще кое-что полезное выделил в использовании record

Допустим, есть очень далекий по иерархии вложенности модулей блочек test_module, который нужно конфигурировать (en, step, pause, threshold и т.п.). Если по старинке, то добавление каждого нового порта конфигурации в блок test_module приводит к добавлению этого порта во все промежуточные блоки по иерархии. А с использованием record и объявлении его в общем pkg на проект, промежуточные блоки дорабатывать не придется. Добавление нового сигнала в record произойдет автоматически во всех блоках.

спасибо. полезно знать.

 

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


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

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

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

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

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

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

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

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

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

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