Перейти к содержанию
    

Память на VHDL

Господа-товарище подскажите пожалуйста как реализовать память на VHDL для FLEX10 в Quartus II.

Конкретный вопрос, прошу дать конкретный ответ с примерами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Quartus-е для этого есть MegaWizard plug-in manager. Выбираешь в Memory compiler нужный тип памяти и вперед. Насчет примеров не знаю, разве что скриншотов наделать? но лень :) .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

USE ieee.numeric_std.ALL;

 

ENTITY ram IS

GENERIC

(

ADDR_WIDTH : integer := 4;

DATA_WIDTH : integer := 8

);

PORT

(

clk : IN std_logic;

data : IN std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);

addr_wr : IN std_logic_vector(ADDR_WIDTH - 1 DOWNTO 0);

addr_rd : IN std_logic_vector(ADDR_WIDTH - 1 DOWNTO 0);

we : IN std_logic;

q : OUT std_logic_vector(DATA_WIDTH - 1 DOWNTO 0)

);

END ram;

 

ARCHITECTURE rtl OF ram IS

TYPE memory IS ARRAY(0 TO 2 ** ADDR_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);

 

SIGNAL mem : memory;

BEGIN

 

 

PROCESS (clk)

BEGIN

IF (clk'event AND clk = '1') THEN

IF (we = '1') THEN

mem(to_integer(unsigned(addr_wr))) <= data;

END IF;

 

q <= mem(to_integer(unsigned(addr_rd)));

END IF;

END PROCESS;

END rtl;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В продолжение темы, все стандартные способы уже испробывал, работают.

Чистый модуль памяти работает без проблем.

Спасибо всем отозвавшимся.

Возник следующий вопрос, треба сделать кучу блоков памяти типа

mem_type is array(0 to 63) of std_logic_vector(7 downto 0)

в принципе то же самое, только надо обращаться к ним в любой момент времени как поступить с сигналми типа wr и rd, вобщем надо работать с нними как с обычными регистрамино, но упорядочееными в массив и что бы они были на блоках памяти.

Как это реализовать, как описать, для плис Altera flex10k и Actel APA300 только на VHDL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только надо обращаться к ним в любой момент времени как поступить с сигналми типа wr и rd

Убрать их совсем. Состояние памяти будет изменяться при изменении адреса или данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убрать их совсем. Состояние памяти будет изменяться при изменении адреса или данных.

А можно какнибудь жестко задать что это память через атрибуты, что бы всегда быть увереным в actel ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно какнибудь жестко задать что это память через атрибуты, что бы всегда быть увереным в actel ?

Это вам не хухры-мухры. За правильностью использования необходимо следить всегда! В противном случае результат -> регистры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

USE ieee.numeric_std.ALL;

 

ENTITY ram IS

GENERIC

(

ADDR_WIDTH : integer := 4;

DATA_WIDTH : integer := 8

);

PORT

(

clk : IN std_logic;

data : IN std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);

addr_wr : IN std_logic_vector(ADDR_WIDTH - 1 DOWNTO 0);

addr_rd : IN std_logic_vector(ADDR_WIDTH - 1 DOWNTO 0);

we : IN std_logic;

q : OUT std_logic_vector(DATA_WIDTH - 1 DOWNTO 0)

);

END ram;

 

ARCHITECTURE rtl OF ram IS

TYPE memory IS ARRAY(0 TO 2 ** ADDR_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);

 

SIGNAL mem : memory;

BEGIN

 

 

PROCESS (clk)

BEGIN

IF (clk'event AND clk = '1') THEN

IF (we = '1') THEN

mem(to_integer(unsigned(addr_wr))) <= data;

END IF;

 

q <= mem(to_integer(unsigned(addr_rd)));

END IF;

END PROCESS;

END rtl;

 

Так это какая память однопортовая или двупортовая? :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так это какая память однопортовая или двупортовая? :help:

 

Это однопортовая, двухпортовая будет выглядеть так:

library ieee;
use ieee.std_logic_1164.all;

entity MyRAM is

    generic 
    (
        DATA_WIDTH : natural := 8;
        ADDR_WIDTH : natural := 10
    );

    port 
    (
        clk_a    : in std_logic;
        clk_b    : 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 MyRAM;

architecture rtl of MyRAM is

    type memory is array(addr_a'high downto 0) of std_logic_vector((DATA_WIDTH-1) downto 0);
    signal ram : memory;

begin

    process(clk_a)
    begin
    if(rising_edge(clk_a)) then 
        if(we_a = '1') then
            ram(addr_a) <= data_a;
            q_a <= data_a;
        else 
            q_a <= ram(addr_a);
        end if;
    end if;
    end process;

    process(clk_b)
    begin
    if(rising_edge(clk_b)) then 
        if(we_b = '1') then
            ram(addr_b) <= data_b;
            q_b <= data_b;
        else 
            q_b <= ram(addr_b);
        end if;
    end if;
    end process;

end rtl;

 

В Quartus есть Insert Tamplate - можно выбрать любой тип памяти и вставить в свой проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это однопортовая

Ойданупрям :) Адреса чтения и записи разные и независимые. Чтение и запись одновременно возможны. С одного порта такого не сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...