AFON // радиотехник affonya@mail.ru
← Проекты на VHDL

Проект 22. Постоянная память на таблице

Константный массив превращается в ПЗУ: знакогенератор, коэффициенты фильтра, таблица синуса. Содержимое зашивается при синтезе.

Задача

Хранить неизменяемую таблицу и читать её по адресу.

Тип схемы: Синхронная память только для чтения.
Модуль: rom_table. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования. Теорию по языку смотрите в статье VHDL — язык описания аппаратуры, по самим микросхемам — на странице ПЛИС.

Алгоритм

  1. Объявить тип массива нужного размера.
  2. Задать содержимое константой при объявлении.
  3. По фронту такта читать элемент по адресу.
  4. Выдавать значение через выходной регистр.

Код на VHDL

Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v22.vhd

--=====================================================
-- Проект 22. Постоянная память на таблице
-- Константный массив синтезируется в ПЗУ:
-- таблица знакогенератора или коэффициентов.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity rom_table is
    port (
        clk  : in  std_logic;
        addr : in  std_logic_vector(3 downto 0);
        data : out std_logic_vector(7 downto 0)
    );
end entity rom_table;

architecture rtl of rom_table is
    type rom_t is array (0 to 15) of std_logic_vector(7 downto 0);

    -- содержимое задаётся константой на этапе синтеза
    constant ROM : rom_t := (
        x"3F", x"06", x"5B", x"4F",                     -- 0 1 2 3
        x"66", x"6D", x"7D", x"07",                     -- 4 5 6 7
        x"7F", x"6F", x"77", x"7C",                     -- 8 9 A b
        x"39", x"5E", x"79", x"71"                      -- C d E F
    );
begin
    process (clk)
    begin
        if rising_edge(clk) then
            data <= ROM(to_integer(unsigned(addr)));    -- регистр на выходе
        end if;
    end process;
end architecture rtl;

Пояснения

  • Шестнадцатеричные литералы вида x"3F" компактнее двоичных и меньше подвержены опечаткам.
  • Небольшие таблицы синтезатор реализует на логических ячейках, крупные — переносит в блоки памяти автоматически.
  • В отличие от микроконтроллера, чтение таблицы занимает ровно один такт независимо от её размера.

Что дальше

Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.