Задача
Хранить неизменяемую таблицу и читать её по адресу.
Тип схемы: Синхронная память только для чтения.
Модуль: rom_table. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования.
Теорию по языку смотрите в статье VHDL — язык описания аппаратуры,
по самим микросхемам — на странице ПЛИС.
Алгоритм
- Объявить тип массива нужного размера.
- Задать содержимое константой при объявлении.
- По фронту такта читать элемент по адресу.
- Выдавать значение через выходной регистр.
Код на 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.