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

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

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


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

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

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

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


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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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


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

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

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


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

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

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

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

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


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

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

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

 

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

но в записи

always @(posedge clk or posedge rst)

if (rst) D<=1'b0;

else D<=in;

 

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

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


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

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

 

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

но в записи

always @(posedge clk or posedge rst)

if (rst) D<=1'b0;

else D<=in;

 

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

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

 

 

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

 

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

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


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

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

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

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

 

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

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


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

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

 

 

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

 

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

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


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

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

 

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

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

 

 

always @(posedge clk or rst == 0)

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

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


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

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

...

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

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

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

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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