реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Создание буфера FIFO в области RAM
Владимир_О
сообщение Jan 26 2012, 12:18
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915



Добрый день!
По своей неопытности столкнулся с проблемой - программирую CycloneIV от Altera на VHDL. При создании буфера фиттер реализует его с помощью регистров, что забирает много логических ячеек (буфер размером 512*8 бит) На ПЛИСе есть еще свыше 500к бит RAM памяти. Как создать буфер в этой области? По-моему, это логичное использование памяти ПЛИС.
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Jan 26 2012, 12:22
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



1) Использовать визард и попросить его размещать память в блоках памяти M9K
2) Если память сделана вручную как массив сигналов, но нужно ее описывать правильно, поищите тему inferring ram в хелпе квартуса.
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Jan 26 2012, 13:09
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



Примерно так:
Код
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
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jan 26 2012, 13:28
Сообщение #4


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Владимир_О @ Jan 26 2012, 14:18) *
Добрый день!
По своей неопытности столкнулся с проблемой - программирую CycloneIV от Altera на VHDL. При создании буфера фиттер реализует его с помощью регистров, что забирает много логических ячеек (буфер размером 512*8 бит) На ПЛИСе есть еще свыше 500к бит RAM памяти. Как создать буфер в этой области? По-моему, это логичное использование памяти ПЛИС.

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

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

УДАЧИ...
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Владимир_О
сообщение Jan 27 2012, 08:59
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915



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

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

УДАЧИ...



Спасибо большое. Заработало.
Если бы знал Верилог, проверил бы и предыдущий совет.
В любом случае, спасибо всем за советы. Я мыслил, что есть специальные атрибуты для обращения к RAM, а оказалось. достаточно правильно описать массив и синхронно в него записывать, чтобы Ква распознал это как RAM
Go to the top of the page
 
+Quote Post
kvv_spb
сообщение Jun 6 2012, 06:18
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 14-01-08
Пользователь №: 34 065



Добрый день, у меня похожая проблема как у автора темы. Только память используется для преобразования данных из 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;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016