Цитата(ZED @ Oct 30 2009, 10:32)

Счетчик бабочек по-моему должен по-прежнему считать от 0 до 511, а функциональную связь организовать следующим образом:
Код
ADDR_WR <= std_logic_vector(BUTTERFLY_COUNTER - 5);
. Или я чего-то не так понял.
При использовании функциональной связи, если счетчик бабочек будет считать до 511, то ничего не получится по тем же причинам, что и на рис. 8. Поэтому, объяснения см. ниже.
Цитата(ZED @ Oct 30 2009, 10:32)

Кстати у меня еще появился вопрос по заметке. Если проанализировать схему на рис. 8. Там написано, что адрес записи WR_ADDR прекратит обновляться за 3 такта до окончания вычислений. Но ведь сигнал Enable запрещающий вычисления дойдет также за 3 такта, так что все компенсируется.
WR_ADDR прекратит обновляться
за 3 такта до окончания записи (т.е. 3 такта адрес будет один и тот же), а
Enable (к тому же не запрещающий, а разрешающий вычисления и запись) дойдет до памяти за 4 такта, в смысле
через 4 такта после начала
Enable на входе.
Одна и та же схема может работать в разных режимах. Это определяется управляющими сигналами. Поэтому 2 по-разному реализованные схемы (блока) в одном режиме могут давать эквивалентные результаты, а в другом режиме совершенно разные. Эквивалентные результаты не всегда означает одинаковые - нередко на временной диаграмме есть интервалы времени, на которых все равно какие значения будут принимать сигналы. В этих интервалах два по-разному реализованных блока, могут выдавать совершенно разные значения сигналов и это ни сколько не помешает работе устройства. Но зато, в те интервалы времени, где сигналы должны иметь строго определенное значение их выходы будут строго совпадать. В заметке описано, при каких условиях и в каких случаях работу схемы управления на рисунках 7, 8 и 9 можно считать эквивалентной, а в каких нет. Соответственно, в каких случаях можно использовать функциональную связь (или как правильно ее реализовать), а в каких это не получится.
Возьмем схемы на рисунках 7 и 8 и посмотрим, что получится, если подать на них одно и то же управление. Начнем со схемы на рис. 7, когда адрес записи формирует клон счетчика формирующего адрес чтения.
Enable_n обозначены выходы соответствующих триггеров задержки.
Enable_4 - выход последнего триггера, подается непосредственно на
WE. Как видно из диаграммы, за время активности входного
Enable читаются данные по адресам 0...9. Через 4 такта эти обработанные данные появятся на входе памяти. Вместе с ними на память придет задержанная на 4 такта копия сигнала
Enable (на диаграмме
Enable_4) и пока этот
Enable_4 активен счетчик-клон сформирует такую же последовательность адресов записи 0...9, что и счетчик, формирующий адреса чтения.
Нажмите для просмотра прикрепленного файлаТеперь посмотрим, какая диаграмма получится у схемы на рис. 8 при таком же сигнале
Enable на входе. Когда
RD_ADDR станет равен 3, в этом же такте станет активен сигнал
Enable_3. Вычитатель начнет работать - вычислять выражение "
RD_ADDR - 3". Т.к вычитатель имеет регистр на выходе, то результат будет появляться с задержкой на 1 такт. Таким образом, когда на выходе вычитателя появится первый правильный адрес на память одновременно придут первые данные и разрешение записи (
Enable_4). Но вот входной
Enable закончился и
RD_ADDR перестал обновляться - остановился на значении 10. Но
Enable_3 будет активен еще 3 такта и вычитатель еще три такта будет вычислять выражение "
RD_ADDR - 3". Но т.к.
RD_ADDR больше не обновляется, то и
WD_ADDR будет иметь одно и то же значение: 10 - 3 = 7. Т.е. 3 последних такта поступающие данные будут записаны по одному и тому же адресу памяти - 7.
Нажмите для просмотра прикрепленного файлаТакая же ситуация произойдет и в БПФ, если счетчик бабочек остановится на 511, а адрес записи будет реализован на основе функциональной связи.
Цитата(ZED @ Oct 30 2009, 10:32)

Вот еще у меня какая мысль увеличить счетчик бабочек на один разряд, чтоб он считал от 0 до 516 и вот по его значениям уже управлять.
Мысль хорошая. Если бы Вы высказали только ее одну, то я бы ошибочно подумал, что Вы правильно поняли как реализовать адрес записи, опираясь на функциональную связь.

Чтобы правильно реализовать адрес записи, опираясь на функциональную связь, нужно чтобы счетчик бабочек не останавливался на 511 и считал дальше. Разумеется, что нет необходимости вводить еще один счетчик для отсчета тактов паузы, если у нас и так уже есть счетчик, по которому мы можем определить и начало и конец паузы.