FPGA 0 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Всем добра! Друзья, подскажите пожалуйста. Нужно создать массив из 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 ну и т.д. Мне бы общую идею понять, как это делается... Если не сложно, пожалуйста приводите конкретные примеры кода. Я новичок в ПЛИС и немного запутался. Всем спасибо. Просьба к модераторам перенести тему в правильное место, если я ее создал не там. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба Да много вариантов можно придумать, например константы адреса/бита в package, отдельный модуль регистров с портами-зеркалами с назначенными структурами и т.д.. В VHDL есть еще alias но ЕМНП на массивы он не распространяется, только на отдельные регистры. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба 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); Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба 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 бита, одно описание альясов будет ещё та портянка) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба 23 minutes ago, des00 said: нужны альясы к битами элемента массива. И вот тут вроде оно не работает. Это я не пробовал. Возможно, и не работает. 23 minutes ago, des00 said: описание альясов будет ещё та портянка Ашоделать? :-) Вынести его в пакет, и все дела. Upd. Хотя нет. В пакет не получится. Это ж сигналы. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба 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; 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба еще есть вариант - описать регистры как VHDL тип RECORD если у вас этот массив состоит из одинаковых регистров, то, по-моему будет проще обращение будет как-то так Reg_Map(2).my_bit_field <= xxxx Reg_Map(3).my_bit_field <= yyyy ------------- можно еще написать функцию преобразования регистра типа record в std_logic_vector и обратно - такие функции синтезируются и по сути являются костылями, чтоб обойти типизацию VHDL ======= ну а самый полезный совет, по-моему - бросайте VHDL и берите SV - все это на нем вообще без вопросов и "из коропки" Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба SV уродлив как я не знаю кто. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FPGA 0 16 октября, 2023 Опубликовано 16 октября, 2023 · Жалоба Большое спасибо всем! Перейти с одного языка на другой в разгар большого проекта точно не смогу. Буду пробовать в соответствии с рекомендациями, как только что-то сочиню, выложу сюда для критики. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба 15 часов назад, andrew_b сказал: SV уродлив как я не знаю кто. Можно примеры? По мне так вполне имеет красивый лаконичный синтаксис. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба может не офтоп, а автору поможет определиться с выбором языка : --------------------------------------------- вот казалось бы - обязательно должно быть - печать в хексах но в 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 больше потребовало времени втрое, чем хотелось). потом проверил в других симуляторах Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба On 10/16/2023 at 4:20 PM, andrew_b said: SV уродлив как я не знаю кто. Мне понравилось vhdl + hls, hls время экономит кучу, симуляция и упаковка ядер на автомате, ну и cpp все знают, учить не надо. Немного привыкнуть нужно, что выполнение кода посдедовательное, так что кое-где нужно временные переменные вводить, чтобы на комбинаторику на нарваться, а так всё супер. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 17 октября, 2023 Опубликовано 17 октября, 2023 · Жалоба On 10/16/2023 at 11:20 AM, andrew_b said: SV уродлив как я не знаю кто. SV почти так же "уродлив" как и VHDL, но все же не настолько ... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 23 hours ago, RobFPGA said: SV почти так же "уродлив" как и VHDL, но все же не настолько ... конечно, Пушкин ни на том, ни на этом не писал. но вот спрошу - без гугления кто-нибудь назовет аналог $finish в VHDL ? то есть у нас какие-то процессы (типа клок генератора) еще работают, но симуляция уже надоела - как ее остановить? я понимаю, что писать тестбенчи на VHDL это еще более изощренное развлечение, чем писать на нем RTL, но технически можно же Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 6 минут назад, yes сказал: но вот спрошу - без гугления кто-нибудь назовет аналог $finish в VHDL ? то есть у нас какие-то процессы (типа клок генератора) еще работают, но симуляция уже надоела - как ее остановить? Я пользуюсь такой конструкцией: assert false report "Simulation finished!" severity failure; 6 минут назад, yes сказал: я понимаю, что писать тестбенчи на VHDL это еще более изощренное развлечение, чем писать на нем RTL, но технически можно же Во всём нужна сноровка, закалка, тренировка... 😉 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться