2016-12-13 2 views
0

Мы работаем над конвейерным процессором, написанным на VHDL, и у нас есть некоторые проблемы с синхронизацией, синхронизацией и регистрами на симуляторе (код не нужно синтезировать, потому что мы будем запускать его только на симуляторе).Проблемы проектирования и синхронизации трубопроводов

Представьте, мы имеем два этапа процессора, А и В, с регистром трубопровода в середине:

  • стадии Процессор А представляет собой комбинаторные и не зависит от часов
  • трубопровода регистра R, является зарегистрировать и, следовательно, изменить свое состояние на фронте нарастания часов.
  • Этап обработки Б представляет собой сложную стадию и имеет свою собственную машину состояний и, следовательно, изменяет свое состояние и выполняет операции внутри процесса VHDL, управляемые нарастающим фронтом часов.

конфигурация будет выглядеть следующим образом

_______ ___ _______ 
    |  | | | |  | 
---| A |---|R|---| B |--- 
    |_____| |_| |_____| 

с этой конфигурацией, существует проблема синхронизации:

  • Т = 0: А получает данные, и делает его операции
  • t = 1: при нарастающем фронте R обновляет свои данные с выходом A.
  • t = 2: при восходящем фронте B получает значения R и обновляет его статус и дает результат.

Мы хотели бы, чтобы B менял свое состояние и генерировал выход при t = 1, но нам также нужен регистр посередине, чтобы сделать работу трубопровода.

Решение заключается в обновлении регистра R на заднем фронте. Но тогда мы предполагаем, что все этапы процессора работают в половине такта, а другая половина немного бесполезна.

Как эта проблема обычно решается в трубопроводах?

ответ

1

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

К вашему вопросу:
a) Техника нарезки обычно используется для вставки ступеней трубопровода в конструкцию. При правильном внедрении вам нужно только решить проблемы с управлением.
b) Моделируйте свои этапы не с помощью регистров между ними, но с прозрачными FIFO с 1 глубиной - вы получите бесплатное автоматическое управление сваливанием, и легче рассуждать о трубопроводах
c) Регистр байпаса R. Используйте данные из A, чтобы зарегистрировать их в R и B. B.

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

+0

Я не упоминал, что это присвоение класса. Спасибо за ответ! – markmb

+0

Ah ok :) Тогда просто используйте A непосредственно в B, минуя R (но все равно используйте зарегистрированное значение для других этапов) – artemonster

+0

Спасибо за ответ! Это может работать в симуляторе (все еще не пробовали). Но, если это должно было быть синтезировано (этого не будет, но мне просто интересно), как бы вы справились с такими глюками в выходных значениях A, которые могут распространяться через байпас в модуль B в середине одного такта cyle? – markmb

0

После разговора с несколькими людьми, я думаю, мы нашли правильное решение проблемы.

Этап B, который имеет свой собственный автомат, не должен иметь процесс VHDL, активированный по переднему фронту. Он должен иметь состояние государственной машины как сигнал, который хранится в регистре R.

Более подробно, эти новые сигналы должны быть добавлены:

  • state: текущее состояние конечного автомата, выход из R, вход B
  • state_next: следующее состояние конечного автомата, ввод к R, выход из B

что означает, что state изменяется для каждого state_next нарастающего фронта, и в теперь могут работать без процесса.

Смежные вопросы