xvr 12 May 31, 2010 Posted May 31, 2010 · Report post Поработаю немного переводчиком: always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; Блок кода выполняется при положительном фронте clk или положительном фронте rst. Расмотрим фронты отдельно: 1) Положительный фронт clk: Если сигнал сброса rst стоит в 1 - то тригер (выход D) обнуляется, иначе на D копируется in 2) Положительный фронт rst: Т.к. rst внутри блока 1, то тригер обнуляется Отрицательный фронт rst состояния тригера НЕ МЕНЯЕТ, т.к. он и так уже обнулен, а входного клока нет, т.е. на выходе так 0 и останется и логичней была бы недопустимая конструкция always @(posedge clk or rst) if (rst) D<=1'b0; else D<=in; Дешифрую эту конструкцию: Блок кода выполняется при положительном фронте clk или ЛЮБОМ ИЗМЕНЕНИИ rst. Что в частности означает, что при переходе rst из 1->0 тригер должен будет защелкнуть в D значение in. Т.е. мы получили тригер с 2мя клоковыми входами Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 May 31, 2010 Posted May 31, 2010 · Report post Я думаю, этот и есть одно из отличий нормального разработчика от кодера. :) Вот именно! :) А на чем писать... сами знаете :) Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 31, 2010 Posted May 31, 2010 · Report post XVR :a14: признаю свою неправоту, действительно, так и есть как вы сказали, причем второй клок вообще интересный получился до возражения Viko, я как-то давно встречал несколько раз, и в форуме, и в какой-то статье, что запись always @(posedge clk or posedge rst) не красива с точки зрения ее логичности, и тут 2 варианта - первое - либо имелось ввиду что rst работает по уровню, и не может работать по фронту, и тогда должно быть always @(posedge clk or rst == 1), так как описание always @(posedge clk or rst) действительно подразумевает несколько другое толкование. но вспомнил схему синхронного триггера с асинхронным сбросом на элементах И(на рисунке), из которой видно что CLK и RESET в общем равнозначны - оба просто одинаковые входы И, т.е. RESET может работать по фронту, - второе - что из описания always @(posedge clk or posedge rst) не понятно что пойдет на клок, и что на сброс, но это логично, т.к. они изначально равнозначные входы И R_S.bmp Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 31, 2010 Posted May 31, 2010 · Report post Поработаю немного переводчиком: Вы уже третий, кто попытался - и Вы получаете приз! :) Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 31, 2010 Posted May 31, 2010 · Report post Эх, день тяжелый был, написал в спешке, глюки с интернетом были, я думал, что не отправил сообщение, дошел до дома - подумал:) насчет интерпретации верилогом записи always @(posedge clk or rst) - Вы конечно правы, но я считаю, что rst смотрится все же по уровню, косвенное подтверждение - при подаче в modelsim rst = 1, происходит сброс без всякого перепада Quote Share this post Link to post Share on other sites More sharing options...
aprox 0 May 31, 2010 Posted May 31, 2010 · Report post - второе - что из описания always @(posedge clk or posedge rst) не понятно что пойдет на клок, и что на сброс, но это логично, т.к. они изначально равнозначные Вы, помнится, на альтеровских матрицах работаете? Там одной из фич архитектуры является специальные GLOBAL трассы клоков, которые обеспечивают повышенную скорость синхронных конструкций. Внимание, вопрос- в вашей записи на Verilog, кто из сигналов clk или rst будет разведен синтезатором по глобальной трассе? И будет ли вообще использован примитив GLOBAL? Пока что, в приведенной записи я не вижу ни малейшего намека на это... Quote Share this post Link to post Share on other sites More sharing options...
xvr 12 May 31, 2010 Posted May 31, 2010 · Report post насчет интерпретации верилогом записи always @(posedge clk or rst) - Вы конечно правы, но я считаю, что rst смотрится все же по уровню,На Verilog есть стандарт, где черным по белому написанно как именно трактуется запись always @(rst) - 9.7.2 Event control The execution of a procedural statement can be synchronized with a value change on a net or variable or the occurrence of a declared event. The value changes on nets and variable can be used as events to trigger the execution of a statement. This is known as detecting an implicit event. The event can also be based on the direction of the change—that is, towards the value 1 (posedge) or towards the value 0 (negedge). The behavior of posedge and negedge events is shown in Table 43 and can be described as follows: — Anegedge shall be detected on the transition from 1 to x, z, or 0, and from x or z to 0 — Aposedge shall be detected on the transition from 0 to x, z, or 1, and from x or z to 1 Example: The following example shows illustrations of edge-controlled statements. @r rega = regb; // [b]controlled by any value change in the reg r[/b] @(posedge clock) rega = regb; // controlled by posedge on clock forever @(negedge clock) rega = regb; // controlled by negative edge Так что как говорил Киса Воробьянинов 'Торг здесь неуместен!' косвенное подтверждение - при подаче в modelsim rst = 1, происходит сброс без всякого перепадаРазницу между присваиванием в TCL и event control спецификацией в Verilog объяснять нужно? Quote Share this post Link to post Share on other sites More sharing options...
SergeyF 0 May 31, 2010 Posted May 31, 2010 · Report post На всякий случай, может быть, я чего-то не понял :cranky: , но ведь есть же IEEE1364.1-2002 "IEEE Standard for Verilog Register Transfer Level Synthesis". Да и в Quartus есть шаблоны, в которых тоже все расписано. Quote Share this post Link to post Share on other sites More sharing options...
xvr 12 May 31, 2010 Posted May 31, 2010 · Report post Вы, помнится, на альтеровских матрицах работаете? Там одной из фич архитектуры является специальные GLOBAL трассы клоков, которые обеспечивают повышенную скорость синхронных конструкций. Внимание, вопрос- в вашей записи на Verilog, кто из сигналов clk или rst будет разведен синтезатором по глобальной трассе?А что, AHDL позволяет запузырить сигнал сброса по глобальной клоковой трассе? И будет ли вообще использован примитив GLOBAL?Хм. Вы уж слишком плохого мнения о синтезаторах с Verilog'а. Пока что, в приведенной записи я не вижу ни малейшего намека на это...Приведенная запись является куском описания, выдранного неизвестно откуда. Без тела always она вообще не откомпилируется, что уж говорить о том кто у нее где. Смотрите тело, будет все понятно. :rolleyes: Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 31, 2010 Posted May 31, 2010 · Report post На Verilog есть стандарт, где черным по белому написанно как именно трактуется запись always @(rst) - Видимо я двусмысленно выразился, извиняюсь :rolleyes: , Я хотел сказать что Вы абсолютно правильно расписали дешифрацию компилятором выражения always @(posedge clk or rst), но в записи always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; асинхронный rst будет работать по уровню а не по фронту Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 31, 2010 Posted May 31, 2010 · Report post Видимо я двусмысленно выразился, извиняюсь :rolleyes: , Я хотел сказать что Вы абсолютно правильно расписали дешифрацию компилятором выражения always @(posedge clk or rst), но в записи always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; асинхронный rst будет работать по уровню а не по фронту Он в жизни будет работать по уровню, и в записи будет работать по уровню. По фронту будет только запускаться выполнение блока. P.S. Как, на Ваш взгляд, следовало бы более логично описать поведение триггера в ПЛИС? Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 May 31, 2010 Posted May 31, 2010 · Report post Кажется, по моей вине мысли участников двинулись не в том направлении. На всякий случай сообщаю - в строке always задается список чувствительности компилятора, а не самого триггера. Т.е. - по какому событию компилятор должен синтезировать схему, чтобы получить требуемый результат. Запись always @(rst) означает чувствительность к любому изменению сигнала rst, но никак не к его уровню. В Verilog вообще нет смысла рассматривать сигналы, если они находятся в неизменном состоянии. Это я так "пошутил" насчет always @(posedge clk or rst). upd. вот, кстати, собачки @ забыл, а в них - вся соль! исправляюсь. Quote Share this post Link to post Share on other sites More sharing options...
Putnik 0 May 31, 2010 Posted May 31, 2010 · Report post Он в жизни будет работать по уровню, и в записи будет работать по уровню. По фронту будет только запускаться выполнение блока. P.S. Как, на Ваш взгляд, следовало бы более логично описать поведение триггера в ПЛИС? Тогда при чем здесь уровень, если блок по фронту будет запускаться? вы что-то все смешали в кучу.. Вспомогательные определения: статическое управление(уровнем) - подача на вход логической единицы (прямой вход) или логического нуля (инверсный вход). динамическое управление(по фронту)- воспринимаются информационные сигналы при изменении (перепаде) сигнала на входе от 0 к 1 (прямой динамический вход) или от 1 к 0 (инверсный динамический вход). при подаче в моделсиме сразу активного уровня сброса, без перепадов, и без клока, сброс происходит, так по уровню или фронту все же posedge rst работает? я думаю логичней запись типа always @(posedge clk or rst == 0) Кажется, по моей вине мысли участников двинулись не в том направлении. На всякий случай сообщаю - в строке always задается список чувствительности компилятора, а не самого триггера. Т.е. - по какому событию компилятор должен синтезировать схему, чтобы получить требуемый результат. Запись always (rst) означает чувствительность к любому изменению сигнала rst, но никак не к его уровню. В Verilog вообще нет смысла рассматривать сигналы, если они находятся в неизменном состоянии. Это я так "пошутил" насчет always (posedge clk or rst). Ну почему? управление уровнем, пусть и асинхронщина, но используется ЗЫ:только что натолкнулся на пример в стандарте верилога 2001 Examples: module generic_fifo #(parameter MSB=3, LSB=0, DEPTH=4) // These parameters can be overridden ( input [MSB:LSB] in, input clk, read, write, reset, output [MSB:LSB] out, output full, empty ); localparam FIFO_MSB = DEPTH*MSB; // These parameters are local, and localparam FIFO_LSB = LSB; // cannot be overridden. They can be // affected by altering the public // parameters above, and the module // will work correctly. reg [FIFO_MSB:FIFO_LSB] fifo; reg [LOG2(DEPTH):0] depth; always @(posedge clk or reset) begin casex ({read,write,reset}) // implementation of fifo endcase end endmodule Quote Share this post Link to post Share on other sites More sharing options...
Des333 0 May 31, 2010 Posted May 31, 2010 · Report post Тогда при чем здесь уровень, если блок по фронту будет запускаться? вы что-то все смешали в кучу.. Может, как раз Вы все смешиваете в кучу? Отделяйте понятие триггера от понятия блока, описывающего триггер. always @(posedge clk or rst == 0) То есть, этот блок должен запускаться в каждый момент времени, когда rst равняется нулю? Вы себе скорость моделирования в симуляторах, которые работали бы по такому стандарту, представляете? :) Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 May 31, 2010 Posted May 31, 2010 · Report post Ну почему? управление уровнем, пусть и асинхронщина, но используется ... ЗЫ:только что натолкнулся на пример в стандарте верилога 2001 Вы будете смеяться, но это - ошибка в стандарте! В IEEE 1800-2009 в разделе 23.10 написано: always @(posedge clk or posedge reset) begin casez ({read,write,reset}) // implementation of fifo endcase end Quote Share this post Link to post Share on other sites More sharing options...