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

Это только если сброс асинхронный. Если сброс синхронный, то в списке чувствительности только тактовый сигнал:)

Да я тоже так думаю. Однако статья из журнала "Компоненты и технологии" заставляет задуматься http://kit-e.ru/articles/plis/2009_12_31.php . п.15.

 

15. Делайте список чувствительности наиболее полным. Когда списки чувствительности являются неполными, моделирование может не сходиться между pre- иpost-synthesis netlists. В комбинаторных процессах список чувствительности должен содержать каждый сигнал, входящий в этот процесс, а для последовательных блоков в него нужно включать тактовый, а также синхронные и асинхронные сигналы. Избегайте лишних сигналов в списке чувствительности, поскольку они замедляют процесс моделирования. Пример процесса сполным инеполным списком чувствительности показан, соответственно, в листингах 3 и 4.

 

process (clk, en, cnt, rst)
begin
if (rst = ‘1’) then
cnt <= (others => ‘0’);
elsif (clk’event and clk = ‘1’) then
if (en = ‘1’) then
cnt <= cnt + «00000001»;
end if;
end if;
count <= cnt;
end process;
Листинг 3. Пример процесса 
с полным списком чувствительности

Вопрос в данном случае в списке чувствительности к сигналу EN? Что есть "полный" список чувствительности и почему в него попадает сигнал EN из данного примера?

 

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


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

Да я тоже так думаю. Однако статья из журнала "Компоненты и технологии" заставляет задуматься

Задумываться безусловно нужно. Но статья спорная.

Вот пример синхронного сброса

process(clk)
begin
    if(rising_edge(clk))then
        if(rst = '1')then  
            en    <='0';
        else 
            en    <= a;
        end if;
    end if;
end process;

 

Вот пример асинхронного сброса.

process(clk,rst)
begin 
    if(rst = '1')then  
        en    <='0';
    elsif(rising_edge(clk))then
        en    <= a;
    end if;
end process;

На модели они ведут по-разному и синтезируются по-разному.

 

Вот это просто надо запомнить. Тут все написано про список чувствительности:

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

 

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


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

Еще вопрос начинающего, касательно использования специализированных блоках в FPGA, таких как память, умножители и проч.

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

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

Альтера, Циклон. Внутренняя память. Для доступа к ней можно использовать стандартные альтеровские мегафункции. А можно просто описать в VHDL array и обеспечить к нему буферизированный доступ. И сам синтезатор замечательно будет использовать эту внутреннюю память, а не пытаться строить ее на регистрах.

Вопрос. Как можно "попросить синтезатор" использовать внутренние блоки умножителя?

 

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


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

Вопрос. Как можно "попросить синтезатор" использовать внутренние блоки умножителя?

Нужно использовать атрибуты. Для симплифая это syn_dspstyle. Описание в "Reference Manual".

Для других синтезаторов должно быть нечто похожее.

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


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

Для квартуса смотрите в сторону DSP Block Balancing и Auto DSP Block Replacement. В хелпе всё есть.

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


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

Задумываться безусловно нужно. Но статья спорная.

А можно узнать в чем спорность статьи? (согласен пример неудачный и есть ошибка в списке чувствительности не нужны сигналы en, cnt)

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


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

А можно узнать в чем спорность статьи?

Это было всего лишь мое мнение.

Раздел именование.

Пункт 1 мне показался спорным. Допустим, ResetFirstPoint более читаем, чем resetfirstpoint.

Пункт 3 либо невнятно написан, либо опять же довольно спорен. Скажем, clkadc, clkdac более информативны чем, clk1, clk2.

Пункт 4 под вопросом. Допустим, xilinx очень часто в своих ядрах использует вектора 0 to N. И Иногда это действительно удобней.

Раздел Текст описания...

Пункт 14 для чего? Почему именно верхнего уровня, а не каждого? Наглядность нужна только для внешнего уровня? Да и вообще лишнее это, по-моему. При помощи языка VHDL и без графических редакторов можно писать довольно наглядные схемы.

Пункт 15, я считаю, просто вводит в заблуждение. Для чего в синхронном процессе в списке чувствительности что-то кроме сброса и тактового сигнала? Тем более, что сам автор в этом пункте говорит о возможном замедлении процесса моделирования.

Пункт 8 из синтеза тоже непонятен. Почему нельзя использовать 2 тактовых сигнала в одном модуле? Просто декларируется и все: нельзя! А почему? Я вот, допустим, использую и в чем проблема понять не могу.

Пункт 9. Как делать счетчики? Допустим, счетчик адреса. Я по незнанию использую арифметический оператор + или -.

Пункт 10. Я разницы не уловил. Если я напишу

if(rising_edge(clk))then

sum <= a + b + c + d;

end if;

или

if(rising_edge(clk))then

sum <= ( a + b ) + ( c + d );

end if;

по-моему, будет одинаково плохо. И задействует одни и те же ресурсы.

 

Безусловно, есть в этой статье и много полезного, но все что я перечислил, на мой взгляд, как минимум спорно. А так как эта статья была упомянута именно в контексте списка чувствительности, то я и поделился своим мнением:)

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

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


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

Это было всего лишь мое мнение.

Раздел именование.

Пункт 1 мне показался спорным. Допустим, ResetFirstPoint более читаем, чем resetfirstpoint.

Пункт 3 либо невнятно написан, либо опять же довольно спорен. Скажем, clkadc, clkdac более информативны чем, clk1, clk2.

Пункт 4 под вопросом. Допустим, xilinx очень часто в своих ядрах использует вектора 0 to N. И Иногда это действительно удобней.

Раздел Текст описания...

Пункт 14 для чего? Почему именно верхнего уровня, а не каждого? Наглядность нужна только для внешнего уровня? Да и вообще лишнее это, по-моему. При помощи языка VHDL и без графических редакторов можно писать довольно наглядные схемы.

Пункт 15, я считаю, просто вводит в заблуждение. Для чего в синхронном процессе в списке чувствительности что-то кроме сброса и тактового сигнала? Тем более, что сам автор в этом пункте говорит о возможном замедлении процесса моделирования.

Пункт 8 из синтеза тоже непонятен. Почему нельзя использовать 2 тактовых сигнала в одном модуле? Просто декларируется и все: нельзя! А почему? Я вот, допустим, использую и в чем проблема понять не могу.

Пункт 9. Как делать счетчики? Допустим, счетчик адреса. Я по незнанию использую арифметический оператор + или -.

Пункт 10. Я разницы не уловил. Если я напишу

if(rising_edge(clk))then

sum <= a + b + c + d;

end if;

или

if(rising_edge(clk))then

sum <= ( a + b ) + ( c + d );

end if;

по-моему, будет одинаково плохо. И задействует одни и те же ресурсы.

 

Безусловно, есть в этой статье и много полезного, но все что я перечислил, на мой взгляд, как минимум спорно. А так как эта статья была упомянута именно в контексте списка чувствительности, то я и поделился своим мнением:)

Спасибо, за конструктивную критику... :)

Пункт 9. Как делать счетчики? Допустим, счетчик адреса. Я по незнанию использую арифметический оператор + или -.

Можно адресацию делать через сумматор и счетчик, но описание счетчика и сумматора отличаются... Например в отчетах синтезатора у Xilinx можно всегда посмотреть что поставил синтезатор счетчик или сумматор... (и для других синтезаторов тоже)

 

Пункт 10. Я разницы не уловил. Если я напишу

if(rising_edge(clk))then

sum <= a + b + c + d;

end if;

или

if(rising_edge(clk))then

sum <= ( a + b ) + ( c + d );

end if;

по-моему, будет одинаково плохо. И задействует одни и те же ресурсы.

вот разница (вложение). Здесь опять же просто пример. Здесь был бы более удачным примером с использованием булевой алгебры (с использованием операторов and,or, not и т.д.)). Хотя в практике такое описание лучше не делать - именно для этого случая/примера.

Тоже согласен - недочет...

 

Пункт 8 из синтеза тоже непонятен. Почему нельзя использовать 2 тактовых сигнала в одном модуле? Просто декларируется и все: нельзя! А почему? Я вот, допустим, использую и в чем проблема понять не могу.

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

 

Все остальное на любителя (для Ваших замечаний).

Для списка чувствительности (там согласен допустил ошибку в примере)... :(

 

Вот статья на вики - прошу редактировать и вносить изменения :)

post-24839-1364065138_thumb.jpg

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


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

Спасибо, за конструктивную критику... :)

А так Вы автор:)

Нет, как 4 числа сложить, это понятно, что сначала нужно две пары сложить, а потом найти сумму пар. Это если стоит задача уменьшить длину конвейера.

Но просто я специально написал, что между

if(rising_edge(clk))then

sum <= a + b + c + d;

end if;

и

if(rising_edge(clk))then

sum <= ( a + b ) + ( c + d );

end if;

разницы нет, так как длина конвейера одинаковая в обоих случаях. Синтезатор просто раскроет скобки. Чтобы убедиться, я сейчас синтезировал обе эти схемы. Результат как и ожидалось побитно совпадает.

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

Нужно писать что-нибудь типа

if(rising_edge(clk))then

sum_ab <= a + b;

sum_cd <= c + d;

sum <=sum_ab + sum_cd;

end if;

Тогда да, логически это будет выглядеть как sum <= ( a + b ) + ( c + d );

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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