Des333 0 May 28, 2010 Posted May 28, 2010 · Report post Странно. Наверное пишете на Verilog? В AHDL количество использованных лог.элементов получается одинаковым, что при синхронном сбросе триггера, что при асинхронном. Причем в AHDL результат синтеза, какой же все-таки сброс получится, всегда стопроцентно предсказуем. Hе то, что в Verilog. Не могли бы привести пример? А в целом очень характерно, что отстаивают преимущества VHDL/Verilog большей частию разработчики на Xilinx. Им просто больше некуда деваться. Проведем соц. опрос? :) С двумя вопросами: 1) Сколько человек из тех, кто пишет на Verilog/VHDL, используют Xilinx? 2) Сколько человек, которые используют Altera, пишут на AHDL? Quote Share this post Link to post Share on other sites More sharing options...
aprox 0 May 28, 2010 Posted May 28, 2010 · Report post В верилоге синхронный и асинхронный сброс очень сложно перепутать, разговор совсем о другом.. Пока что Вы везде предлагаете описание с помощью примитивов, покажите, пожалуйста, конструкцию которой Вы описываете синхронный/асинхронный сброс в AHDL. Это как-то хоть в тему будет Я не представляю, как в AHDL можно увернуться от использования примитивов, когда речь заходит о конструкциях на триггерах. Вот пример счетчика с синхронным сбросом SUBDESIGN sync_counter_8bit ( clk, reset : INPUT; cnt[7..0]: OUTPUT; ) VARIABLE cnt[7..0]: dff; BEGIN cnt[].clk=clk; IF reset THEN cnt[]=0; ELSE cnt[]=cnt[]+1; END; А вот счетчик с асинхронным сбросом SUBDESIGN as_counter_8bit ( clk, reset : INPUT; cnt[7..0]: OUTPUT; ) VARIABLE cnt[7..0]: dff; BEGIN cnt[].clk=clk; cnt[].nclr= !reset; cnt[]=cnt[]+1; END; Не могли бы привести пример? Уже привел пример со счетчиками. В обоих случаях количество LEs будет одинаковым. Проведем соц. опрос? :) С двумя вопросами: 1) Сколько человек из тех, кто пишет на Verilog/VHDL, используют Xilinx? 2) Сколько человек, которые используют Altera, пишут на AHDL? Правильнее спросить- какой процент использующих Xilinx пишут на Verilog/VHDL? Ответ предсказуем= 100%. А вот процент альтеровцев, пишущих на Verilog/VHDL окажется совсем не столь однозначной цифрой. Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 28, 2010 Posted May 28, 2010 (edited) · Report post А вот счетчик с асинхронным сбросом SUBDESIGN as_counter_8bit ( clk, reset : INPUT; cnt[7..0]: OUTPUT; ) VARIABLE cnt[7..0]: dff; BEGIN cnt[].clk=clk; cnt[].nclr= !reset; cnt[]=cnt[]+1; END; простите, я может не допонял, а с какого значения счетчик начнет считать здесь? В какое значение сбрасываем cnt? Edited May 28, 2010 by Putnik Quote Share this post Link to post Share on other sites More sharing options...
bogaev_roman 0 May 28, 2010 Posted May 28, 2010 (edited) · Report post to ViKo +1 полчаса втыкал на RTL :smile3046: Потом правда в планнер полез, где все на своем месте. В общем загнал следующий код: module test_project ( input clk, input rst_sync, input rst_async, input in, output reg out_sync, output reg out_async ); always @(posedge clk or negedge rst_async) if (~rst_async) out_async<=1'b0; else out_async<=in; always @(posedge clk) if (~rst_sync) out_sync<=1'b0; else out_sync<=in; endmodule Ну на RTL я даже смотреть не стал, а вот на Texnology Map все логично выглядит. На планере, правда стандартный косяк с мультиплексором на входе синхронного триггера, но об этом много раз на форуме писали... to x736c http://electronix.ru/forum/index.php?showt...%E5%EA%F1%EE%F0 там описан как раз синхронный случай и как избежать появление мультиплексора (правда не для всех семейств :) ) to putnik у триггеров не бывает несколько тактовых сигналов, то есть можно работать по срезу только тактового сигнала Но у триггера может быть асинхронный сброс который и залепливается в always структуру. Если я напишу always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; То запись negedge rst теряет смысл (обнуление именно по rst=1), точно также запись or rst в данном случае тоже имеет значение только при posedge rst. Поэтому логичное вроде и понятное но недопустимое always @(posedge clk or rst) действительно только логично либо при срезе либо при фронте сброса (если обнуляется при сбросе равном 1, то срез для Нас вообще не важен, просто хранится предыдущее значение). Edited May 28, 2010 by bogaev_roman Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 28, 2010 Posted May 28, 2010 · Report post Уже привел пример со счетчиками. В обоих случаях количество LEs будет одинаковым. Я имел в виду пример непредсказуемости результата синтеза сигнала сброса для Verilog. А Ваши счетчики на Verilog будут также занимать одинаковое количество LE. Правильнее спросить- какой процент использующих Xilinx пишут на Verilog/VHDL? Ответ предсказуем= 100%. А вот процент альтеровцев, пишущих на Verilog/VHDL окажется совсем не столь однозначной цифрой. Если людям не из чего выбирать - логично, что они выбирать не будут. А вот сколько человек не воспользуются возможностью писать на AHDL, имея эту самую возможность - вот это, как раз, показатель. Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 28, 2010 Posted May 28, 2010 · Report post Но у триггера может быть асинхронный сброс который и залепливается в always структуру я сам так асинхронный сброс и использую, просто работает он по уровню, а не по фронту, как могло бы показаться из описания Quote Share this post Link to post Share on other sites More sharing options...
bogaev_roman 0 May 28, 2010 Posted May 28, 2010 · Report post я сам так асинхронный сброс и использую, просто работает он по уровню, а не по фронту, как могло бы показаться из описания Ну а на чем Вы работаете если не секрет? Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 28, 2010 Posted May 28, 2010 (edited) · Report post естественно что используется асинхронный сброс, так always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; или так always @(posedge clk or negedge rst) if (~rst) D<=1'b0; else D<=in; и логичней была бы недопустимая конструкция always @(posedge clk or rst) if (rst) D<=1'b0; else D<=in; или always @(posedge clk or ~rst) if (~rst) D<=1'b0; else D<=in; ----------------------------------------------- Работаю с Xilinx, в основном использую Синплифай и Квесту, в этом вопрос был? Edited May 28, 2010 by Putnik Quote Share this post Link to post Share on other sites More sharing options...
bogaev_roman 0 May 28, 2010 Posted May 28, 2010 (edited) · Report post to putnik просто работает он по уровню, а не по фронту, как могло бы показаться из описания Я просто понять не могу Вы хотите сказать, что применяя структуру описания триггера с асинхронным сбросом реально получается триггер с синхронным сбросом? Если так, то либо триггера с асинхронным сбросом нет на Вашей плис, либо какие-то настройки выставлены, чтоб любой управляющий асинхронный сигнал, поступающий на вход триггера был засинхронизирован через доплогику на информационном входе (в этом тоже есть логика). Я в квартусе на планере смотрел для стратикс4 - асинхронный вход у триггера используется. С кзайлинксом уже давно не работал и сказать ничего не могу. Ну а если обнуление происходит по уровню сброса, а не по фронту/срезу тактовой, так именно это и читается из описания и не понятно что Вас смущает... Я лично всегда применяю именно синхронный сброс, только на триггерах-пересинхронизаторах(ну, например, входной сигнал на одной частоте формируется, а управляющий сигнал на другой) использую асинхронный сброс. Так с временными задержками попроще будет. Edited May 28, 2010 by bogaev_roman Quote Share this post Link to post Share on other sites More sharing options...
des00 26 May 28, 2010 Posted May 28, 2010 · Report post Самого несколько напрягает подобного вида запись......... А написать ............ Написать так можно, другое дело что это будет не синтезируемая конструкция. Синтезируемое подмножество языка Verilog стандартизировано, ищите приложения к стандарту. И стандартизированно именно такое описание триггера с асинхронным сбросом %) Привык пользоваться триггером с синхронным сбросом. После синтеза занимает больше ресурсов, нежели применение асинхронного сброса. Как предпочтительнее? Насчет предпочтений воспользуйтесь поиском, тема хорошо обсуждалась на этом форуме. Также рекомендую почитать статью гуру хилых Кена Чапмена "Let's talk about Reset". Насчет ресурса, что бы не быть голословным приведите пример увеличения ресурса вызванного применением именно синхронного сброса. Только сделайте это пожалуйста в отдельной теме, эту тему, после появления в ней одного человека, с которым нельзя вести конструктивный диалог, опять превратили в помойку. ЗЫ. Когда будете приводить пример обязательно уточните семейство ПЛИС, потому как например у хилых и альтер подходы к сбросам совершенно различны. Quote Share this post Link to post Share on other sites More sharing options...
x736C 1 May 28, 2010 Posted May 28, 2010 (edited) · Report post Для AHDL-xHDL холливара вроде есть отдельная тема. bogaev_roman, спасибо за ссылку. Моделировал в квартусе, но не использовал настройки (стояли по умолчанию): Allow Synchronous Control Signals Force Use of Synchronous Clear Signals Auto Clock Enable Replacement (On) Очевидно, Квартус вставлял мультиплексор. Первые две настройки у меня закрыты для редактирования. Пока не разобрался почему. Имел в виду, что к сбросу иногда есть соблазн что-то добавить. always @ (posedge clk) if (~rst | muxStatusFlow_ii) crc <= {8{1'b0}}; else if (crcEn) begin ... end Насчет отдельной темы. Я это ради интереса когда-то быстро проверил на каком-то полупустом проекте. Поэтому эксперимент мне придется повторить. Если результат окажется эквивалентным по ресурсам, то темы создавать не стану. За наводку спасибо, прочитаю. Edited May 28, 2010 by x736C Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 28, 2010 Posted May 28, 2010 · Report post to putnik Я просто понять не могу Вы хотите сказать, что применяя структуру описания триггера с асинхронным сбросом реально получается триггер с синхронным сбросом? Если так, то либо триггера с асинхронным сбросом нет на Вашей плис, либо какие-то настройки выставлены, чтоб любой управляющий асинхронный сигнал, поступающий на вход триггера был засинхронизирован через доплогику на информационном входе (в этом тоже есть логика). Я в квартусе на планере смотрел для стратикс4 - асинхронный вход у триггера используется. С кзайлинксом уже давно не работал и сказать ничего не могу. Ну а если обнуление происходит по уровню сброса, а не по фронту/срезу тактовой, так именно это и читается из описания и не понятно что Вас смущает... Я лично всегда применяю именно синхронный сброс, только на триггерах-пересинхронизаторах(ну, например, входной сигнал на одной частоте формируется, а управляющий сигнал на другой) использую асинхронный сброс. Так с временными задержками попроще будет. :)я не говорил что у меня что-то не так получается, откуда вы взяли? always @(posedge clk or posedge rst) - асинхронный сброс always @(posedge clk) - синхронный сброс Вы действительно думаете, что асинхронный сброс в триггере по фронту работает? По крайней мере так вы выразились.. собственно только к этому моменту у меня и претензии.. Quote Share this post Link to post Share on other sites More sharing options...
bogaev_roman 0 May 28, 2010 Posted May 28, 2010 · Report post Вы действительно думаете, что асинхронный сброс в триггере по фронту работает? По крайней мере так вы выразились.. собственно только к этому моменту у меня и претензии.. Ну может я неправильно выразился или сам чего-то не понимаю, извиняюсь. Тут главное "не стыдно не знать, стыдно не знать и не пытаться узнать". always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; Дословно понимаю как: если произойдет событие фронт clk или фронт rst, то сделать следующее: если уровень rst равен 1, то D присвоить значение логического нуля, по другому - присвоить D значение in. И да, обнуление произойдет при уровне rst равном 1, но только при возникновении вышеописанного события (частный случай - фронт сброса), при этом выходное значение поменяется не ожидая фронта тактовой частоты. Поправьте, пожалуйста, если неправ. :smile3046: Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 28, 2010 Posted May 28, 2010 · Report post Тут главное "не стыдно не знать, стыдно не знать и не пытаться узнать". Для этого мы и общаемся здесь :beer: Как я представляю в триггере только один тактовый вход по срезу может работать, по описанию так и читается - always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; Дословно понимаю как: если произойдет событие фронт clk или фронт rst, то сделать следующее: если уровень rst равен 1, то D присвоить значение логического нуля, по другому - присвоить D значение in. И да, обнуление произойдет при уровне rst равном 1, но только при возникновении вышеописанного события (частный случай - фронт сброса), при этом выходное значение поменяется не ожидая фронта тактовой частоты. а на самом деле если произойдет событие фронт clk или уровень rst == 1, то сделать следующее: если уровень rst равен 1, то D присвоить значение логического нуля, по другому - присвоить D значение in. И да, обнуление произойдет при уровне rst равном 1, но только при возникновении вышеописанного события (частный случай - уровень сброса в 1), при этом выходное значение поменяется не ожидая фронта тактовой частоты. пусть Гуру поправят или подтвердят, а то по кругу пошли уже - нехорошо.. Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 May 28, 2010 Posted May 28, 2010 · Report post Я не представляю, как в AHDL можно увернуться от использования примитивов, когда речь заходит о конструкциях на триггерах. Вот пример счетчика с синхронным сбросом А вот счетчик с асинхронным сбросом cnt[].nclr= !reset; Уже привел пример со счетчиками. В обоих случаях количество LEs будет одинаковым. Правильнее спросить- какой процент использующих Xilinx пишут на Verilog/VHDL? Ответ предсказуем= 100%. А вот процент альтеровцев, пишущих на Verilog/VHDL окажется совсем не столь однозначной цифрой. Намеренно в первом примере end if пропустили. А во втором с портом напутали? Некрасиво. А результат - так такой же как и у других. А процент альтеровцев на HDL - 100% Конечно приходиться держать единицы AHDLовцев. На сопровождении уже устаревшего. Так ведь деваться некуда. Но заслуженный отдых на горизонте им маячит. Quote Share this post Link to post Share on other sites More sharing options...