uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Доброго времени суток уважаемые!!! Есть задача построить модуль FIFO на связке CPLD+SRAM. Это образно говоря решение будет использоваться как простое FIFO для передачи данных в микроконтроллер. Мозги кипят и требуется помощь знающих людей которые смогут помочь разобраться в проблеме. Вопрос коммутационного плана на выложенной схеме дело в том что мк и плис работают на разных тактовых частотах и тут то и проблема. Я думаю так сделать: Данные со входа IN_DATA[15..0] поступают во внешнюю sram и там фиксируются сигналом (wd_sram) по адресу схемы которая тут не представлена в принципе это не важно. Начало работы начинается с того что мк подаёт запрос на то чтоб данные записались в регистр (inst5) сигналом (request) и если sram находится в режиме чтения то данные записываются в регистр при этом выставляется флаг регистр загружен -(confirmation) и сбрасывается регистр запроса на запись данных из sram. По приходу следующего запроса записи из sram в регистр (inst5) флаг (confirmation) сбрасывается в ноль и мк ожидает загрузки регистра (inst5) из него потом сдвиговым регистром будут выгружены данные в мк. Так я предположил выйти из проблемы пересечения клоковых доменов асинхронной фифо. Подскажите в правильном ли я направлении двигаюсь? FIFO.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба И вообще как такое реализовать можно? Я делаю так: Завожу 2 счетчика адреса (один для чтения другой для записи). По приходу сигнала на запись в срам счетчик адреса записи инкременирую +1 и записываю данные в срам. По приходу сигнала на загрузку в регистр данных для чтения я инкременирую +1 счетчик чтения и если значение счетчика чтения равно значению счётчика записи то фифо полное и запись не возможна, если же значение счётчика чтения меньше значения счётчика записи на -1 то фифо пустое и чтение запрещено! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба И вообще как такое реализовать можно? Я делаю так: Завожу 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Для двухклокового фифо нужна блочная память, т.е. FPGA, а не CPLD. Мне не нужна двух клоковая фифо! Мне достаточно одного клока основного на стороне плис! Я лишь хочу с мк отправлять запрос на возможность запись во внутренний регистр плис данных и как только это станет возможным плис должна загрузить в свой регистр данные из срам и сообщить об этом факте мк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Мне не нужна двух клоковая фифо! Мне достаточно одного клока основного на стороне плис! Я лишь хочу с мк отправлять запрос на возможность запись во внутренний регистр плис данных и как только это станет возможным плис должна загрузить в свой регистр данные из срам и сообщить об этом факте мк. Тогда Вам в помощь одноклоковое фифо (памятью которого является сама SRAM) и логика приема, передачи данных. Пример фифо на регистрах привел в предыдущем сообщении... PS Не уверен в коректности Вашей идеи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Мне не нужна двух клоковая фифо! Мне достаточно одного клока основного на стороне плис! Я лишь хочу с мк отправлять запрос на запись в регистр плис данных и как только это станет возможным плис должна загрузить в свой регистр данные из срам и сообщить об этом факте мк. тогда это не фифо, а озу с ручным управлением. назыавайте вещи своими именами. один регистр - определяет к кому мультиплексорами подключена SRAM. пишет этот регистр - всегда мк. второй регистр - сигнал-запрос на вычитывание данных из SRAM в плис. пишет этот регистр - мк. плис способна только сбрасывать его. третий регистр - сигнал-подтверждение того что чтение со стороны плис окончено. пишет в этот регистр - плис, мк способна только сбрасывать. порядок такой. мк при старте сбрасывает второй и третий регистры, подключает SRAМ к себе первым регистром, обнуляет SRAM. после записи данных переключает мультиплексоры первым регистром к плис, пишет во второй запрос. ждет прихода в третий регистр. проверяет сбросился ли второй. если не сбросился - сбрасывает. переключает мультиплексоры SRAM на себя первым регистром. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Тогда Вам в помощь одноклоковое фифо (памятью которого является сама SRAM) и логика приема, передачи данных. PS Не уверен в корректности Вашей идеи... Просто задача идеи состоит в том чтоб на высокой скорости загружать sram и потом по мере необходимости выгружать данные из sram. Но cpld уже есть EPM570 с подключенной к ней sram CY7C1041DV33. Почему б и не попробовать ведь ресурсов их хватает для задачи с головой. Просто криво возможно как то но возможно ведь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Просто криво возможно как то но возможно ведь? я полагаю, никто до сих пор не понял какого конечного результата вы хотите добиться =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба тогда это не фифо, а озу с ручным управлением. назыавайте вещи своими именами. один регистр - определяет к кому мультиплексорами подключена SRAM. пишет этот регистр - всегда мк. Запись в срам должна быть выше по приоритету чем чтение. Данных будет немного но быстро их пишем в срам, и если только мы не пишем в срам то есть возможность чтения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Запись в срам должна быть выше по приоритету чем чтение. Данных будет немного но быстро их пишем в срам, и если только мы не пишем в срам то есть возможность чтения Пожалуйста попытайтесь еще раз объяснить, что нужно сделать и привести требования. И напишите все режимы/требования работы, а то у Вас в процессе общения появляются новые требования/режимы. Для наглядности можете привести какие-то "картинки" схемы в виде квадратиков/прямоугольничков со стрелочками Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Запись в срам должна быть выше по приоритету чем чтение. при записи одной ячейки озу одновременно и из мк и из плис - какой должен быть результат? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Пожалуйста попытайтесь еще объяснить, что нужно сделать и требования. И напишите все режимы/требования работы, а то у Вас в процессе общения появляются новые требования/режимы. Для наглядности можете привести какие-то "картинки" схемы Попытаюсь объяснить. Я с помощью плис захватываю данные с ацп на частоте клока плис 50mhz и пишу их во внешнюю sram. К плис подключен мк и по запросу плис должна загрузить в свой внутренний регистр данные которые читаем по принципу фифо, но только не важно какой там клок- просто послали с мк запрос на загрузку и как только это стало возможным в момент когда данные не записываются в срам, плис загружает данные в свой регистр. Сообщает об этом мк и мк с помощью сдвигового регистра как в интерфейсе SPI выгружает данные из плис к себе. Неужели не понятно объяснил? Вот картинка вдохновившая меня на реализацию этого "псевдо-фифо" при записи одной ячейки озу одновременно и из мк и из плис - какой должен быть результат? Запись должна проходить с плис в срам! А вот если нет записи в срам но мк требует данные, то плис выгрузит из срам данные в свой внутренний регистр и сообщит об этом мк. - Как думаете это возможно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба Сообщает об этом мк и мк с помощью сдвигового регистра как в интерфейсе SPI выгружает данные из плис к себе. сколько за раз выгружается байт из озу в мк? что, если посередине передачи по SPI возникла необходимость записи со стороны плис? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба сколько за раз выгружается байт из озу в мк? что, если посередине передачи по SPI возникла необходимость записи со стороны плис? Тут всё просто мы отправили запрос с мк в плис и ждём ответа когда плис загрузит данные в регистр чтоб потом с помощью сдвигового регистра выгрузить байт из плис в мк. Скорость выгрузки соизмерима с ёмкостью этого псевдо-фифо. Что не понятно то я вот тоже не пойму проблемы что вас воснует в такого рода передачи. что, если посередине передачи по SPI возникла необходимость записи со стороны плис? Этой проблемы не возникнет так как на время передачи из плис в мк запроса на чтение от мк не будет по понятным причинам и не что не потревожит плис загружать данные в срам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 сентября, 2015 Опубликовано 5 сентября, 2015 · Жалоба я вот тоже не пойму проблемы что вас волнует в такого рода передачи. волнуют возможности возникновения неопределенностей. и соответственно исключение всяких граничных ситуаций. меня не покидает ощущение, что вы хотите на них плюнуть/ махнуть рукой, и получившуюся конструкцию, которая может работать иногда продать за конструкцию, которая работает. практика показывает, что от 50% до 80% алгоритмов по объему - это обработка непредвиденных при нормальной работе ситуаций, и если вы ожидаете только тепличных условий по входным воздействиям - то это прямая дорога в адъ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться