Описание памяти с использованием VHDL 2 Описание памяти

Скачать презентацию Описание памяти с использованием VHDL 2 Описание памяти Скачать презентацию Описание памяти с использованием VHDL 2 Описание памяти

31014-cifrovaya_shemotehnika_2013_lekciya_19_memory_in_vhdl.ppt

  • Количество слайдов: 46

>Описание памяти с использованием VHDL Описание памяти с использованием VHDL

>2 Описание памяти как массива Память – это массив векторов. Количество ячеек (векторов) определяет 2 Описание памяти как массива Память – это массив векторов. Количество ячеек (векторов) определяет разрядность. Разрядность отдельного вектора = разрядность ячейки.

>3 Пример 3 Пример

>4 Объявление памяти Описать тип  type mem is array (0 to 31) of 4 Объявление памяти Описать тип type mem is array (0 to 31) of std_logic_vector (7 downto 0); Описать адресные входы и входы и выходы данных. Тип данных для данных должен совпадать с типом данных для ячеек. Тип данных для адреса – integer или основанные на нем типы

>5 Пример параметризированного модуля generic (addr_width: natural := 5); port (  … 5 Пример параметризированного модуля generic (addr_width: natural := 5); port ( … addr: in integer range 0 to 2** addr_width - 1;) ); … type mem is array(2** addr_width -1 downto 0) of std_logic_vector(7 downto 0);

>6 Преобразование типов unsigned integer signed std_logic_vector signed () unsigned () to_integer () to_integer 6 Преобразование типов unsigned integer signed std_logic_vector signed () unsigned () to_integer () to_integer () to_signed () to_unsigned () std_logic_vector () std_logic_vector () numeric_std numeric_std standart std_logic_1164

>7 ПЗУ При описании ПЗУ прошивка должна определяться при написании программы Варианты: Создание константы 7 ПЗУ При описании ПЗУ прошивка должна определяться при написании программы Варианты: Создание константы или сигнала типа массив. Использование оператора case. Использование *.mif файла. Работает только в Quartus II.

>8 ПЗУ – вариант 1. Инициализация. type ROM is array (0 to 7) of 8 ПЗУ – вариант 1. Инициализация. type ROM is array (0 to 7) of std_logic_vector(7 downto 0); constant Content: ROM := ( 0 => "00000001", 1 => "00000010", 2 => "00000011", 3 => "00000100", 4 => "00000101", 5 => "00000110", 6 => "00000111", 7 => "00001000", );

>9 ПЗУ - вариант 1. Использование. Доступ к памяти: Data_out <= Content(Addr); Требования к 9 ПЗУ - вариант 1. Использование. Доступ к памяти: Data_out <= Content(Addr); Требования к типам портов: Data_out - std_logic_vector(7 downto 0) Адрес – integer.

>10 ПЗУ – вариант 1. Пример. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;  entity 10 ПЗУ – вариант 1. Пример. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity ROM is port (Clock : in std_logic; Reset : in std_logic; Enable : in std_logic; Read : in std_logic; Address : in std_logic_vector(4 downto 0); Data_out : out std_logic_vector(7 downto 0) ); end ROM;

>11 architecture Behav of ROM is      type ROM_Array is 11 architecture Behav of ROM is type ROM_Array is array (0 to 31) of std_logic_vector(7 downto 0); constant Content: ROM_Array := ( 0 => "00000001", 1 => "00000010", 2 => "00000011", . . . 12 => "00001101", 13 => "00001110", 14 => "00001111", OTHERS => "11111111" ); begin process(Clock, Reset, Read, Address) begin if( Reset = '1' ) then Data_out <= "ZZZZZZZZ"; elsif( Clock'event and Clock = '1' ) then if Enable = '1' then if( Read = '1' ) then Data_out <= Content(to_integer(unsigned(Address)); else Data_out <= "ZZZZZZZZ"; end if; end if; end if; end process; end Behav;

>12 Результаты моделирования 12 Результаты моделирования

>13 Влияние опций  компилятора (1) 13 Влияние опций компилятора (1)

>14 Влияние опций  компилятора (2) 14 Влияние опций компилятора (2)

>15 Задание опций  компилятора (1) 15 Задание опций компилятора (1)

>16 Задание опций  компилятора (2) 16 Задание опций компилятора (2)

>17 Задание опций  компилятора (3) 17 Задание опций компилятора (3)

>18 Задание опций  компилятора (4) Меню Assignments -> Settings… Страница Analysis and Synthesis 18 Задание опций компилятора (4) Меню Assignments -> Settings… Страница Analysis and Synthesis Settings Кнопка More Settings… Диалог More Analysis & Synthesis Settings Изменяем параметры: Allow Any RAM Size For Recognition, Allow Any ROM Size For Recognition – размещение любых по размеру блоков ОЗУ и ПЗУ во встроенных блоках ПЛИС. Auto RAM to Logic Cell Conversion – автоматическое размещение небольших блоков памяти в логических элементах.

>19 ПЗУ – вариант 2. Инициализация. port (  …  data : out 19 ПЗУ – вариант 2. Инициализация. port ( … data : out std_logic_vector (3 downto 0); addr : in integer range 0 to 7;) );

>20 ПЗУ – вариант 2. Использование. case addr is  when 0 => data 20 ПЗУ – вариант 2. Использование. case addr is when 0 => data <= “1111”; when 1 => data <= “1110”; when 2 => data <= “1101”; when 3 => data <= “1100”; when other => data <= “0000”; end case;

>21 ПЗУ – вариант 2. Пример. LIBRARY ieee; USE ieee.std_logic_1164.all;  ENTITY mem IS 21 ПЗУ – вариант 2. Пример. LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mem IS PORT ( clock: IN STD_LOGIC; address: IN STD_LOGIC_VECTOR(7 downto 0); data_out: OUT STD_LOGIC_VECTOR(5 downto 0) ); END mem;

>22 ARCHITECTURE rtl OF mem IS  BEGIN PROCESS (clock) BEGIN  IF rising_edge 22 ARCHITECTURE rtl OF mem IS BEGIN PROCESS (clock) BEGIN IF rising_edge (clock) THEN CASE address IS WHEN "00000000" => data_out <= "000111"; WHEN "00000001" => data_out <= "000110"; WHEN "00000010" => data_out <= "000010"; WHEN "00000011" => data_out <= "100000"; WHEN "00000100" => data_out <= "100010"; WHEN "00000101" => data_out <= "001110"; WHEN "00000110" => data_out <= "111100"; WHEN "00000111" => data_out <= "110111"; WHEN "00001000" => data_out <= "111000"; WHEN "00001001" => data_out <= "100110"; WHEN "00001010" => data_out <= "101010"; WHEN "00001011" => data_out <= "000001"; WHEN "00001100" => data_out <= "101010"; WHEN OTHERS => data_out <= "101111"; END CASE; END IF; END PROCESS; END rtl;

>23 Результаты моделирования 23 Результаты моделирования

>24 ПЗУ – вариант 3. Инициализация (1). type mem_t is array(255 downto 0) of 24 ПЗУ – вариант 3. Инициализация (1). type mem_t is array(255 downto 0) of std_logic_vector(7 downto 0); signal rom : mem_t; attribute ram_init_file : string; attribute ram_init_file of rom : signal is "mem.mif";

>25 ПЗУ – вариант 3. Инициализация (2). Используем атрибут синтеза под названием «ram_init_file» Атрибут 25 ПЗУ – вариант 3. Инициализация (2). Используем атрибут синтеза под названием «ram_init_file» Атрибут задает *.mif файл, который содержит прошивку ПЗУ. Атрибут находится в библиотеке «altera_syn_attributes». Папка C:\altera\91\quartus\libraries\vhdl\altera\

>26 ПЗУ – вариант 3. Инициализация (3). Для использования ram_init_file: Декларировать атрибут синтеза как 26 ПЗУ – вариант 3. Инициализация (3). Для использования ram_init_file: Декларировать атрибут синтеза как строковый тип: attribute ram_init_file : string; Создать связь атрибута ram_init_file с сигналом, который описывает ПЗУ. Значение атрибута должно совпадать с именем *.mif файла: attribute ram_init_file of rom : signal is "mem.mif";

>27 ПЗУ – вариант 3. Инициализация (4). -- объявили тип массив type mem_t is 27 ПЗУ – вариант 3. Инициализация (4). -- объявили тип массив type mem_t is array(255 downto 0) of std_logic_vector(7 downto 0); -- объявили сигнал signal rom : mem_t; -- объявили атрибут attribute ram_init_file : string; -- ассоциировали атрибут с сигналом attribute ram_init_file of rom : signal is "mem.mif";

>28 ПЗУ – вариант 3. Использование.  port  (clk : in std_logic; 28 ПЗУ – вариант 3. Использование. port (clk : in std_logic; addr : in natural range 0 to 255; q : out std_logic_vector(7 downto 0)); … process(clk) begin if(rising_edge(clk)) then q <= rom(addr); end if; end process;

>29 Содержимое *.mif файла 29 Содержимое *.mif файла

>30 ПЗУ – вариант 3. Пример. library ieee, altera; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use 30 ПЗУ – вариант 3. Пример. library ieee, altera; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use altera.altera_syn_attributes.all; entity mem is port (clk : in std_logic; addr : in natural range 0 to 255; q : out std_logic_vector(7 downto 0)); end entity;

>31 architecture rtl of mem is  type mem_t is array(255 downto 0) of 31 architecture rtl of mem is type mem_t is array(255 downto 0) of std_logic_vector(7 downto 0); signal rom : mem_t; attribute ram_init_file : string; attribute ram_init_file of rom : signal is "mem.mif"; begin process(clk) begin if(rising_edge(clk)) then q <= rom(addr); end if; end process; end rtl;

>32 Результаты моделирования и компиляции 32 Результаты моделирования и компиляции

>33 ОЗУ Синхронное ОЗУ со следующей таблицей истинности: 33 ОЗУ Синхронное ОЗУ со следующей таблицей истинности:

>34 Программа library ieee;   use ieee.std_logic_1164.all;  use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; 34 Программа library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; entity mem is port (clk : in std_logic; wn_r: in std_logic; a : in std_logic_vector(4 downto 0); di : in std_logic_vector(3 downto 0); do : out std_logic_vector(3 downto 0)); end mem;

>35 architecture syn of mem is     type ram_type is array 35 architecture syn of mem is type ram_type is array (31 downto 0) of std_logic_vector (3 downto 0); signal RAM : ram_type; begin process (clk) begin if (clk'event and clk = '1') then if (wn_r = '0') then -- запись при «0», чтение по «1» RAM(to_integer(unsigned(a))) <= di; else do <= RAM(to_integer(unsigned(a))); end if; end if; end process; end syn;

>36 Результаты моделирования 36 Результаты моделирования

>37 Двухпортовая память ОЗУ Порт А Порт Б Адрес А Адрес Б Входные данные 37 Двухпортовая память ОЗУ Порт А Порт Б Адрес А Адрес Б Входные данные А Выходные данные А Входные данные Б Выходные данные Б

>38 Достоинства двухпортовой памяти Возможность одновременного чтения и записи данных в один блок памяти. 38 Достоинства двухпортовой памяти Возможность одновременного чтения и записи данных в один блок памяти. Увеличение быстродействия.

>39 Проблемы двухпортовой памяти Необходимо четко определить поведение во время операции «чтение во время 39 Проблемы двухпортовой памяти Необходимо четко определить поведение во время операции «чтение во время записи» Поддерживается не всеми семействами и микросхемами.

>40 library ieee; use ieee.std_logic_1164.all; entity mem is  generic ( DATA_WIDTH : natural 40 library ieee; use ieee.std_logic_1164.all; entity mem is generic ( DATA_WIDTH : natural := 8; ADDR_WIDTH : natural := 6); port (clk : in std_logic; addr_a : in natural range 0 to 2**ADDR_WIDTH - 1; addr_b : in natural range 0 to 2**ADDR_WIDTH - 1; data_a : in std_logic_vector((DATA_WIDTH-1) downto 0); data_b : in std_logic_vector((DATA_WIDTH-1) downto 0); we_a : in std_logic := '1'; we_b : in std_logic := '1'; q_a : out std_logic_vector((DATA_WIDTH -1) downto 0); q_b : out std_logic_vector((DATA_WIDTH -1) downto 0)); end mem;

>41 architecture rtl of mem is  subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0); 41 architecture rtl of mem is subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0); type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t; signal ram : memory_t; begin -- Port A process(clk) begin if(rising_edge(clk)) then if(we_a = '1') then ram (addr_a) <= data_a; q_a <= data_a; end if; q_a <= ram(addr_a); end if; end process;

>42  -- Port B   process(clk)  begin  if(rising_edge(clk)) then 42 -- Port B process(clk) begin if(rising_edge(clk)) then if(we_b = '1') then ram(addr_b) <= data_b; q_b <= data_b; end if; q_b <= ram(addr_b); end if; end process; end rtl;

>43 Результаты компиляции. Cyclone II. 43 Результаты компиляции. Cyclone II.

>44 Результаты компиляции. Cyclone III. 44 Результаты компиляции. Cyclone III.

>45 Результаты моделирования 45 Результаты моделирования

>46 Результаты моделирования. Чтение во время записи. 46 Результаты моделирования. Чтение во время записи.