sekat 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Это только если сброс асинхронный. Если сброс синхронный, то в списке чувствительности только тактовый сигнал:) Да я тоже так думаю. Однако статья из журнала "Компоненты и технологии" заставляет задуматься 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 из данного примера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Да я тоже так думаю. Однако статья из журнала "Компоненты и технологии" заставляет задуматься Задумываться безусловно нужно. Но статья спорная. Вот пример синхронного сброса 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; На модели они ведут по-разному и синтезируются по-разному. Вот это просто надо запомнить. Тут все написано про список чувствительности: Если этот процесс описывает триггер или логику с трггером/регистром на выходе, то в списке чувствительности должен быть тактовый сигнал и асинхронный сброс, если он используется. Больше ничего не нужно. Если процесс описывает только комбинационную логику, то в списке чувствительности должны быть все используемые входные сигналы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sekat 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба Еще вопрос начинающего, касательно использования специализированных блоках в FPGA, таких как память, умножители и проч. Понятно, что их можно использовать с помощью специальных готовых элементов, которые поставляются в виде библиотек. Однако это как минимум ухудшает читаемость кода и его переносимость. Есть и другой путь - пусть сам синтезатор использует возможности кристалла в этой части. Если я замечу, что он сделал это по каким то причинам не так как мне требуется - всегда есть возможность перейти на "ручное управление". Поясню, что я имею в виду на конкретном примере. Альтера, Циклон. Внутренняя память. Для доступа к ней можно использовать стандартные альтеровские мегафункции. А можно просто описать в VHDL array и обеспечить к нему буферизированный доступ. И сам синтезатор замечательно будет использовать эту внутреннюю память, а не пытаться строить ее на регистрах. Вопрос. Как можно "попросить синтезатор" использовать внутренние блоки умножителя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба Вопрос. Как можно "попросить синтезатор" использовать внутренние блоки умножителя? Нужно использовать атрибуты. Для симплифая это syn_dspstyle. Описание в "Reference Manual". Для других синтезаторов должно быть нечто похожее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 23 марта, 2013 Опубликовано 23 марта, 2013 · Жалоба Для квартуса смотрите в сторону DSP Block Balancing и Auto DSP Block Replacement. В хелпе всё есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 марта, 2013 Опубликовано 23 марта, 2013 · Жалоба Задумываться безусловно нужно. Но статья спорная. А можно узнать в чем спорность статьи? (согласен пример неудачный и есть ошибка в списке чувствительности не нужны сигналы en, cnt) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 23 марта, 2013 Опубликовано 23 марта, 2013 (изменено) · Жалоба А можно узнать в чем спорность статьи? Это было всего лишь мое мнение. Раздел именование. Пункт 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; по-моему, будет одинаково плохо. И задействует одни и те же ресурсы. Безусловно, есть в этой статье и много полезного, но все что я перечислил, на мой взгляд, как минимум спорно. А так как эта статья была упомянута именно в контексте списка чувствительности, то я и поделился своим мнением:) Изменено 23 марта, 2013 пользователем crono Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 марта, 2013 Опубликовано 23 марта, 2013 · Жалоба Это было всего лишь мое мнение. Раздел именование. Пункт 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 тактовых сигнала в одном модуле? Просто декларируется и все: нельзя! А почему? Я вот, допустим, использую и в чем проблема понять не могу. Здесь могу сказать, что во многих источниках пишут делать именно так, типа синтезатор лучше понимает, но опять главное правильно организовать переходы между разными клоковыми доменами... Все остальное на любителя (для Ваших замечаний). Для списка чувствительности (там согласен допустил ошибку в примере)... :( Вот статья на вики - прошу редактировать и вносить изменения :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 23 марта, 2013 Опубликовано 23 марта, 2013 · Жалоба Спасибо, за конструктивную критику... :) А так Вы автор:) Нет, как 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 ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 марта, 2013 Опубликовано 23 марта, 2013 · Жалоба А так Вы автор:) Угу, я автор :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться