Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание буфера FIFO в области RAM
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Владимир_О
Добрый день!
По своей неопытности столкнулся с проблемой - программирую CycloneIV от Altera на VHDL. При создании буфера фиттер реализует его с помощью регистров, что забирает много логических ячеек (буфер размером 512*8 бит) На ПЛИСе есть еще свыше 500к бит RAM памяти. Как создать буфер в этой области? По-моему, это логичное использование памяти ПЛИС.
Hoodwin
1) Использовать визард и попросить его размещать память в блоках памяти M9K
2) Если память сделана вручную как массив сигналов, но нужно ее описывать правильно, поищите тему inferring ram в хелпе квартуса.
gosu-art
Примерно так:
Код
logic [15:0] mem [2**12 : 0];

logic [15:0] rg_ram_rd;

always_ff @(posedge iclk) begin
    if     (!EMA_WEn && !EMA_CS2) mem[EMA_ADR]<=EMA_DATA;
end

always_ff @(posedge iclk) begin
    if     (!EMA_OEn && !EMA_CS2) rg_ram_rd<=mem[EMA_ADR];
end
Maverick
Цитата(Владимир_О @ Jan 26 2012, 14:18) *
Добрый день!
По своей неопытности столкнулся с проблемой - программирую CycloneIV от Altera на VHDL. При создании буфера фиттер реализует его с помощью регистров, что забирает много логических ячеек (буфер размером 512*8 бит) На ПЛИСе есть еще свыше 500к бит RAM памяти. Как создать буфер в этой области? По-моему, это логичное использование памяти ПЛИС.

1. СМОТРИМ 2 ФАЙЛ (TEMP1.JPG) НАЖИМАЕМ НА ИКОНКУ ПОКАЗАННУЮ КРАСНОЙ СТРЕЛКОЙ.
2. СМОТРИМ 1 ФАЙЛ (TEMPLATES.JPG) - ВЫБИРАЕМ НУЖНОЕ ОПИСАНИЕ И ВСТАВЛЯЕМ ЕГО В СВОЕ ОПИСАНИЕ.

ДАЛЬШЕ ДУМАЮ ПОНЯТНО, ЧТО ДЕЛАТЬ... sm.gif

УДАЧИ...
Владимир_О
Цитата(Maverick @ Jan 26 2012, 17:28) *
1. СМОТРИМ 2 ФАЙЛ (TEMP1.JPG) НАЖИМАЕМ НА ИКОНКУ ПОКАЗАННУЮ КРАСНОЙ СТРЕЛКОЙ.
2. СМОТРИМ 1 ФАЙЛ (TEMPLATES.JPG) - ВЫБИРАЕМ НУЖНОЕ ОПИСАНИЕ И ВСТАВЛЯЕМ ЕГО В СВОЕ ОПИСАНИЕ.

ДАЛЬШЕ ДУМАЮ ПОНЯТНО, ЧТО ДЕЛАТЬ... sm.gif

УДАЧИ...



Спасибо большое. Заработало.
Если бы знал Верилог, проверил бы и предыдущий совет.
В любом случае, спасибо всем за советы. Я мыслил, что есть специальные атрибуты для обращения к RAM, а оказалось. достаточно правильно описать массив и синхронно в него записывать, чтобы Ква распознал это как RAM
kvv_spb
Добрый день, у меня похожая проблема как у автора темы. Только память используется для преобразования данных из byte в nibble.
Соответственно память имеет вход для данных [7..0] а выход [3..0]. Как правильно описать чтобы размещение было не на логике, а в блоках памяти?

Код
library ieee;
use ieee.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;
entity ram_dual is
    port
        (
        data    : in std_logic_vector(7 downto 0);
        raddr    : in std_logic_vector(3 downto 0);
        waddr    : in std_logic_vector(2 downto 0);
        we        : in std_logic := '1';
        re        : in std_logic := '1';
        clk        : in std_logic;
        q        : out std_logic_vector(3 downto 0)
        );
end ram_dual;

architecture rtl of ram_dual is
    attribute syn_ramstyle : string;
    attribute syn_ramstyle of rtl : architecture is "M-RAM";
    
    -- Build a 2-D array type for the RAM
    subtype word is std_logic_vector(7 downto 0);
    subtype nibble is std_logic_vector(3 downto 0);
    
    type mem_A is array(8 downto 0) of word;
    type mem_B is array(15 downto 0) of nibble;
    -- Declare the RAM signal.
    signal ram_A : mem_A;
    signal ram_B : mem_B;
    shared variable j: integer RANGE 0 TO 15;
begin
    
    process(clk)
    begin
        if(rising_edge(clk)) then
            if(we = '1') then
                ram_A(CONV_INTEGER (waddr)) <= data;
            end if;
        end if;
    end process;
    
    process(clk)
    begin
        if rising_edge(clk) then
            --j:=0;
            for i in 0 to 7 loop
                for k in 0 to 1 loop
                    if k = 0 then    ram_B(j)<=ram_A(i)(7 downto 4);
                    else             ram_B(j)<=ram_A(i)(3 downto 0);
                    end if;
                    j:=j+1;
                end loop;
            end loop;
        
            if (re = '1') then
                q(3 downto 0) <= ram_B(CONV_INTEGER(raddr));
            end if;    
        end if;    
    end process;
    
end rtl;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.