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

Доброго времени суток уважаемые!!!

Есть задача построить модуль FIFO на связке CPLD+SRAM. Это образно говоря решение будет использоваться как простое FIFO для передачи данных в микроконтроллер. Мозги кипят и требуется помощь знающих людей которые смогут помочь разобраться в проблеме.

Вопрос коммутационного плана на выложенной схеме дело в том что мк и плис работают на разных тактовых частотах и тут то и проблема.

Я думаю так сделать:

Данные со входа IN_DATA[15..0] поступают во внешнюю sram и там фиксируются сигналом (wd_sram) по адресу схемы которая тут не представлена в принципе это не важно. Начало работы начинается с того что мк подаёт запрос на то чтоб данные записались в регистр (inst5) сигналом (request) и если sram находится в режиме чтения то данные записываются в регистр при этом выставляется флаг регистр загружен -(confirmation) и сбрасывается регистр запроса на запись данных из sram. По приходу следующего запроса записи из sram в регистр (inst5) флаг (confirmation) сбрасывается в ноль и мк ожидает загрузки регистра (inst5) из него потом сдвиговым регистром будут выгружены данные в мк. Так я предположил выйти из проблемы пересечения клоковых доменов асинхронной фифо. Подскажите в правильном ли я направлении двигаюсь?

FIFO.pdf

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


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

И вообще как такое реализовать можно?

Я делаю так: Завожу 2 счетчика адреса (один для чтения другой для записи). По приходу сигнала на запись в срам счетчик адреса записи инкременирую +1 и записываю данные в срам. По приходу сигнала на загрузку в регистр данных для чтения я инкременирую +1 счетчик чтения и если значение счетчика чтения равно значению счётчика записи то фифо полное и запись не возможна, если же значение счётчика чтения меньше значения счётчика записи на -1 то фифо пустое и чтение запрещено!

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


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

И вообще как такое реализовать можно?

Я делаю так: Завожу 2 счетчика адреса (один для чтения другой для записи). По приходу сигнала на запись в срам счетчик адреса записи инкременирую +1 и записываю данные в срам. По приходу сигнала на загрузку в регистр данных для чтения я инкременирую +1 счетчик чтения и если значение счетчика чтения равно значению счётчика записи то фифо полное и запись не возможна, если же значение счётчика чтения меньше значения счётчика записи на -1 то фифо пустое и чтение запрещено!

Для двухклокового фифо нужна блочная память, т.е. FPGA, а не CPLD.

В CPLD мне кажется Вы не сделаете межклоковую развязку, т.к. в CPLD должно войти тогда 2 клока....

 

ниже пример фифо на регистрах, работающее на 1 клоке, хотя оно Вам вряд ли поможет

 

-- Module Name:    my_fifo - Behavioral 
-- Description: A 32 x 9 FIFO using inferred storage

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity my_fifo is
Port ( clk   : in  STD_LOGIC;
	   wr	: in  STD_LOGIC;
	   din   : in  STD_LOGIC_VECTOR(8 downto 0);
	   empty : out STD_LOGIC;
	   full  : out STD_LOGIC;
	   rd	: in  STD_LOGIC;
	   dout  : out STD_LOGIC_VECTOR(8 downto 0));
end my_fifo;

architecture Behavioral of my_fifo is
  signal i_full : std_logic;
  signal i_empty : std_logic;

  type mem_array is array(31 downto 0) of std_logic_vector(8 downto 0);
  signal memory : mem_array;
  signal wr_ptr : unsigned(4 downto 0) := (others => '0');
  signal rd_ptr : unsigned(4 downto 0) := (others => '0');

begin
full  <= i_full;
empty <= i_empty;

flag_proc: process(wr_ptr, rd_ptr)
begin
	if wr_ptr = rd_ptr then
		i_empty <= '1';
	else
		i_empty <= '0';
	end if;

	if wr_ptr+1 = rd_ptr then
		i_full <= '1';
	else
		i_full <= '0';
	end if;
end process;

clk_proc: process(clk)
begin
	if rising_edge(clk) then
		if rd = '1' then
			if wr = '1' then
				if i_empty = '0' then
					dout <= memory(to_integer(rd_ptr));
					rd_ptr <= rd_ptr + 1;
				end if;

				memory(to_integer(wr_ptr)) <= din;
				wr_ptr <= wr_ptr + 1;

			elsif i_empty = '0' then
				dout <= memory(to_integer(rd_ptr));
				rd_ptr <= rd_ptr + 1;
			end if;
		elsif wr = '1' then
			if i_full = '0' then
				memory(to_integer(wr_ptr)) <= din;
				wr_ptr <= wr_ptr + 1;
			end if;		   
		end if;
	end if;
end process;
end Behavioral;

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


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

Для двухклокового фифо нужна блочная память, т.е. FPGA, а не CPLD.

Мне не нужна двух клоковая фифо! Мне достаточно одного клока основного на стороне плис! Я лишь хочу с мк отправлять запрос на возможность запись во внутренний регистр плис данных и как только это станет возможным плис должна загрузить в свой регистр данные из срам и сообщить об этом факте мк.

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


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

Мне не нужна двух клоковая фифо! Мне достаточно одного клока основного на стороне плис! Я лишь хочу с мк отправлять запрос на возможность запись во внутренний регистр плис данных и как только это станет возможным плис должна загрузить в свой регистр данные из срам и сообщить об этом факте мк.

Тогда Вам в помощь одноклоковое фифо (памятью которого является сама SRAM) и логика приема, передачи данных.

Пример фифо на регистрах привел в предыдущем сообщении...

 

PS Не уверен в коректности Вашей идеи...

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


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

Мне не нужна двух клоковая фифо! Мне достаточно одного клока основного на стороне плис! Я лишь хочу с мк отправлять запрос на запись в регистр плис данных и как только это станет возможным плис должна загрузить в свой регистр данные из срам и сообщить об этом факте мк.

тогда это не фифо, а озу с ручным управлением. назыавайте вещи своими именами.

 

один регистр - определяет к кому мультиплексорами подключена SRAM.

пишет этот регистр - всегда мк.

 

второй регистр - сигнал-запрос на вычитывание данных из SRAM в плис.

пишет этот регистр - мк. плис способна только сбрасывать его.

 

третий регистр - сигнал-подтверждение того что чтение со стороны плис окончено.

пишет в этот регистр - плис, мк способна только сбрасывать.

 

 

порядок такой.

мк при старте сбрасывает второй и третий регистры, подключает SRAМ к себе первым регистром, обнуляет SRAM.

 

после записи данных переключает мультиплексоры первым регистром к плис, пишет во второй запрос.

ждет прихода в третий регистр.

проверяет сбросился ли второй. если не сбросился - сбрасывает.

переключает мультиплексоры SRAM на себя первым регистром.

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


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

Тогда Вам в помощь одноклоковое фифо (памятью которого является сама SRAM) и логика приема, передачи данных.

 

PS Не уверен в корректности Вашей идеи...

Просто задача идеи состоит в том чтоб на высокой скорости загружать sram и потом по мере необходимости выгружать данные из sram. Но cpld уже есть EPM570 с подключенной к ней sram CY7C1041DV33. Почему б и не попробовать ведь ресурсов их хватает для задачи с головой. Просто криво возможно как то но возможно ведь?

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


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

Просто криво возможно как то но возможно ведь?

я полагаю, никто до сих пор не понял какого конечного результата вы хотите добиться =)

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


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

тогда это не фифо, а озу с ручным управлением. назыавайте вещи своими именами.

 

один регистр - определяет к кому мультиплексорами подключена SRAM.

пишет этот регистр - всегда мк.

Запись в срам должна быть выше по приоритету чем чтение. Данных будет немного но быстро их пишем в срам, и если только мы не пишем в срам то есть возможность чтения

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


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

Запись в срам должна быть выше по приоритету чем чтение. Данных будет немного но быстро их пишем в срам, и если только мы не пишем в срам то есть возможность чтения

Пожалуйста попытайтесь еще раз объяснить, что нужно сделать и привести требования.

И напишите все режимы/требования работы, а то у Вас в процессе общения появляются новые требования/режимы.

Для наглядности можете привести какие-то "картинки" схемы в виде квадратиков/прямоугольничков со стрелочками

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


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

Запись в срам должна быть выше по приоритету чем чтение.

при записи одной ячейки озу одновременно и из мк и из плис - какой должен быть результат?

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


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

Пожалуйста попытайтесь еще объяснить, что нужно сделать и требования.

И напишите все режимы/требования работы, а то у Вас в процессе общения появляются новые требования/режимы.

Для наглядности можете привести какие-то "картинки" схемы

Попытаюсь объяснить. Я с помощью плис захватываю данные с ацп на частоте клока плис 50mhz и пишу их во внешнюю sram. К плис подключен мк и по запросу плис должна загрузить в свой внутренний регистр данные которые читаем по принципу фифо, но только не важно какой там клок- просто послали с мк запрос на загрузку и как только это стало возможным в момент когда данные не записываются в срам, плис загружает данные в свой регистр. Сообщает об этом мк и мк с помощью сдвигового регистра как в интерфейсе SPI выгружает данные из плис к себе. Неужели не понятно объяснил?

Вот картинка вдохновившая меня на реализацию этого "псевдо-фифо"

 

при записи одной ячейки озу одновременно и из мк и из плис - какой должен быть результат?

Запись должна проходить с плис в срам! А вот если нет записи в срам но мк требует данные, то плис выгрузит из срам данные в свой внутренний регистр и сообщит об этом мк. - Как думаете это возможно?

post-44309-1441470272_thumb.jpg

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


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

Сообщает об этом мк и мк с помощью сдвигового регистра как в интерфейсе SPI выгружает данные из плис к себе.

сколько за раз выгружается байт из озу в мк?

что, если посередине передачи по SPI возникла необходимость записи со стороны плис?

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


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

сколько за раз выгружается байт из озу в мк?

что, если посередине передачи по SPI возникла необходимость записи со стороны плис?

Тут всё просто мы отправили запрос с мк в плис и ждём ответа когда плис загрузит данные в регистр чтоб потом с помощью сдвигового регистра выгрузить байт из плис в мк. Скорость выгрузки соизмерима с ёмкостью этого псевдо-фифо. Что не понятно то я вот тоже не пойму проблемы что вас воснует в такого рода передачи.

 

что, если посередине передачи по SPI возникла необходимость записи со стороны плис?

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

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


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

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

волнуют возможности возникновения неопределенностей.

и соответственно исключение всяких граничных ситуаций.

меня не покидает ощущение, что вы хотите на них плюнуть/ махнуть рукой, и получившуюся конструкцию, которая может работать иногда продать за конструкцию, которая работает.

 

практика показывает, что от 50% до 80% алгоритмов по объему - это обработка непредвиденных при нормальной работе ситуаций, и если вы ожидаете только тепличных условий по входным воздействиям - то это прямая дорога в адъ.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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