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

Добрый день господа! Просвятите ламера (+)

Задача:

Есть блок памяти с определенной задержкой считывания(положим 3 такта) Из него нужно прочитать пакеты по 4 слова, но начальный адресс пакета может быть любым. (т.е. например читаем с 1 го адреса 4 слова, затем с 15го 4 слова и т.д.). Есть блок арифметики который работает с этими словами, реализованный на основе конечного автомата.

Теперь сам вопрос. Если я делаю "контроллер" этой памяти, в который пишу: начальный адрес, длину пакета(запас на будующее) и жду когда он выдаст сигнал валидности считаных данных, по которому идут переходы конечного автомата ариметического блока, то получаеться что если я выставляю параметры для "контроллера" памяти в том состоянии КА в котором нахожусь, то я теряю на каждой загрузке контроллера памяти 3 такта, но при этом получаю простую логику функционирования КА.

Что бы не терять эти 3 такта и выставляю адреса с учетом этой задержки (что бы была конвеерная схема). Но это приводит к усложнению конечного автомата и по сути сводит на нет преимущества "контроллера" памяти как такового и не позволяет построить "гибкий" конечный автомат(его функционирование жестко привязанно к конкретному контроллеру памяти).

 

Вариантов решения проблемы я вижу 3:

1. Вообще отказаться от "контроллера" памяти как такового

2. Сделать "микропрограмный" контроллер памяти, в котором "зашиты" требуемые переходы по адресам.(благо они у меня фиксированные)

3. Сделать "конвееризируемый" контроллер памяти с очередью команд и т.д.

 

А может быть эта задача решаеться проще ?

 

ЗЫ. Сильно не пинайте, я только учюсь.

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


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

+++Что бы не терять эти 3 такта и выставляю адреса с учетом этой задержки (что бы была конвеерная схема). Но это приводит к усложнению конечного автомата и по сути сводит на нет преимущества "контроллера" памяти как такового и не позволяет построить "гибкий" конечный автомат(его функционирование жестко привязанно к конкретному контроллеру памяти).+++

ну так и в чём проблема? выставляй действительно адрес за 3 такта, если он тебе конечно тогда уже известен. (это к стати не называется конвейером)

по поводу усложнения - ну- нужно чем-то жертвовать (как альтернатива - можно считать на калькуляторе или счётах). мне не совсем ясна задача - построить арифм блок - или написать контроллер памяти? а какая память? судя по описанию SRAM рпитом NoBL/ZBT (zero bus turn-around) - IMHO придётся усложнять арифм блок

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


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

ну так и в чём проблема? выставляй действительно адрес за 3 такта, если он тебе конечно тогда уже известен. (это к стати не называется конвейером)

по поводу усложнения - ну- нужно чем-то жертвовать (как альтернатива - можно считать на калькуляторе или счётах). мне не совсем ясна задача - построить арифм блок - или написать контроллер памяти? а какая память? судя по описанию SRAM рпитом NoBL/ZBT (zero bus turn-around) - IMHO придётся усложнять арифм блок

 

Проблема в том, что я хочу разбить проект на независимые блоки, у меня есть 5 арфим. блоков (с разной математикой, но одинаковым скелетом) и каждый работает со своим блоком двухпортовой памяти, но расчет адреса считывания у них требует от 1 до 4 тактов(определяеться глубиной логики, можно сделать все за 1 такт, но тогда я не укладываюсь в тактовую частоту :( ).

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

А не изменять арифм.блоки, что потребует большего времени для проверки.

Т.е. арифм. блок загрузил контроллер работой и ждет от него стробов, формируя запросы на чтение (добавление очереди адресов) не "точно вовремя" а когда ему удобно и при этом не терять время на ожидание.

 

Спасибо всем!

Сам разобрался, (пошел не по тому пути интеграции проекта :) ).

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


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

Вариантов решения проблемы я вижу 3:

1. Вообще отказаться от "контроллера" памяти как такового

2. Сделать "микропрограмный" контроллер памяти, в котором "зашиты" требуемые переходы по адресам.(благо они у меня фиксированные)

3. Сделать "конвееризируемый" контроллер памяти с очередью команд и т.д.

 

А может быть эта задача решаеться проще ?

 

ЗЫ. Сильно не пинайте, я только учюсь.

Все мы учимся... Постоянно. Иначе мы не тем занялись :)

 

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

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

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

"автомат вычислений" делает своё дело и дальше пропихивает результат.

 

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

 

"в самом начале" (в начале цикла работы системы) какой-то синхронизирующий сигнал приводит и "автомат перебора" и "автомат вычислений" и приёмник данных от автомата вычилений в исходное состояние и потом просто приёмник данных через какое-то время (зависящее от реализации контроллера памяти и автомата вычислений) получит первую порцию, но он будет знать, что она первая.

 

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

 

Вдогонку - я не всегда знаю, какая у меня в системе конвейерная задеоржка :) Нет, ну я могу её посчитать, пройдясь по всем блокам в цепочке, но зачем? Сама по себе она не волнует, стадии синхронизируют одна другую, да и ладно.

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


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

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

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

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

"автомат вычислений" делает своё дело и дальше пропихивает результат.

спасибо за ответ. :)

именно по этому пути я и пошел :)

правда искал этот путь несколько дней(у всех бывает первый раз, в первый класс) :)

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


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

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

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

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

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

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

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

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

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

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