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

У меня не двух портовая память CY7C1041DV33

У неё нет такой возможности обращения к одним и тем же данным по разным портам

Да и не надо. Не о том речь.

Используйте Актив-ХДЛ!

Нарисуйте пути данных, а управление уже очевидным будет.

 

обратите внимание на часть "схемы" справа. С буквой М - сигналы на память. Внутренняя шина MUXERR - вход ФИФО. Шина UD - выход ФИФО.

M2D - двунаправленная шина данных микросхемы памяти (16 бит). M2A - адреса памяти. U11 и U7 -вот собственно две простые машинки, рулящие управлением. FIFO_FULL - внешний вход, собственно ЗАПРОС данных (имелся в виду фифо юсб контроллера). Если фулл, то данные НЕ слать. Данные из ФИФО наружу (UD) стробируются USBWRN (низкий уровень) по клоку IFCLK - формируется из основного клока.

 

А какие там проблемы с моделированием шин? Есть там конечно нюансы, но не страшные.

 

post-1002-1443175768_thumb.png

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


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

Дык, Вам и пишут - как из обычного 100МГц ОЗУ сделать а-ля двухпортовое 50МГц ОЗУ. Только порты будут фактически на ПЛИСке.

Ничего не выйдет. СОЗУ то и 100 МГц, да чтение за 1 такт никак даже на ФПГА. А ЦПЛД еще тормознее. Выйдет 33 МГц на чтение и 20... 25 на запись. Но работать будет несомненно. Только еще придется ФИФО на регистрах небольшое сделать для когерентности с МК, а то лаг на чтение неизбежен.

Изменено пользователем Corner

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


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

Приветствую!

 

Ничего не выйдет. СОЗУ то и 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.

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


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

Приветствую!

 

 

 

Ой да что вы говорите! Не пугайте маленьких. Я еще на 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

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


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

Начертал схемку которая решает практически половину всего дела :laughing:

Пока идёт запись sby мы можем записать в регистр запрос на чтение rqs и как только sby деактивируется, мы читаем байт и выставляем подтверждение ack, сбросив тем самым регистр чтения. При следующем запросе чтения мы сбросим подтверждение ack.

post-44309-1443635375_thumb.png

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


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

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

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

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

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

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

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

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

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

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