Golikov 0 11 августа, 2014 Опубликовано 11 августа, 2014 · Жалоба а когда поймете че будет:)? отгадку потом не забудьте сообщить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 11 августа, 2014 Опубликовано 11 августа, 2014 · Жалоба Да знаю я ответ. Устроил соревнование electronix vs ixbt - где раньше правильный ответ дадут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба ну тогда вот такая правочка reg State = 0; always @(posedge clk) begin if((((d1&d2&d3) == 1'b1)&&(State == 0)) begin q<=~q; State <= 0; end else State <= 1'b1; которая учитывает единственное отличие while от forever while по стандарту должен иметь внутри хоть один клок, по этому клоку проверяется условия, и пока они верны все выполняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Нет. Выкладываю тестбенч, d1 d2 d3 все вместе нигде не перекрываются, но q должен меняться (при правильной работе модуля tst). module tb(); reg clk = 0; always #5 clk<=~clk; wire q; reg d1=0, d2=0, d3=0; initial begin #100 d1=1; #100 d2=1; #100 d1=0; d3=1; #100 d3=0; #100 d3=1; #100 d2=0; #100 d3=0; #100 d3=1; #100 d3=0; end tst t(q, d1, d2, d3, clk); always@(posedge clk) $strobe(" %1d%1d%1d %1d", d1, d2, d3, q); initial #1000 $finish; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Думаю, подходящая ветка. module tst( output reg q=0, input d1, d2, d3, clk ); always while(d1) while(d2) while(d3) @(posedge clk) q <= ~q; endmodule Просьба: 1) объяснить работу этого модуля с точки зрения стандарта Верилога, 2) привести в моделируемый вид, 3) перевести в синтезируемый (для ПЛИС) вид. Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q), условия установки/сброса следующие: d3t.reset = ~d3 && posedge clk d3t.set = d2t.q && d3 d2t.reset = ~d2 && ~d3.q d2t.set = d1.q && d2 d1t.reset = ~d1 && ~ d2.q d1t.set = d1 Сплошная асинхронщина, в некоторых ПЛИС нет RS триггеров, придётся на LE слепить:). Хотя, это можно как то и упростить, наверное, но думать лень, задача дурацкая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба играем на том что условие проверяется 1 раз в начале цикла? и потому если мы провалились в первые 2 вайла, то можно изменить одновременно d3 и d1, и мы все равно провалимся в 3 while? я честно никогда не пользовался while, для тестбенчей хватало forever, а для дела больше синтизируемые конструкции интересуют. Потому операюсь на verilog 2001 ref guide, там про while написано вот что while loop must take one clock cycle for each loop cycle (i.e: an @(posedge clk) or @(negedge clk) must be within loop) а также что это цикл который выполняет выражение или группу выражение пока верно его условие, которое проверяется в начале каждого цикла. Из этих 2 утверждений я делаю выводы что все-таки это не полная асинхронщина, и как минимум по ref guide 2001 выполнения этой конструкции будет привязано к клоку. И думаю единственное что тут есть, это игра на том что условие проверяется в начале каждого цикла.... но сдается мне что это очень сильно зависит от реализации интерпритатора языка. И уверен что будут среды которые пошлют такую конструкцию, будут среду которые будут выполнять ее каждый клок всю и только если все d в 1, а будут среды которые будут проваливаться в один вайл и утыкаться в другой, пока что-то не поменяется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 12 августа, 2014 Опубликовано 12 августа, 2014 (изменено) · Жалоба Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q),Да. условия установки/сброса следующие: d3t.reset = ~d3 && posedge clk d3t.set = d2t.q && d3 d2t.reset = ~d2 && ~d3.q d2t.set = d1.q && d2 d1t.reset = ~d1 && ~ d2.q d1t.set = d1 С условиями сброса не согласен. Сплошная асинхронщинаd1 d2 d3 могут быть регистровыми выходами другого модуля, и тогда дизайн в целом синхронный. Кстати, есть ли в Верилоге возможность объявить входы синхронными за счет _внешних_ регистров? задача дурацкая Вне "синтеза программ" - да. Изменено 12 августа, 2014 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Да. С условиями сброса не согласен. d1 d2 d3 могут быть регистровыми выходами другого модуля, и тогда дизайн в целом синхронный. Да, если d1,d2,d3 регистровые выходы, синхронные с clk, то весь дизайн переходит к синхронному, и условия установки/сброса можно упростить, однако в условиях задачи этого не было:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба а после того как задача сведется к синхронной она не выродиться в смену q по фронту клока, когда все сигналы в 1? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Условие while проверяется "изнутри" - не как условие входа в цикл, а как инверсное условие выхода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба прикольно... а это в стандарте описано или где-то в толкованиях? просто в том же ref guide 2001 это как-то явно не указано, хотя есть ремарка что оно "завязано" на клок внутри, и что условие проверяется в начале каждой итерации. Это как то немного меня смущает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Зафиксирован отказ от продолжения боя со стороны iXBT. Общий счет "electronix vs iXBT" - 2:0 в пользу electronix. Мой вариант ответов к задачке ( пункты 2),3) ): //-------------------------------------------- module tb(); reg clk = 0; always #5 clk<=~clk; wire q1, q2; reg d1=0, d2=0, d3=0; initial begin #100 d1=1; #100 d2=1; #100 d1=0; d3=1; #100 d3=0; #100 d3=1; #100 d2=0; #100 d3=0; #100 d3=1; #100 d3=0; end tst1 t1(q1, d1, d2, d3, clk); tst2 t2(q2, d1, d2, d3, clk); always@(posedge clk) $strobe(" %1d%1d%1d %1d%1d", d1, d2, d3, q1, q2); initial #1000 $finish; endmodule //-------------------------------------------- module tst1( output reg q=0, input d1, d2, d3, clk ); always #1 while(d1) #1 while(d2) #1 while(d3) @(posedge clk) q <= ~q; endmodule //-------------------------------------------- module tst2( output reg q=0, input d1, d2, d3, clk ); wire e1 = d1; wire e2 = (e2 | e1) & d2; wire e3 = (e3 | e2) & d3; always@(posedge clk) if(e3) q <= ~q; endmodule //-------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба на IXBT оказались дизайнеры лучше. Они видать работали и им некогда было глупостями маятся:)... вопрос о том где описано поведение while остается открытым... как-то уж очень чуднО выходит. как только d1 становится 1, мы проваливаемся в while и сидим там пока оно не станет 0, это ок. как только к d1 добавляется d2, мы проваливаемся во второй while и сидим там, даже если первый while перестал выполняться, то есть даже когда d1 стало обратно 0. И также с 3 while, и как только мы провалились в него q начинает молотить... и теперь даже если убрать d1 и d2 ничего не остановится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться