Использование записей (Records) в VHDL для чистых, повторно используемых интерфейсов FIFO
В VHDL записи (records) предлагают мощный способ оптимизировать ваш дизайн, подобно структурам в C. Группируя связанные сигналы в единый тип, вы можете резко сократить дублирование кода, улучшить читаемость и упростить порт-мапы по множеству сущностей.
Записи блестят, когда вы работаете с большими, повторяющимися интерфейсами — такими как те, что подключаются к внешней памяти или FIFO — где один и тот же набор управляющих и данных сигналов появляется многократно. Определив запись один раз в пакете и повторно используя её везде, вы сохраняете интерфейсы сущностей аккуратными и облегчаете будущие модификации.
Следующий пример демонстрирует, как создать два типа записей в выделенном пакете (example_record_pkg.vhd) и использовать их для моделирования входных и выходных сигналов FIFO. Один сигнал записи представляет все входы от FIFO, а другой — все выходы к FIFO.
Ключевые моменты:
- Записи упрощают объявления сущностей и порт-мапы в VHDL.
- Они могут содержать элементы разных типов —
std_logic,integer,std_logic_vectorи т.д. - Записи аналогичны C-структурам, предоставляя знакомую парадигму для многих инженеров.
- Общие типы записей должны находиться в одном пакете для согласованности.
- Сигналы записей могут инициализироваться константами для предсказуемых стартовых значений.
- Массивы записей позволяют структурированную обработку данных, например, таблицу конфигураций FIFO.
Ниже приведено определение пакета, за которым следует пример сущности, использующей типы записей для управления логикой чтения/записи FIFO. Код полностью соответствует стандарту IEEE 1076-2008.
library ieee; use ieee.std_logic_1164.all; package example_record_pkg is -- Outputs from the FIFO. type t_FROM_FIFO is record wr_full : std_logic; -- FIFO Full Flag rd_empty : std_logic; -- FIFO Empty Flag rd_dv : std_logic; rd_data : std_logic_vector(7 downto 0); end record t_FROM_FIFO; -- Inputs to the FIFO. type t_TO_FIFO is record wr_en : std_logic; wr_data : std_logic_vector(7 downto 0); rd_en : std_logic; end record t_TO_FIFO; constant c_FROM_FIFO_INIT : t_FROM_FIFO := (wr_full => '0', rd_empty => '1', rd_dv => '0', rd_data => (others => '0')); constant c_TO_FIFO_INIT : t_TO_FIFO := (wr_en => '0', wr_data => (others => '0'), rd_en => '0'); end package example_record_pkg;
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.example_record_pkg.all; -- USING PACKAGE HERE! entity example_record is port ( i_clk : in std_logic; i_fifo : in t_FROM_FIFO; o_fifo : out t_TO_FIFO := c_TO_FIFO_INIT -- intialize output record ); end example_record; architecture behave of example_record is signal r_WR_DATA : unsigned(7 downto 0) := (others => '0'); begin -- Handles writes to the FIFO p_FIFO_WR : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.wr_full = '0' then o_fifo.wr_en <= '1'; o_fifo.wr_data <= std_logic_vector(r_WR_DATA + 1); end if; end if; end process p_FIFO_WR; -- Handles reads from the FIFO p_FIFO_RD : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.rd_empty = '0' then o_fifo.rd_en <= '1'; end if; end if; end process p_FIFO_RD; end behave;
VHDL
- Введение в VHDL: создание вашего первого И-шлюза
- Полное руководство по преобразованию типов в VHDL с Numeric_Std и Std_Logic_Arith
- Пример процедуры VHDL: инкремент std_logic_vector
- Освоение знаковых и беззнаковых типов в VHDL: практические инсайты
- Переменные в VHDL: практические примеры и правила для надежного дизайна
- Настройка AC-анализа в SPICE: кривые, точки и параметры частотного сканирования
- Искусство и процесс производства виниловой пластинки LP
- Освоение формальной верификации модулей VHDL с помощью PSL
- Создание списков строк в VHDL: лучшие практики и пример
- Освоение операторов generate в VHDL: создание повторно используемых дебаунсеров