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

Как в VHDL присвоить индивидуальные имена регистрам массива и битам регистров?

Всем добра! Друзья, подскажите пожалуйста. Нужно создать массив из 8-битных регистров. В целом все понятно, создаем массив так:

type Reg_Map is array (0 to 15) of std_logic_vector(7 downto 0);
signal Reg : Reg_Map;

Чтобы записать, например, в регистр 0, делаем что-то вроде

Reg_WR: process (Reset, CLK)
begin
	if Reset = '1' then
	   Reg_Map(0) <= (others => '0');
	elsif rising_edge(CLK) then
	   if WR_Enable = '1' then
	      Reg_Map(0) <= Data_In;
	   end if;
	end if;
end process Reg_WR;

Все бы ничего, но когда с таким массивом работаешь,  адреса регистров и номера конкретных битов указываются цифрами. И понимать, и в дальнейшем сопровождать такой код весьма неудобно, особенно, если нужно что-то изменить в адресах и конкретных битах. Поэтому вопрос - как присвоить регистрам массива и индивидуальным битам регистров осмысленные имена, чтобы впоследствии не менять адреса и биты во многих местах кода, когда возникнет такая необходимость, а изменить один раз там, где они присваиваются? Ну, например, чтобы по адресу 0 был регистр Dev_ID, по адресу 5 - PWM, по адресу 7 - Status и т.д. И, например, в Status регистре бит 0 назвать Err_RX, бит 1 - Err_TX ну и т.д. Мне бы общую идею понять, как это делается... Если не сложно, пожалуйста приводите конкретные примеры кода. Я новичок в ПЛИС и немного запутался. Всем спасибо.

Просьба к модераторам перенести тему в правильное место, если я ее создал не там.

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


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

Да много вариантов можно придумать, например константы адреса/бита в package, отдельный модуль регистров с портами-зеркалами с назначенными структурами и т.д.. В VHDL есть еще alias но ЕМНП на массивы он не распространяется, только на отдельные регистры.

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


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

1 hour ago, des00 said:

В VHDL есть еще alias но ЕМНП на массивы он не распространяется

Смотря что вы имеете в виду. Вот из моего старого проекта:
 

-- length of statistical header in bytes
constant SH_Length  : positive := 14;  -- 112 bits
-- statistical header
subtype tStatHeader is std_logic_vector(0 to SH_Length * 8 - 1);

constant SHBurstStartBit             : natural := 96;
constant SHBurstEndBit               : natural := 97;

signal StatHeader : tStatHeader;
alias BurstStart : std_logic is StatHeader(SHBurstStartBit);
alias BurstEnd   : std_logic is StatHeader(SHBurstEndBit);

 

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


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

4 minutes ago, andrew_b said:

Смотря что вы имеете в виду. Вот из моего старого проекта:
 

-- length of statistical header in bytes
constant SH_Length  : positive := 14;  -- 112 bits
-- statistical header
subtype tStatHeader is std_logic_vector(0 to SH_Length * 8 - 1);

constant SHBurstStartBit             : natural := 96;
constant SHBurstEndBit               : natural := 97;

signal StatHeader : tStatHeader;
alias BurstStart : std_logic is StatHeader(SHBurstStartBit);
alias BurstEnd   : std_logic is StatHeader(SHBurstEndBit);

 

Если правильно помню синтаксис VHDL, у вас альасы к битам вектора, а ТС нужны альясы к битами элемента массива. И вот тут вроде оно не работает. Но могу ошибаться)

PS. Ну и в такой концепции, если у ТС 8 регистров, по 32 бита, одно описание альясов будет ещё та портянка) 

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


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

23 minutes ago, des00 said:

нужны альясы к битами элемента массива. И вот тут вроде оно не работает.

Это я не пробовал. Возможно, и не работает.

23 minutes ago, des00 said:

описание альясов будет ещё та портянка

Ашоделать? :-) Вынести его в пакет, и все дела.

Upd. Хотя нет. В пакет не получится. Это ж сигналы.

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


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

library IEEE;
use IEEE.std_logic_1164.all;

package params is

subtype tRegister is std_logic_vector(31 downto 0);
type tRegisterMap is array (integer range <>) of tRegister;

end package;


--------------------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;

use Work.params.all;

entity foo is
end foo;

architecture rtl of foo is

signal Reg_Map : tRegisterMap (0 to 15);

alias ScratchReg : tRegister is Reg_Map (0);

alias ControlReg : tRegister is Reg_Map (1);
alias EnableBit : std_logic is ControlReg (0);

begin

end rtl;

 

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


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

еще есть вариант - описать регистры как VHDL тип RECORD

если у вас этот массив состоит из одинаковых регистров, то, по-моему будет проще

обращение будет как-то так

Reg_Map(2).my_bit_field <= xxxx

Reg_Map(3).my_bit_field <= yyyy

-------------

можно еще написать функцию преобразования регистра типа record в std_logic_vector и обратно - такие функции синтезируются и по сути являются костылями, чтоб обойти типизацию VHDL

=======

ну а самый полезный совет, по-моему - бросайте VHDL и берите SV - все это на нем вообще без вопросов и "из коропки"

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


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

Большое спасибо всем! Перейти с одного языка на другой в разгар большого проекта точно не смогу.
Буду пробовать в соответствии с рекомендациями, как только что-то сочиню, выложу сюда для критики.

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


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

15 часов назад, andrew_b сказал:

SV уродлив как я не знаю кто.

Можно примеры? По мне так вполне имеет красивый лаконичный синтаксис.

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


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

может не офтоп, а автору поможет определиться с выбором языка :

---------------------------------------------

вот казалось бы - обязательно должно быть - печать в хексах

но в vhdl надо писать свою функцию

when "0000" => s='0'

.....

when "1010" => s='A'

и т.д.

-----------

в третьем тысячелетии (VHDL 2008) таки добавили функцию to_hstring() в стандартные пакаджи, но если в квесте это работает,

то в VCS уже понадобилось писать to_hstring(std_logic_vector(value)), так как она переопределена в numeric_std и самостоятельно симулятор не может понять signed / unsigned и т.п.хотя казалось бы, по общечеловеческим понятиям в хекс печатать пофигу, что сигнед, что ансигнед

а в ncsim-е мне так и не удалось заставить печатать и пришлось вот это  when "1010" => s='A' добавлять...
то есть от литерала работает to_hstring("0011001010101001010010") печатает, а от сигнала или переменной - хрен вам

ну собственно c ncsim-ом меня этот VHDL на днях выбесил, надо было срочно на VHDL-е такой недо-тестбенч показать (и комп без интернета вот эту самую функцию не нагуглишь и не скопипастишь, пришлось ручками - с учетом возни с to_hstring больше потребовало времени втрое, чем хотелось). потом проверил в других симуляторах  
 

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


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

On 10/16/2023 at 4:20 PM, andrew_b said:

SV уродлив как я не знаю кто.

Мне понравилось vhdl + hls, hls время экономит кучу, симуляция и упаковка ядер на автомате, ну и cpp все знают, учить не надо. Немного привыкнуть нужно, что выполнение кода посдедовательное, так что кое-где нужно временные переменные вводить, чтобы на комбинаторику на нарваться, а так всё супер.

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


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

On 10/16/2023 at 11:20 AM, andrew_b said:

SV уродлив как я не знаю кто.

SV почти так же "уродлив"  как и VHDL,  но все же не настолько ... 

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


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

23 hours ago, RobFPGA said:

SV почти так же "уродлив"  как и VHDL,  но все же не настолько ... 

конечно, Пушкин ни на том, ни на этом не писал.

но вот спрошу - без гугления кто-нибудь назовет аналог $finish в VHDL ? то есть у нас какие-то процессы (типа клок генератора) еще работают, но симуляция уже надоела - как ее остановить?

я понимаю, что писать тестбенчи на VHDL это еще более изощренное развлечение, чем писать на нем RTL, но технически можно же

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


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

6 минут назад, yes сказал:

но вот спрошу - без гугления кто-нибудь назовет аналог $finish в VHDL ? то есть у нас какие-то процессы (типа клок генератора) еще работают, но симуляция уже надоела - как ее остановить?

Я пользуюсь такой конструкцией:

assert false report "Simulation finished!" severity failure;

 

6 минут назад, yes сказал:

я понимаю, что писать тестбенчи на VHDL это еще более изощренное развлечение, чем писать на нем RTL, но технически можно же

Во всём нужна сноровка, закалка, тренировка... 😉

 

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...