TSURKOV 0 1 декабря, 2005 Опубликовано 1 декабря, 2005 · Жалоба Господа подскажите пожалуйста почему не работат эта конструкция. В Quartus в симуляторе на тест сразу лог ед, а я ожидаю что он в начале в нуле потом десять раз проклокает и встанет в ед. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// reg test always @ (posedge clk) begin test = 0; repeat(10) @ (posedge clk) begin test = ~test; end test = 1; end ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Заранее большое спасибо !!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 1 декабря, 2005 Опубликовано 1 декабря, 2005 (изменено) · Жалоба тут был плохой ответ, извините. :( я подумаю еще Изменено 1 декабря, 2005 пользователем id_gene Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 1 декабря, 2005 Опубликовано 1 декабря, 2005 · Жалоба Господа подскажите пожалуйста почему не работат эта конструкция. В Quartus в симуляторе на тест сразу лог ед, а я ожидаю что он в начале в нуле потом десять раз проклокает и встанет в ед. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// reg test always @ (posedge clk) begin test = 0; repeat(10) @ (posedge clk) begin test = ~test; end test = 1; end ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Заранее большое спасибо !!!! почитайте warning-и внимательнее :smile3046: и потом - repeat(10) @ (posedge clk) begin test = ~test; end как вы видите в железе? почитайте в хелпе q5 про "Repeat Statement, Quartus II Verilog HDL support" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 1 декабря, 2005 Опубликовано 1 декабря, 2005 · Жалоба Господа подскажите пожалуйста почему не работат эта конструкция. В Quartus в симуляторе на тест сразу лог ед, а я ожидаю что он в начале в нуле потом десять раз проклокает и встанет в ед. Вы путаете блоки always и initial: always блок после окончания сразу начнется исполнятся заново, так что в 1 сигнал-то встанет, но на след. клоке снова сбросится в 0 и т.д. Почему квартус выдает сразу 1, я не знаю, должно быть что-то похожее на деление частоты на 2. Если после выхода из repeat сигнал будет 0, то он сразу установится в 1 и в этом месте меандр исказится. и потом - repeat(10) @ (posedge clk) begin test = ~test; end как вы видите в железе? Проблем с оператором repeat() я не вижу - это абсолютно синтезируемая конструкция, и делает она именно то, что и обещает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TSURKOV 0 1 декабря, 2005 Опубликовано 1 декабря, 2005 · Жалоба Увжаемый Gate большое спасибо за ваш отзыв. Я раньше работал с альтерой в схемном режиме, но в душе больше программист поэтому решил заняться верилогом. В связи с этим пока много вопросов. По поводу Initial из ворниногов я понял что квартус его не поддерживает и выкидывает всю конструкцию. Может я не прав? или что-то надо установить? Квартус по описанию, что я приводил выше генерит тригер с еденицей на входе и clk на тактовом входе, отсюда ед на выходе. НО ПОЧЕМУ ???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 1 декабря, 2005 Опубликовано 1 декабря, 2005 · Жалоба Господа подскажите пожалуйста почему не работат эта конструкция. В Quartus в симуляторе на тест сразу лог ед, а я ожидаю что он в начале в нуле потом десять раз проклокает и встанет в ед. Вы путаете блоки always и initial: always блок после окончания сразу начнется исполнятся заново, так что в 1 сигнал-то встанет, но на след. клоке снова сбросится в 0 и т.д. Почему квартус выдает сразу 1, я не знаю, должно быть что-то похожее на деление частоты на 2. Если после выхода из repeat сигнал будет 0, то он сразу установится в 1 и в этом месте меандр исказится. и потом - repeat(10) @ (posedge clk) begin test = ~test; end как вы видите в железе? Проблем с оператором repeat() я не вижу - это абсолютно синтезируемая конструкция, и делает она именно то, что и обещает. это с чего вдруг должно быть деление входной частоты?? вы смотрели в RTL, тот что получается после синтеза? посмотрите, очень поучительно. ну а если оставить одну "синтезируемую" конструкцию repeat пробовали? попробуйте: always @ (posedge clk) begin repeat(10) @ (posedge clk) begin test = ~test; end end смотрим RTL и что видите? ну так все таки, как по вашему в железе будет выглядеть тот HDL, что привел TSURKOV? Увжаемый Gate большое спасибо за ваш отзыв. Я раньше работал с альтерой в схемном режиме, но в душе больше программист поэтому решил заняться верилогом. В связи с этим пока много вопросов. По поводу Initial из ворниногов я понял что квартус его не поддерживает и выкидывает всю конструкцию. Может я не прав? или что-то надо установить? Квартус по описанию, что я приводил выше генерит тригер с еденицей на входе и clk на тактовом входе, отсюда ед на выходе. НО ПОЧЕМУ ???? если ваша задача написать testbench - квартус на на свалку! юзайте ActiveHDL, ModelSim. testbench-и в Q это бред!! удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 2 декабря, 2005 Опубликовано 2 декабря, 2005 · Жалоба В симуляторе (моделсим и нц-верилог) код моделируется нормально. Не так, как вы хотели (не 10 раз и не встает в конце, а идет в цикл), но все-таки работает. А в квартусе вы видимо уже моделируете результат синтеза (никогда не пользовался их симулятором). А синтезируется все как вы сказали - триггер с входом в 1. (зачем там триггер - мне вообще не понятно, почему не закоротить на 1?). Почему такой результат - это ограничение синтеза квартуса. Синплифай, например, просто делит частоту на два. Не понимают они такие конструкции (настолько не понимают, что даже не жалуются). Интересно было бы, конечно, чтобы автоматически счетчики в таких случаях синтезировались. Но особой надежды что это когда-нибудь появится нет. Да вроде и так все обходятся. Так что если вы синтезируемый результат хотите - обычно используют явный счетчик на сумматоре или сдвигах, и по нему выход разрешают/запрещают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 2 декабря, 2005 Опубликовано 2 декабря, 2005 · Жалоба Почему такой результат - это ограничение синтеза квартуса. Синплифай, например, просто делит частоту на два. Не понимают они такие конструкции (настолько не понимают, что даже не жалуются). Интересно было бы, конечно, чтобы автоматически счетчики в таких случаях синтезировались. Но особой надежды что это когда-нибудь появится нет. Да вроде и так все обходятся. Так что если вы синтезируемый результат хотите - обычно используют явный счетчик на сумматоре или сдвигах, и по нему выход разрешают/запрещают. Если вы утверждаете, что синплифай синтезирует неверно, поскольку "(настолько не понимают, что даже не жалуются)", то вы ошибаетесь. repeat() входит в список поддерживаемых операторов. Вы можете ради интереса засинтезировать этот пример, только добавив входной сигнал (c[3:0] к примеру) и изменив repeat(c[3:0]) begin...end - вот тогда там появится счетчик. Такая конструкция тоже синтезируема. Почему квартус синтезирует триггер с входом в 1 я не понимаю, это точно неверный результат. Я не понял, к чему все возражения Postoroniy_V? Тем более они неверны - в результате и моделирования и синтеза получается деление частоты на 2. Если вас пугает наличие оператора ожидания @(posedge clk) внутри always блока, у которого вход тоже содержит такой же оператор, то уверяю вас - это вполне допустимая конструкция. Если вам не нравится оператор repeat(), ну выкиньте его и сделайте один раз copy и 9 раз paste на операторах под repeat; открою вам секрет -это одно и тоже. TSURKOV, мне кажется, что вы, как "больший" программист, неправильно воспринимаете verilog - это _не_ язык программирования, а язык описания поведения электронной схемы. В двух словах разницу не объяснить - читайте литературу и смотрите чужие дизайны, благо их в инете немеряно (www.opencores.org например). Блок initial любой синтезатор игнорирует. Введите в свою схему сигнал сброса (его там нет - это очень большая ошибка - где вы видели чипы без сброса на внешнем пине?) и устанавливайте им нужные вам значения reg. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 2 декабря, 2005 Опубликовано 2 декабря, 2005 · Жалоба ........ Если вы утверждаете, что синплифай синтезирует неверно, поскольку "(настолько не понимают, что даже не жалуются)", то вы ошибаетесь. repeat() входит в список поддерживаемых операторов. Вы можете ради интереса засинтезировать этот пример, только добавив входной сигнал (c[3:0] к примеру) и изменив repeat(c[3:0]) begin...end - вот тогда там появится счетчик. Такая конструкция тоже синтезируема. Почему квартус синтезирует триггер с входом в 1 я не понимаю, это точно неверный результат. Я не понял, к чему все возражения Postoroniy_V? Тем более они неверны - в результате и моделирования и синтеза получается деление частоты на 2. Если вас пугает наличие оператора ожидания @(posedge clk) внутри always блока, у которого вход тоже содержит такой же оператор, то уверяю вас - это вполне допустимая конструкция. Если вам не нравится оператор repeat(), ну выкиньте его и сделайте один раз copy и 9 раз paste на операторах под repeat; открою вам секрет -это одно и тоже. 1) я вам предлагаю прочитать с чего начался весь тред про копи и паст - это вы мне просто америку открыли, благодарю вас :) просил вас описать что будет в "железе" после такого always @ (posedge clk) begin repeat(10) @ (posedge clk) begin test = ~test; end end именно в квартусе! а не симплифай и т.д. потому что человек спрашивал про Q! вы не ответили, а жаль :-) repeat(10) @ (posedge clk) меня не пугает :-), думаю такое при моделировании актуально а не при синтезе(квартус пугается) :smile3046: 2) в результате моделирования always @ (posedge clk) begin repeat(10) @ (posedge clk) begin test = ~test; end end в activeHDL вы не увидите "чистого" деления на 2, посмотрите в аттачменте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
locas 0 2 декабря, 2005 Опубликовано 2 декабря, 2005 (изменено) · Жалоба ... TSURKOV, мне кажется, что вы, как "больший" программист, неправильно воспринимаете verilog - это _не_ язык программирования, а язык описания поведения электронной схемы. В двух словах разницу не объяснить - читайте литературу и смотрите чужие дизайны, благо их в инете немеряно (www.opencores.org например). Я в чем принципиальное отличие "языка программирования"(1) от "языка поведения"(2). По моему разумению так это одно и то же, т.к. можно сказать и что (1) описывает поведение программы, а (2) алгоритм вычисления, реализуемый цифровой схемой. Если мы рассматриваеи некий ЧЯ, имеющий множество входов/выходов, принимающих двоичные значения, то что там внутри него - программа или ЦС, по большому счету не распознать (если они внешне ведут еще себя неотличимо). Поэтому, если поведение некоторого ЧЯ на программном уровне описать на Си примерно так: bool test; test= false; for (;;) { test = !test; } то это не очень сильно отличается ( а по сути, одно то же) от того, что было написано ранее на Verilog. И в этом смысле "программист" прав, ожидая определенного поведения от "программы", реализация которой какой бы она ни была (программной или аппаратной) должна вести к одному результату. В данном случа - к генерации 1/0. Если говорить о вентильной схеме, реализующей данное поведение, то это мог бы быть элемент отрицания, выход которого соединен со входом. Но будет ли он так работать - это еще вопрос: формально должен, но реально, скорее всего, нет. Но если синтезировать этот алгоритм в виде схемы на элементе памяти, то - будет. Изменено 2 декабря, 2005 пользователем locas Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
id_gene 0 5 декабря, 2005 Опубликовано 5 декабря, 2005 · Жалоба Вы можете ради интереса засинтезировать этот пример, только добавив входной сигнал (c[3:0] к примеру) и изменив repeat(c[3:0]) begin...end - вот тогда там появится счетчик. Такая конструкция тоже синтезируема. Действительно интересно; я попробовал. В RTL-view виден счетчик (тоже самое видно и при константе), а при моделировании все равно получается чистое деление частоты на 2: триггер, выход инвертирован и подан на вход, а на синхронный сброс идет логика со счетчика. И этот сброс никогда не генерируется. Удачи Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 5 декабря, 2005 Опубликовано 5 декабря, 2005 · Жалоба Действительно интересно; я попробовал. В RTL-view виден счетчик (тоже самое видно и при константе), а при моделировании все равно получается чистое деление частоты на 2: триггер, выход инвертирован и подан на вход, а на синхронный сброс идет логика со счетчика. И этот сброс никогда не генерируется. Строго говоря, там нет деления на 2. В зависимости от того, четное или нечетное число раз повторяется repeat() при выходе из него test будет либо 0, либо 1 соответственно, а далее присвоение test=1 может изменить сигнал и тогда там будет 1 длительностью 2 такта (при четном). Такие нарушения меандра будут идти через (N-1) импульсов, где N-счетчик повторения repeat. Поэтому-то синплифай и ставит счетчик. Если N постоянен и нечетен, то должен синтезироваться один триггер -делитель частоты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 6 декабря, 2005 Опубликовано 6 декабря, 2005 · Жалоба Действительно интересно; я попробовал. В RTL-view виден счетчик (тоже самое видно и при константе), а при моделировании все равно получается чистое деление частоты на 2: триггер, выход инвертирован и подан на вход, а на синхронный сброс идет логика со счетчика. И этот сброс никогда не генерируется. Строго говоря, там нет деления на 2. В зависимости от того, четное или нечетное число раз повторяется repeat() при выходе из него test будет либо 0, либо 1 соответственно, а далее присвоение test=1 может изменить сигнал и тогда там будет 1 длительностью 2 такта (при четном). Такие нарушения меандра будут идти через (N-1) импульсов, где N-счетчик повторения repeat. Поэтому-то синплифай и ставит счетчик. Если N постоянен и нечетен, то должен синтезироваться один триггер -делитель частоты. кто бы мог подумать :a14: вы и по прежнему считаете меня не правым? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться