Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Использование записей (Records) в VHDL для чистых, повторно используемых интерфейсов FIFO

В VHDL записи (records) предлагают мощный способ оптимизировать ваш дизайн, подобно структурам в C. Группируя связанные сигналы в единый тип, вы можете резко сократить дублирование кода, улучшить читаемость и упростить порт-мапы по множеству сущностей.

Записи блестят, когда вы работаете с большими, повторяющимися интерфейсами — такими как те, что подключаются к внешней памяти или FIFO — где один и тот же набор управляющих и данных сигналов появляется многократно. Определив запись один раз в пакете и повторно используя её везде, вы сохраняете интерфейсы сущностей аккуратными и облегчаете будущие модификации.

Следующий пример демонстрирует, как создать два типа записей в выделенном пакете (example_record_pkg.vhd) и использовать их для моделирования входных и выходных сигналов FIFO. Один сигнал записи представляет все входы от FIFO, а другой — все выходы к FIFO.

Ключевые моменты:

  1. Записи упрощают объявления сущностей и порт-мапы в VHDL.
  2. Они могут содержать элементы разных типов — std_logic, integer, std_logic_vector и т.д.
  3. Записи аналогичны C-структурам, предоставляя знакомую парадигму для многих инженеров.
  4. Общие типы записей должны находиться в одном пакете для согласованности.
  5. Сигналы записей могут инициализироваться константами для предсказуемых стартовых значений.
  6. Массивы записей позволяют структурированную обработку данных, например, таблицу конфигураций 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

  1. Введение в VHDL: создание вашего первого И-шлюза
  2. Полное руководство по преобразованию типов в VHDL с Numeric_Std и Std_Logic_Arith
  3. Пример процедуры VHDL: инкремент std_logic_vector
  4. Освоение знаковых и беззнаковых типов в VHDL: практические инсайты
  5. Переменные в VHDL: практические примеры и правила для надежного дизайна
  6. Настройка AC-анализа в SPICE: кривые, точки и параметры частотного сканирования
  7. Искусство и процесс производства виниловой пластинки LP
  8. Освоение формальной верификации модулей VHDL с помощью PSL
  9. Создание списков строк в VHDL: лучшие практики и пример
  10. Освоение операторов generate в VHDL: создание повторно используемых дебаунсеров