Gorby 6 25 сентября, 2015 Опубликовано 25 сентября, 2015 · Жалоба У меня не двух портовая память CY7C1041DV33 У неё нет такой возможности обращения к одним и тем же данным по разным портам Да и не надо. Не о том речь. Используйте Актив-ХДЛ! Нарисуйте пути данных, а управление уже очевидным будет. обратите внимание на часть "схемы" справа. С буквой М - сигналы на память. Внутренняя шина MUXERR - вход ФИФО. Шина UD - выход ФИФО. M2D - двунаправленная шина данных микросхемы памяти (16 бит). M2A - адреса памяти. U11 и U7 -вот собственно две простые машинки, рулящие управлением. FIFO_FULL - внешний вход, собственно ЗАПРОС данных (имелся в виду фифо юсб контроллера). Если фулл, то данные НЕ слать. Данные из ФИФО наружу (UD) стробируются USBWRN (низкий уровень) по клоку IFCLK - формируется из основного клока. А какие там проблемы с моделированием шин? Есть там конечно нюансы, но не страшные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Corner 0 28 сентября, 2015 Опубликовано 28 сентября, 2015 (изменено) · Жалоба Дык, Вам и пишут - как из обычного 100МГц ОЗУ сделать а-ля двухпортовое 50МГц ОЗУ. Только порты будут фактически на ПЛИСке. Ничего не выйдет. СОЗУ то и 100 МГц, да чтение за 1 такт никак даже на ФПГА. А ЦПЛД еще тормознее. Выйдет 33 МГц на чтение и 20... 25 на запись. Но работать будет несомненно. Только еще придется ФИФО на регистрах небольшое сделать для когерентности с МК, а то лаг на чтение неизбежен. Изменено 28 сентября, 2015 пользователем Corner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 28 сентября, 2015 Опубликовано 28 сентября, 2015 · Жалоба Приветствую! Ничего не выйдет. СОЗУ то и 100 МГц, да чтение за 1 такт никак даже на ФПГА. А ЦПЛД еще тормознее. Выйдет 33 МГц на чтение и 20... 25 на запись. Но работать будет несомненно. Только еще придется ФИФО на регистрах небольшое сделать для когерентности с МК, а то лаг на чтение неизбежен. Ой да что вы говорите! Не пугайте маленьких. Я еще на MAX7000 серии делал подобное и на статике и на просто DDR 100 MHz вполне себе рабочая была. У TC конечно память слегка неудобная для таких частот тут лучше синхронная статика подошла бы - придется помурыжится с таймингами чтобы вытянуть 100 MHz рабочей Судя по схеме у вас запись и чтение последовательные - что еще сильнее упрощает задачу Просто чередовать WR/RD циклы, Запись при накоплении 2 отсчетов, чтение ПОСТОЯННО по текущему указателю. Соответственно данные для чтения MK будут доступны сразу. Если времянка памяти не позволит переключение WR/RD в пределах такта (no ZBT) тогда придется делат WR,WR,WR,-,RD,-, итого за 6 тактов - 3 записи - 1 чтение - Для WR путь синхронный, а частота RD значительно ниже рабочей так что синхронизация будет не сложной. Дерзайте! Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 30 сентября, 2015 Опубликовано 30 сентября, 2015 · Жалоба Приветствую! Ой да что вы говорите! Не пугайте маленьких. Я еще на MAX7000 серии делал подобное и на статике и на просто DDR 100 MHz вполне себе рабочая была. У TC конечно память слегка неудобная для таких частот тут лучше синхронная статика подошла бы - придется помурыжится с таймингами чтобы вытянуть 100 MHz рабочей Дерзайте! Удачи! Rob. Спасибо за поддержку! Вот такая схема вырисовывается, остаётся реализовать конечный автомат. 8 разрядные данные гружу в регистр 16 бит и сигнал sby который теперь фактически сформировался и снизил частоту со 100 до 50Мгц. Всем этим делом будет рулить конечный автомат, получать запросы на чтение и формировать подтверждение когда процесс записи деактивируется. Ну как думаете, получится иль нет? Текст счётчика адреса выглядит следующим образом: module ADDR_counter( input res, input clk, input wr, input rd, output full, output empty, output [ADDR-1:0] Addr_Sram ); parameter ADDR = 5; // Параметр разрядности Адреса SRAM //--- Счётчики адресов чтения и записи ------------------------------ assign Addr_Sram = (wr) ? write_addr[ADDR-1 : 0] : read_addr[ADDR-1 : 0]; reg [ADDR:0] read_addr=0; always @(posedge clk or posedge res) //По такту чтения begin if(res) begin read_addr <= 0; end else begin if (rd) read_addr <= read_addr + 1'b1; else read_addr <= read_addr; end end //--- reg [ADDR:0] write_addr=0; always @(posedge clk or posedge res) //По такту записи begin if(res) begin write_addr <= 0; end else begin if (wr) write_addr <= write_addr + 1'b1; else write_addr <= write_addr; end end //--- Абработка флагов заполненности ФИФО ------------------------------ assign full = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (write_addr[ADDR] ^ read_addr[ADDR]))? 1'b1 : 1'b0; //Фифо полное assign empty = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (!(write_addr[ADDR] ^ read_addr[ADDR])))? 1'b1 : 1'b0; //Фифо пустое endmodule А вот схема fifo.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 30 сентября, 2015 Опубликовано 30 сентября, 2015 · Жалоба Начертал схемку которая решает практически половину всего дела :laughing: Пока идёт запись sby мы можем записать в регистр запрос на чтение rqs и как только sby деактивируется, мы читаем байт и выставляем подтверждение ack, сбросив тем самым регистр чтения. При следующем запросе чтения мы сбросим подтверждение ack. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться