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

ПЛИС 5576ХС1Т применение...

Нужна помощь. Пытаюсь создать однопортовую память на VHDL в квартусе 9 версии для аналога ПЛИС 5576ХС1Т FLEX10K50RI. Изначально проект был под циклон с 2-х портовой памятью и в флексе он не прижился, переделал под однопортовую, Но квартус упорно не хочет использовать память, а компилирует на тригерах. В мегавизарде память создает нормально и использует блоки памяти, а из VHDL никак. Память описывал из квартусовского примера. Кто знает как заставить квартус использовать блоки памяти?

-- Quartus II VHDL Template
-- Single port RAM with single read/write address 

library ieee;
use ieee.std_logic_1164.all;

entity single_port_ram is

    port 
    (
        clk        : in std_logic;
        addr    : in natural range 0 to 31;
        data    : in std_logic_vector(7 downto 0);
        we        : in std_logic := '1';
        q        : out std_logic_vector(7 downto 0)
    );

end entity;

architecture rtl of single_port_ram is

    -- Build a 2-D array type for the RAM
    subtype word_t is std_logic_vector(7 downto 0);
    type memory_t is array(256 downto 0) of word_t;

    -- Declare the RAM signal.    
    signal ram : memory_t;

    -- Register to hold the address 
    signal addr_reg : natural range 0 to 256;

begin

    process(clk, we)
    begin
    if(rising_edge(clk)) then
        if(we = '1') then
            ram(addr) <= data;
        end if;
        addr_reg <= addr;
    end if;
    end process;

    q <= ram(addr_reg);
end rtl;

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


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

На сколько я помню, во флексах блоки памяти нативно двухпортовые, так что Вам надо иметь два адреса - адрес для порта записи, и адрес для порта чтения. При этом, кстати, адрес для чтения вовсе не обязательно заносить в регистр, так как блоки памяти там асинхронные, а регистры опциональные, и, вроде как, там регистр на адреса один, то есть, или на запись, или на чтение.

 

и укажите атрибут этой памяти, что она должна быть размещена в EAB (атрибут ramstyle, значение "EAB")

 

UPD:

Еще, пошукайте по логам на предмет нечто вроде "uninferred due to unsupported read-during-write behavior"

 

UPD2:

Стоит еще попробовать вместо q <= ram(addr_reg); поставить q <= ram(addr); в связи с нативной асинхронностью блоков.

 

UPD3:

Вот еще конструкции, которые стоит попробовать, на тему вариаций по read-during-write behavior:

 

1)

process(clk, we)
begin
if(rising_edge(clk)) then
if(we = '1') then
ram(addr) <= data;
end if;
q <= ram(addr);
end if;
end process;

 

2)

process(clk, we)
begin
if(rising_edge(clk)) then
if(we = '1') then
ram(addr) <= data;
q <= data;
else
q <= ram(addr);
end if;
end if;
end process;

 

3) я не знаю, как это на VHDL написать (именно блокирующее "=", а не "<="), сорри, я в основном читатель на VHDL:

 

always @ (posedge clk) begin

if (we) ram[wr_addr] = d;

q = ram[rd_addr];

end

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


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

5576XC4T. Подскажите пожалуйста, куда подключать выводы TEST_MODE, RES_MODE, RES.

Схему надо делать сейчас, а закупка чего-либо будет в другом этапе.

В альтеровском аналоге таких входов не увидел.

 

..это служебные входы, предусмотрите на них подтяжки и к нулю и к единице, на всякий случай и всё.

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


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

Нужна помощь. Пытаюсь создать однопортовую память на VHDL в квартусе 9 версии для аналога ПЛИС 5576ХС1Т FLEX10K50RI. Изначально проект был под циклон с 2-х портовой памятью и в флексе он не прижился, переделал под однопортовую, Но квартус упорно не хочет использовать память, а компилирует на тригерах. В мегавизарде память создает нормально и использует блоки памяти, а из VHDL никак. Память описывал из квартусовского примера. Кто знает как заставить квартус использовать блоки памяти?

-- Quartus II VHDL Template
-- Single port RAM with single read/write address 

library ieee;
use ieee.std_logic_1164.all;

entity single_port_ram is

    port 
    (
        clk        : in std_logic;
        addr    : in natural range 0 to 31;
        data    : in std_logic_vector(7 downto 0);
        we        : in std_logic := '1';
        q        : out std_logic_vector(7 downto 0)
    );

end entity;

architecture rtl of single_port_ram is

    -- Build a 2-D array type for the RAM
    subtype word_t is std_logic_vector(7 downto 0);
    type memory_t is array(256 downto 0) of word_t;

    -- Declare the RAM signal.    
    signal ram : memory_t;

    -- Register to hold the address 
    signal addr_reg : natural range 0 to 256;

begin

    process(clk, we)
    begin
    if(rising_edge(clk)) then
        if(we = '1') then
            ram(addr) <= data;
        end if;
        addr_reg <= addr;
    end if;
    end process;

    q <= ram(addr_reg);
end rtl;

 

ниже пример двупортовой памяти (то что было под рукой), там имеются атрибуты (attribute) которые у Вас тоже должны быть. Как раз с помощью этих атрибутов можно задать, где будет размещаться память: блочная память, регистровая логика и т.д.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use std.textio.all;

entity memA is
generic 
    (
        DATA_WIDTH : natural := 4;
        ADDR_WIDTH : natural := 13
    );

    port 
    (
        clk_a    : in std_logic;
        clk_b    : in std_logic;
        addr_a    : in std_logic_vector((ADDR_WIDTH-1) downto 0);
        addr_b    : in std_logic_vector((ADDR_WIDTH-1) downto 0);
        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 memA;

architecture Behavioral of memA is

    -- Build a 2-D array type for the RAM
    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;
    
    shared variable ram : memory_t:= (others => (others => '0'));
--     signal ram : memory_t := 
--(
-- to initialize memory
--    );
     signal mem_data : std_logic_vector (14 downto 0);
     
attribute ramstyle : string;
attribute ramstyle of ram : variable is "M9K, no_rw_check";
     
     
begin

    -- Port A
    process(clk_a)
    begin
    if(rising_edge(clk_a)) then 
        if(we_a = '1') then
            ram(conv_integer(addr_a)) := data_a;
        end if;
        q_a <= ram(conv_integer(addr_a));
    end if;
    end process;

    -- Port B
    process(clk_b)
    begin
    if(rising_edge(clk_b)) then 
        if(we_b = '1') then
            ram(conv_integer(addr_b)) := data_b;
        end if;
        q_b <= ram(conv_integer(addr_b));
    end if;
    end process;        

end Behavioral;

 

уточните:

- какая у Вас память на 9 килобит или 4 килобит или другая...

- возможно для Вашего ПО эти атрибуты пишутся иначе...

PS Приведенное описание работает в квартусе

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


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

Это работает в 5576ХС4Т

 

library ieee;
use ieee.std_logic_1164.all;

entity analyzer_mem is
generic (
 DATA_WIDTH : natural := 8;
 ADDR_WIDTH : natural := 6
  );
port (
 clk     : in std_logic;
 wr_addr : in natural range 0 to 2**ADDR_WIDTH - 1;
 rd_addr : in natural range 0 to 2**ADDR_WIDTH - 1;
 data_i  : in std_logic_vector((DATA_WIDTH-1) downto 0);
 we      : in std_logic := '1';
 q       : out std_logic_vector((DATA_WIDTH -1) downto 0)
);

end analyzer_mem;

architecture rtl of analyzer_mem is

 -- Build a 2-D array type for the RAM
 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;

 -- Declare the RAM 
shared variable ram : memory_t;

begin

 process(clk, rd_addr)
 begin
   if(rising_edge(clk)) then 
     if(we = '1') then
       ram(wr_addr) := data_i;
     end if;
   end if;
   q <= ram(rd_addr);
 end process;

end rtl;

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


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

А существуют ли отладочные платы для воронежских ПЛИС? Может кто-то уже покупал/интересовался данным вопросом?

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


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

А существуют ли отладочные платы для воронежских ПЛИС? Может кто-то уже покупал/интересовался данным вопросом?

 

Да, существуют!

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


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

Здравствуйте все!

Скажите, пожалуйста, надо ли как-то закреплять корпус 5576ХС4Т, помимо пайки выводов? Клеить, например? Корпус большой, а ноги тонкие и, говорят, мягкие.

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


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

Здравствуйте все!

Скажите, пожалуйста, надо ли как-то закреплять корпус 5576ХС4Т, помимо пайки выводов? Клеить, например? Корпус большой, а ноги тонкие и, говорят, мягкие.

 

Советую почитать ТУ на этот предмет.

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


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

..у нас паяют так, без клея.

Правда серьёзно ничего не трясли, а сами по себе они не отрываются.

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


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

Спасибо за совет. Мне бы ответ.

Собственно ответ на ваш вопрос в ТУ. Цитировать не имею к сожалению права.

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


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

У меня есть ТУ. Я его с Вашей подачи даже перечитал. Может, в личке ткнёте носом? Буду очень признателеню

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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