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

5576хс3, FIFO

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

Подскажите  пожалуйста, кто знает, как реализовать FIFO на верилоге в кавартусе 9.0, используя его библиотеки для FLEX10KE ??

Попробовал реализовать dcfifo и lm-fifo_dc, первый моделируется нормально , второй в моделе уже "записан". На практике первый даёт нули, второй так и не пробовал.

Вопрос в связи с этим  также как посмотреть в квартусе используются ли блоки EAB ?

 

Спасибо!

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


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

another_one,

Коль скоро Вы начали пробовать с мегафункциями, можете попробовать с lpm_ram_dq.

Я отлаживал что-то похожее на FIFO, затем применил в проекте. Циклическая запись 32 чисел, затем по команде прекращение записи и начинается считывание последних 4 чисел (по циклу). Проект рабочий, можете воспользоваться как образцом, правда он на VHDL, но там элементарно, разберётесь.

В 23.10.2019 в 16:39, another_one сказал:

Попробовал реализовать dcfifo и lm-fifo_dc, первый моделируется нормально , второй в моделе уже "записан". На практике первый даёт нули, второй так и не пробовал.

Странно, что моделируется нормально, а на практике даёт нули... Обычно бывает наоборот.

В 23.10.2019 в 16:39, another_one сказал:

как посмотреть в квартусе используются ли блоки EAB ?

На этапе компиляции проекта в саммари приводится сколько мемори битс использовано.

 

 

Rammm.jpg

 

Спойлер

LIBRARY ieee;
USE ieee.std_logic_1164.all;


--  Entity Declaration

ENTITY block_name IS
	-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
	PORT
	(
		lp0_q : IN integer range 0 to 255;
		Clk : IN STD_LOGIC;
		Launch : IN STD_LOGIC;
		Data_in : IN integer range 0 to 255;
		lp0_data : OUT integer range 0 to 255;
		lp0_we : OUT STD_LOGIC;
		lp0_address : BUFFER integer range 0 to 31;
		Data_out : OUT integer range 0 to 255
	);
	-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
	
END block_name;


--  Architecture Body

ARCHITECTURE block_name_architecture OF block_name IS


Signal Address0 : integer range 0 to 31;
Shared variable lp0_address0 : integer range 0 to 3;


BEGIN


Process(Launch, Data_in, lp0_q)
begin
if Launch='0'
  then lp0_data <= Data_in;
  else Data_out <= lp0_q;
end if;
end process;


Process(Clk)
begin
if Launch='0'
  then lp0_we <= Clk;
  else lp0_we <= '0';
end If;
end process;


Process(Clk, Launch)
begin
if(Clk'event)and(Clk='0')
  then
    if Launch='0'
      then
-- Текущий адрес ОЗУ (чтение, запись - неважно, хотя можно формировать
--  раздельно, я в проекте для изделия разделил)
        lp0_address <= lp0_address + 1;
-- Адрес, с которого начнётся отсчёт адресов при считывании из ОЗУ
        Address0 <= Address0 + 1;
      else
-- Вообще говоря, так в боевом проекте делать нельзя, надо разнести по разным
--  тактам вычисление lp0_address0 и lp0_address. Здесь я так поступил для
--  простоты и наглядности:
        lp0_address0 := lp0_address0 - 1;
        lp0_address <= lp0_address0 + Address0 - 3;
    end if;
end if;    
end process;


END block_name_architecture;

 

 

lp0_dq-2 - для форума.7z

Изменено пользователем MrGalaxy
убрал подсветку синтаксиса

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


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

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

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

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

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

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

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

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

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

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