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

Вопрос по VERILOG

Господа подскажите пожалуйста почему не работат эта конструкция. В Quartus в симуляторе на тест

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

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

reg test

 

always @ (posedge clk) begin

 

test = 0;

 

repeat(10) @ (posedge clk)

begin

test = ~test;

end

 

test = 1;

 

end

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

Заранее большое спасибо !!!!

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


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

тут был плохой ответ, извините. :(

я подумаю еще

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

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


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

Господа подскажите пожалуйста почему не работат эта конструкция. В 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"

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


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

Господа подскажите пожалуйста почему не работат эта конструкция. В Quartus в симуляторе на тест

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

 

Вы путаете блоки always и initial: always блок после окончания сразу начнется исполнятся заново, так что в 1 сигнал-то встанет, но на след. клоке снова сбросится в 0 и т.д.

Почему квартус выдает сразу 1, я не знаю, должно быть что-то похожее на деление частоты на 2. Если после выхода из repeat сигнал будет 0, то он сразу установится в 1 и в этом месте меандр исказится.

 

и потом -

repeat(10) @ (posedge clk)

begin

test = ~test;

end

как вы видите в железе?

 

Проблем с оператором repeat() я не вижу - это абсолютно синтезируемая конструкция, и делает она именно то, что и обещает.

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


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

Увжаемый Gate большое спасибо за ваш отзыв. Я раньше работал с альтерой в схемном режиме, но в душе больше программист поэтому решил заняться верилогом. В связи с этим пока много вопросов. По поводу Initial из ворниногов я понял что квартус его не поддерживает и выкидывает всю конструкцию. Может я не прав? или что-то надо установить? Квартус по описанию, что я приводил выше генерит тригер с еденицей на входе и clk на тактовом входе, отсюда ед на выходе. НО ПОЧЕМУ ????

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


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

Господа подскажите пожалуйста почему не работат эта конструкция. В 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 это бред!!

удачи!

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


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

В симуляторе (моделсим и нц-верилог) код моделируется нормально.

Не так, как вы хотели (не 10 раз и не встает в конце, а идет в цикл), но все-таки работает.

 

А в квартусе вы видимо уже моделируете результат синтеза (никогда не пользовался их симулятором). А синтезируется все как вы сказали - триггер с входом в 1. (зачем там триггер - мне вообще не понятно, почему не закоротить на 1?).

 

Почему такой результат - это ограничение синтеза квартуса.

Синплифай, например, просто делит частоту на два.

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

Интересно было бы, конечно, чтобы автоматически счетчики в таких случаях синтезировались. Но особой надежды что это когда-нибудь появится нет. Да вроде и так все обходятся.

 

Так что если вы синтезируемый результат хотите - обычно используют явный счетчик на сумматоре или сдвигах, и по нему выход разрешают/запрещают.

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


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

Почему такой результат - это ограничение синтеза квартуса.

Синплифай, например, просто делит частоту на два.

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

Интересно было бы, конечно, чтобы автоматически счетчики в таких случаях синтезировались. Но особой надежды что это когда-нибудь появится нет. Да вроде и так все обходятся.

 

Так что если вы синтезируемый результат хотите - обычно используют явный счетчик на сумматоре или сдвигах, и по нему выход разрешают/запрещают.

 

Если вы утверждаете, что синплифай синтезирует неверно, поскольку "(настолько не понимают, что даже не жалуются)", то вы ошибаетесь. 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.

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


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

........

 

Если вы утверждаете, что синплифай синтезирует неверно, поскольку "(настолько не понимают, что даже не жалуются)", то вы ошибаетесь. repeat() входит в список поддерживаемых операторов.

Вы можете ради интереса засинтезировать этот пример, только добавив входной сигнал (c[3:0] к примеру) и изменив repeat(c[3:0]) begin...end - вот тогда там появится счетчик. Такая конструкция тоже синтезируема.

 

Почему квартус синтезирует триггер с входом в 1 я не понимаю, это точно неверный результат.

 

Я не понял, к чему все возражения Postoroniy_V? Тем более они неверны - в результате и моделирования и синтеза получается деление частоты на 2. Если вас пугает наличие оператора ожидания @(posedge clk) внутри always блока, у которого вход тоже содержит такой же оператор, то уверяю вас - это вполне допустимая конструкция. Если вам не нравится оператор repeat(), ну выкиньте его и сделайте один раз copy и 9 раз paste на операторах под repeat; открою вам секрет -это одно и тоже.

 

1)

я вам предлагаю прочитать с чего начался весь тред :biggrin:

про копи и паст - это вы мне просто америку открыли, благодарю вас :)

просил вас описать что будет в "железе" после такого

 

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, посмотрите в аттачменте

post-951-1133538480_thumb.jpg

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


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

...

TSURKOV, мне кажется, что вы, как "больший" программист, неправильно воспринимаете verilog - это _не_ язык программирования, а язык описания поведения электронной схемы. В двух словах разницу не объяснить - читайте литературу и смотрите чужие дизайны, благо их в инете немеряно (www.opencores.org например).

Я в чем принципиальное отличие "языка программирования"(1) от "языка поведения"(2). По моему разумению так это одно и то же, т.к. можно сказать и что (1) описывает поведение программы, а (2) алгоритм вычисления, реализуемый цифровой схемой.

Если мы рассматриваеи некий ЧЯ, имеющий множество входов/выходов, принимающих двоичные значения, то что там внутри него - программа или ЦС, по большому счету не распознать (если они внешне ведут еще себя неотличимо).

Поэтому, если поведение некоторого ЧЯ на программном уровне описать на Си примерно так:

bool test;
test= false;
for (;;)
{
   test = !test;
}

то это не очень сильно отличается ( а по сути, одно то же) от того, что было написано ранее на Verilog.

И в этом смысле "программист" прав, ожидая определенного поведения от "программы", реализация которой какой бы она ни была (программной или аппаратной) должна вести к одному результату. В данном случа - к генерации 1/0.

 

Если говорить о вентильной схеме, реализующей данное поведение, то это мог бы быть элемент отрицания, выход которого соединен со входом. Но будет ли он так работать - это еще вопрос: формально должен, но реально, скорее всего, нет. Но если синтезировать этот алгоритм в виде схемы на элементе памяти, то - будет.

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

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


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

Вы можете ради интереса засинтезировать этот пример, только добавив входной сигнал (c[3:0] к примеру) и изменив repeat(c[3:0]) begin...end - вот тогда там появится счетчик. Такая конструкция тоже синтезируема.

 

Действительно интересно; я попробовал. В RTL-view виден счетчик (тоже самое видно и при константе), а при моделировании все равно получается чистое деление частоты на 2: триггер, выход инвертирован и подан на вход, а на синхронный сброс идет логика со счетчика. И этот сброс никогда не генерируется.

 

Удачи

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


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

Действительно интересно; я попробовал. В RTL-view виден счетчик (тоже самое видно и при константе), а при моделировании все равно получается чистое деление частоты на 2: триггер, выход инвертирован и подан на вход, а на синхронный сброс идет логика со счетчика. И этот сброс никогда не генерируется.

Строго говоря, там нет деления на 2. В зависимости от того, четное или нечетное число раз повторяется repeat() при выходе из него test будет либо 0, либо 1 соответственно, а далее присвоение test=1 может изменить сигнал и тогда там будет 1 длительностью 2 такта (при четном). Такие нарушения меандра будут идти через (N-1) импульсов, где N-счетчик повторения repeat. Поэтому-то синплифай и ставит счетчик. Если N постоянен и нечетен, то должен синтезироваться один триггер -делитель частоты.

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


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

Действительно интересно; я попробовал. В RTL-view виден счетчик (тоже самое видно и при константе), а при моделировании все равно получается чистое деление частоты на 2: триггер, выход инвертирован и подан на вход, а на синхронный сброс идет логика со счетчика. И этот сброс никогда не генерируется.

Строго говоря, там нет деления на 2. В зависимости от того, четное или нечетное число раз повторяется repeat() при выходе из него test будет либо 0, либо 1 соответственно, а далее присвоение test=1 может изменить сигнал и тогда там будет 1 длительностью 2 такта (при четном). Такие нарушения меандра будут идти через (N-1) импульсов, где N-счетчик повторения repeat. Поэтому-то синплифай и ставит счетчик. Если N постоянен и нечетен, то должен синтезироваться один триггер -делитель частоты.

кто бы мог подумать :a14:

вы и по прежнему считаете меня не правым?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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