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

RAM based shift register

Приветствую Уважаемые посетители форума.

Хотелось бы услышать ваши мысли как можно описать сдвиговый регистр на встроенных блоках памяти.

Собственно работаю с Altera. Альтеровский IP - ALT_SHIFT_TAPS меня не устраивает по ряду причин, поэтому написал свой сдвиговый регистр:

 

library ieee;
   use ieee.std_logic_1164.all;

library altera_mf;
   use altera_mf.altera_mf_components.all;

entity KAA_RAM_shreg is
   generic
   (
       width      : natural := 24;         -- Разрядность регистра
       length     : natural := 8           -- Длина сдвигового регистра
   );
port
(
	clk		    : in  std_logic;
	data_in		: in  std_logic_vector (width - 1 downto 0);
	data_out	: out std_logic_vector (width - 1 downto 0)
);
end entity;


architecture RTL of KAA_RAM_shreg is
   type      signal_array is array (length downto 0) of std_logic_vector(width - 1 downto 0); -- Сигналы для подключаения блоков памяти
   signal    signal_ram  : signal_array :=  (others => (others => '0'));
begin

   signal_ram(0) <= data_in;            -- Записывам данные в младший адрес памяти

   --=====================================================================
   -- Генерирование блоков памяти для сдвигового регистра
   --=====================================================================
   SGREG_RAM_GENERATE : for i in 0 to length - 1 generate
       altsyncram_component : altsyncram
       generic map 
       (
           clock_enable_input_a          => "BYPASS",
           clock_enable_output_a         => "BYPASS",
           intended_device_family        => "Cyclone V",
           lpm_hint                      => "ENABLE_RUNTIME_MOD=NO",
           lpm_type                      => "altsyncram",
           numwords_a                    => 1,
           operation_mode                => "SINGLE_PORT",
           outdata_aclr_a                => "NONE",
           outdata_reg_a                 => "UNREGISTERED",
           power_up_uninitialized        => "FALSE",
           read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ",
           widthad_a                     => 1,
           width_a                       => width,
           width_byteena_a               => 1
       )
       port map 
       (
           address_a => "0",
           clock0    => clk,
           data_a    => signal_ram(i),
           wren_a    => '1',
           q_a       => signal_ram(i + 1)
       );
   end generate;

   data_out <= signal_ram(length);    -- Вдаем данные наружу со старшего разряда памяти
end architecture;

Он прекрасно синтезируется и работает как надо. Но есть один маленький недостаток, который портит картину - он завязан на альтеровские библиотеки.

Попытка описать блок RAM памяти, необходимый для реализации такого регистра не увенчалась успехом. Quartus 13.1 отказывается синтезировать блок памяти для одного слова. Атрибуты синтеза также не помогают. А для полноты картины хочется сделать такой регистр универсальным и независимым от аппаратной платформы. Хотелось бы услышать ваши мысли как можно описать такой регистр. Google внятных ответов не дал.

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


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

Ну вообще-то Квартус сам способен упаковывать всякие линии задержки (то есть сдвиговые регистры) в RAM. В настройка есть соответствующие ключи.

Описывать ЛЗ надо в виде массива векторов.

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


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

Хотелось бы услышать ваши мысли как можно описать такой регистр. Google внятных ответов не дал.

logic [cW-1 : 0] ram [2**pDELAY_W];

logic [pDELAY_W-1 : 0] waddr;
logic [pDELAY_W-1 : 0] raddr;
logic       [cW-1 : 0] rdata;

always_ff @(posedge iclk) begin
  if (ival) begin
    raddr       <= raddr + 1'b1;
    waddr       <= raddr + delay;
    //
    ram[waddr]  <= iwdata;
    rdata       <= ram[raddr];
    //
    ordata      <= rdata;
  end
end

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


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

Спасибо за код !

А можно полностью код выложить с входными\выходными портами ?

А то моя немного непонимать... ;)

 

Ну вообще-то Квартус сам способен упаковывать всякие линии задержки (то есть сдвиговые регистры) в RAM. В настройка есть соответствующие ключи.

Описывать ЛЗ надо в виде массива векторов.

Есть такое. Есть даже код, который синтезируется в регистр на памяти. Но вот незадача, этот регистр начинает синтезироваться только при определенном количестве бит. При чем если для cyclone III EP3C10E144C8 нужны одни параметры такого регистра. То для чипа C5SEMA5F31C6 уже нужны другие параметры регистра... При этом есть четкие границы. К примеру регистр на 32 разрядное слово длинной в 32 разряда будет синтезирован на памяти. То регистр в 32 разрядное слово но длинной 31 разряд будет синтезирован на логике... (цифры примерные, не помню точных значений).

Настройки Quartus никак не влияют на "минимальное количетсво бит" необходимых для синтеза на памяти.

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


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

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

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

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

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

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

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

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

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

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