Jump to content
    

Verilog, управляющие сигналы триггера

Поработаю немного переводчиком:

 

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мя клоковыми входами

Share this post


Link to post
Share on other sites

Я думаю, этот и есть одно из отличий нормального разработчика от кодера. :)

Вот именно! :) А на чем писать... сами знаете :)

Share this post


Link to post
Share on other sites

XVR :a14:

признаю свою неправоту, действительно, так и есть как вы сказали, причем второй клок вообще интересный получился :biggrin:

 

до возражения 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

Share this post


Link to post
Share on other sites

Поработаю немного переводчиком:

Вы уже третий, кто попытался - и Вы получаете приз!  :)

Share this post


Link to post
Share on other sites

Эх, день тяжелый был, написал в спешке, глюки с интернетом были, я думал, что не отправил сообщение,

дошел до дома - подумал:)

насчет интерпретации верилогом записи always @(posedge clk or rst) - Вы конечно правы, но я считаю, что rst смотрится все же по уровню,

косвенное подтверждение - при подаче в modelsim rst = 1, происходит сброс без всякого перепада

Share this post


Link to post
Share on other sites

- второе - что из описания always @(posedge clk or posedge rst) не понятно что пойдет на клок, и что на сброс, но это логично, т.к. они изначально равнозначные

Вы, помнится, на альтеровских матрицах работаете? Там одной из фич архитектуры является специальные GLOBAL трассы клоков, которые обеспечивают повышенную скорость синхронных конструкций. Внимание, вопрос- в вашей записи на Verilog, кто из сигналов clk или rst будет разведен синтезатором по глобальной трассе? И будет ли вообще использован примитив GLOBAL? Пока что, в приведенной записи я не вижу ни малейшего намека на это...

Share this post


Link to post
Share on other sites

насчет интерпретации верилогом записи 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 объяснять нужно?

Share this post


Link to post
Share on other sites

На всякий случай, может быть, я чего-то не понял :cranky: , но ведь есть же IEEE1364.1-2002 "IEEE Standard for Verilog Register Transfer Level Synthesis". Да и в Quartus есть шаблоны, в которых тоже все расписано.

Share this post


Link to post
Share on other sites

Вы, помнится, на альтеровских матрицах работаете? Там одной из фич архитектуры является специальные GLOBAL трассы клоков, которые обеспечивают повышенную скорость синхронных конструкций. Внимание, вопрос- в вашей записи на Verilog, кто из сигналов clk или rst будет разведен синтезатором по глобальной трассе?
А что, AHDL позволяет запузырить сигнал сброса по глобальной клоковой трассе? :wacko:

И будет ли вообще использован примитив GLOBAL?
Хм. Вы уж слишком плохого мнения о синтезаторах с Verilog'а.

Пока что, в приведенной записи я не вижу ни малейшего намека на это...
Приведенная запись является куском описания, выдранного неизвестно откуда. Без тела always она вообще не откомпилируется, что уж говорить о том кто у нее где. Смотрите тело, будет все понятно. :rolleyes:

Share this post


Link to post
Share on other sites

На Verilog есть стандарт, где черным по белому написанно как именно трактуется запись always @(rst) -

Видимо я двусмысленно выразился, извиняюсь :rolleyes: ,

 

Я хотел сказать что Вы абсолютно правильно расписали дешифрацию компилятором выражения always @(posedge clk or rst),

но в записи

always @(posedge clk or posedge rst)

if (rst) D<=1'b0;

else D<=in;

 

асинхронный rst будет работать по уровню а не по фронту

Share this post


Link to post
Share on other sites

Видимо я двусмысленно выразился, извиняюсь :rolleyes: ,

 

Я хотел сказать что Вы абсолютно правильно расписали дешифрацию компилятором выражения always @(posedge clk or rst),

но в записи

always @(posedge clk or posedge rst)

if (rst) D<=1'b0;

else D<=in;

 

асинхронный rst будет работать по уровню а не по фронту

Он в жизни будет работать по уровню, и в записи будет работать по уровню.

 

 

По фронту будет только запускаться выполнение блока.

 

P.S. Как, на Ваш взгляд, следовало бы более логично описать поведение триггера в ПЛИС?

Share this post


Link to post
Share on other sites

Кажется, по моей вине мысли участников двинулись не в том направлении.

На всякий случай сообщаю - в строке always задается список чувствительности компилятора, а не самого триггера. Т.е. - по какому событию компилятор должен синтезировать схему, чтобы получить требуемый результат. Запись always @(rst) означает чувствительность к любому изменению сигнала rst, но никак не к его уровню. В Verilog вообще нет смысла рассматривать сигналы, если они находятся в неизменном состоянии.

Это я так "пошутил" насчет always @(posedge clk or rst).

 

upd. вот, кстати, собачки @ забыл, а в них - вся соль! исправляюсь.

Share this post


Link to post
Share on other sites

Он в жизни будет работать по уровню, и в записи будет работать по уровню.

 

 

По фронту будет только запускаться выполнение блока.

 

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

Share this post


Link to post
Share on other sites

Тогда при чем здесь уровень, если блок по фронту будет запускаться? вы что-то все смешали в кучу..

 

Может, как раз Вы все смешиваете в кучу?

Отделяйте понятие триггера от понятия блока, описывающего триггер.

 

 

always @(posedge clk or rst == 0)

То есть, этот блок должен запускаться в каждый момент времени, когда rst равняется нулю? Вы себе скорость моделирования в симуляторах, которые работали бы по такому стандарту, представляете? :)

Share this post


Link to post
Share on other sites

Ну почему? управление уровнем, пусть и асинхронщина, но используется

...

ЗЫ:только что натолкнулся на пример в стандарте верилога 2001

Вы будете смеяться, но это - ошибка в стандарте!

В IEEE 1800-2009 в разделе 23.10 написано:

always @(posedge clk or posedge reset) begin 
  casez ({read,write,reset})
    // implementation of fifo
  endcase 
end

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...