xvr 12 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Поработаю немного переводчиком: 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мя клоковыми входами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Я думаю, этот и есть одно из отличий нормального разработчика от кодера. :) Вот именно! :) А на чем писать... сами знаете :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Поработаю немного переводчиком: Вы уже третий, кто попытался - и Вы получаете приз! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Эх, день тяжелый был, написал в спешке, глюки с интернетом были, я думал, что не отправил сообщение, дошел до дома - подумал:) насчет интерпретации верилогом записи always @(posedge clk or rst) - Вы конечно правы, но я считаю, что rst смотрится все же по уровню, косвенное подтверждение - при подаче в modelsim rst = 1, происходит сброс без всякого перепада Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aprox 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба - второе - что из описания always @(posedge clk or posedge rst) не понятно что пойдет на клок, и что на сброс, но это логично, т.к. они изначально равнозначные Вы, помнится, на альтеровских матрицах работаете? Там одной из фич архитектуры является специальные GLOBAL трассы клоков, которые обеспечивают повышенную скорость синхронных конструкций. Внимание, вопрос- в вашей записи на Verilog, кто из сигналов clk или rst будет разведен синтезатором по глобальной трассе? И будет ли вообще использован примитив GLOBAL? Пока что, в приведенной записи я не вижу ни малейшего намека на это... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба насчет интерпретации верилогом записи 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 объяснять нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба На всякий случай, может быть, я чего-то не понял :cranky: , но ведь есть же IEEE1364.1-2002 "IEEE Standard for Verilog Register Transfer Level Synthesis". Да и в Quartus есть шаблоны, в которых тоже все расписано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Вы, помнится, на альтеровских матрицах работаете? Там одной из фич архитектуры является специальные GLOBAL трассы клоков, которые обеспечивают повышенную скорость синхронных конструкций. Внимание, вопрос- в вашей записи на Verilog, кто из сигналов clk или rst будет разведен синтезатором по глобальной трассе?А что, AHDL позволяет запузырить сигнал сброса по глобальной клоковой трассе? И будет ли вообще использован примитив GLOBAL?Хм. Вы уж слишком плохого мнения о синтезаторах с Verilog'а. Пока что, в приведенной записи я не вижу ни малейшего намека на это...Приведенная запись является куском описания, выдранного неизвестно откуда. Без тела always она вообще не откомпилируется, что уж говорить о том кто у нее где. Смотрите тело, будет все понятно. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба На Verilog есть стандарт, где черным по белому написанно как именно трактуется запись always @(rst) - Видимо я двусмысленно выразился, извиняюсь :rolleyes: , Я хотел сказать что Вы абсолютно правильно расписали дешифрацию компилятором выражения always @(posedge clk or rst), но в записи always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; асинхронный rst будет работать по уровню а не по фронту Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Видимо я двусмысленно выразился, извиняюсь :rolleyes: , Я хотел сказать что Вы абсолютно правильно расписали дешифрацию компилятором выражения always @(posedge clk or rst), но в записи always @(posedge clk or posedge rst) if (rst) D<=1'b0; else D<=in; асинхронный rst будет работать по уровню а не по фронту Он в жизни будет работать по уровню, и в записи будет работать по уровню. По фронту будет только запускаться выполнение блока. P.S. Как, на Ваш взгляд, следовало бы более логично описать поведение триггера в ПЛИС? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Кажется, по моей вине мысли участников двинулись не в том направлении. На всякий случай сообщаю - в строке always задается список чувствительности компилятора, а не самого триггера. Т.е. - по какому событию компилятор должен синтезировать схему, чтобы получить требуемый результат. Запись always @(rst) означает чувствительность к любому изменению сигнала rst, но никак не к его уровню. В Verilog вообще нет смысла рассматривать сигналы, если они находятся в неизменном состоянии. Это я так "пошутил" насчет always @(posedge clk or rst). upd. вот, кстати, собачки @ забыл, а в них - вся соль! исправляюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Он в жизни будет работать по уровню, и в записи будет работать по уровню. По фронту будет только запускаться выполнение блока. 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Тогда при чем здесь уровень, если блок по фронту будет запускаться? вы что-то все смешали в кучу.. Может, как раз Вы все смешиваете в кучу? Отделяйте понятие триггера от понятия блока, описывающего триггер. always @(posedge clk or rst == 0) То есть, этот блок должен запускаться в каждый момент времени, когда rst равняется нулю? Вы себе скорость моделирования в симуляторах, которые работали бы по такому стандарту, представляете? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 31 мая, 2010 Опубликовано 31 мая, 2010 · Жалоба Ну почему? управление уровнем, пусть и асинхронщина, но используется ... ЗЫ:только что натолкнулся на пример в стандарте верилога 2001 Вы будете смеяться, но это - ошибка в стандарте! В IEEE 1800-2009 в разделе 23.10 написано: always @(posedge clk or posedge reset) begin casez ({read,write,reset}) // implementation of fifo endcase end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться