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

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

А что, AHDL позволяет запузырить сигнал сброса по глобальной клоковой трассе? :wacko:
В последних FPGA от Altera трассы GLOBAL могут использоваться для чего угодно. В том числе и для глобального сброса. Отсюда вопрос- как реализуются верилоговские "абстракции" из блоков always @(..,,,...) в конкретной архитектуре FPGA?

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


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

Цитата(Putnik @ Jun 1 2010, 00:47) *

always @(posedge clk or rst == 0)

 

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

давайте вернемся из программирования в цифровую схемотехнику, вопрос только в том, как это будет транслироваться в схему

 

always @(posedge clk or posedge rst)

if (rst) D<=1'b0;

else D<=in;

 

- описание D-триггера, с клоком, работающим по фронту и сбросом по уровню,

в качестве примера в моделсиме rst сразу == 1, сначала X, потом == 1 и сначала X, потом == 1,

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

 

Хотите оспорить, приводите, пожалуйста, свои примеры, или выдержки из стандарта в тему, а то холивар получается с вашей стороны

 

 

to ViKo - действительно забавная опечатка в стандарте :biggrin:

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


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

always @(posedge clk or posedge rst)

if (rst) D<=1'b0;

else D<=in;

 

- описание D-триггера, с клоком, работающим по фронту и сбросом по уровню,

в качестве примера в моделсиме rst сразу == 1, сначала X, потом == 1 и сначала X, потом == 1,

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

 

rst сразу == 1 - это сначала Х, а потом во время 0 становится 1 (вот и фронт).

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


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

давайте вернемся из программирования в цифровую схемотехнику, вопрос только в том, как это будет транслироваться в схему

В программирование никто и не уходил.

Кроме синтеза, существует еще и моделирование. Это у Вас вопрос только про трансляцию в схему, а разработчикам стандарта необходимо думать и над тем и над другим.

 

Хотите оспорить, приводите, пожалуйста, свои примеры, или выдержки из стандарта в тему, а то холивар получается с вашей стороны

 

 

Вот такой код:

module test_sv;
  
  logic rst1 = 1;
  logic data1;
  logic data2;
  
  logic clk;
  
  
  logic rst2;
  
  initial
  begin
    rst2 = 1;
    #5;
    rst2 = 0;
    
  end
  
always_ff @(posedge clk, posedge rst1)
  if(rst1)
    data1 <= '0;
  else
    data1 <= ~data1;
    
always_ff @(posedge clk, posedge rst2)
  if(rst2)
    data2 <= '0;
  else
    data2 <= ~data2;
    
initial 
   begin
     clk = 0;
     forever
       #300 clk  = ~clk;   
   end 
    
  
endmodule

 

data1 до прихода положительного фронта clk в состоянии x, data2 сбрасывается в ноль раньше. Все потому, что у rst2 начальное значение x, что следует из IEEE 1364-2001, 3.2.2 Variable declarations:

The initialization value for reg, time, and integer data types shall be the unknown value, x.

а в нулевой момент времени значение rst2 становится равно 1. А переход из x в 1 - это posedge, согласно

тому же стандрату, 9.7.2 Event control:

A posedge shall be detected on the transition from 0 to x, z, or 1, and from x or z to 1

 

rst сразу == 1 - это сначала Х, а потом во время 0 становится 1 (вот и фронт).

 

Извиняюсь, пока набирал пост, не увидел, что Вы меня опередили. :)

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


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

В последних FPGA от Altera трассы GLOBAL могут использоваться для чего угодно. В том числе и для глобального сброса.
Ок

Отсюда вопрос- как реализуются верилоговские "абстракции" из блоков always @(..,,,...) в конкретной архитектуре FPGA?
Максимально эффективным способом. Т.е. для клоков будет использованны специальные клоковые ресурсы (GLOBAL у ALter'ы, клоковое дерево у Xilinx)

Если синтезатор не сможет по физическим причинам использовать эти ресурсы (у Xilinx например в том случае, если на clk тригеру завели выход с логики), он использует локальные трассы (не специальные) и выдаст кучу warning'ов

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


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

to des333

 

аплодирую стоя, очень убедительно,

Вы правы :a14:

Ну, я думаю, аплодировать тут нечему.  :)

А насчет того, что прав - надеюсь. Если нет, гуру поправят.

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


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

Максимально эффективным способом. Т.е. для клоков будет использованны специальные клоковые ресурсы (GLOBAL у ALter'ы, клоковое дерево у Xilinx)

Если синтезатор не сможет по физическим причинам использовать эти ресурсы (у Xilinx например в том случае, если на clk тригеру завели выход с логики), он использует локальные трассы (не специальные) и выдаст кучу warning'ов

Мне непонятно другое. Вот, тут пишут always_ff @(posedge clk, posedge rst) Речь явно идет о триггерах. Триггер имеет только один клоковый вход. А в заголовке always_ff @() их может быть сколько угодно. Какой именно из списка. clk или rst. считать правильным клоком триггеру? Кого разводить по трассе GLOBAL, чтобы получить в приложении синхронную машину?

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


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

Мне непонятно другое. Вот, тут пишут always_ff @(posedge clk, posedge rst) Речь явно идет о триггерах. Триггер имеет только один клоковый вход. А в заголовке always_ff @() их может быть сколько угодно. Какой именно из списка. clk или rst. считать правильным клоком триггеру? Кого разводить по трассе GLOBAL, чтобы получить в приложении синхронную машину?

Зависит от дальнейшего описания в теле always, если clk - клок, то упоминаться он больше не будет

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


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

Мне непонятно другое. Вот, тут пишут always_ff @(posedge clk, posedge rst) Речь явно идет о триггерах. Триггер имеет только один клоковый вход. А в заголовке always_ff @() их может быть сколько угодно. Какой именно из списка. clk или rst. считать правильным клоком триггеру? Кого разводить по трассе GLOBAL, чтобы получить в приложении синхронную машину?
Изучайте VHDL. Там однозначно видно, что именно будет клоком для триггера.

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


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

Зависит от дальнейшего описания в теле always, если clk - клок, то упоминаться он больше не будет
А если и rst тоже не упоминается в блоке? Я понимаю, -это ошибка или описка. Но интересно узнать, пропустит ли такую ошибку проверка синтаксиса?

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


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

А если и rst тоже не упоминается в блоке? Я понимаю, -это ошибка или описка. Но интересно узнать, пропустит ли такую ошибку проверка синтаксиса?

Проверка синтаксиса пропустит, симулятор посчитает что несколько клоков и будет по ним работать, синтезатор скажет ошибку - нестандартный триггер

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


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

Проверка синтаксиса пропустит, симулятор посчитает что несколько клоков и будет по ним работать, синтезатор скажет ошибку - нестандартный триггер
Синтезатор укажет на ошибку и остановит синтез, или ограничится только предупреждением выдав неработающую разводку?

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


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

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

Первое

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


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

А если и rst тоже не упоминается в блоке? Я понимаю, это ошибка или описка. Но интересно узнать, пропустит ли такую ошибку проверка синтаксиса?

Еще раз советую дискутирующим ознакомиться со стандартом IEEE1364.1-2002 (сейчас переделан в IEC/IEEE 62142-2005). В частности, как "shall" описывать те или иные конструкции. Кстати, там и про память написано.

 

Вот выдержка из начала описания про триггеры с асинхронными управляющими входами:

5.2.2.1 Edge-sensitive storage device modeling with asynchronous set-reset

An edge-sensitive storage device with an asynchronous set and/or asynchronous reset is modeled using an

always statement whose event list contains edge events representing the clock and asynchronous control

variables. Level-sensitive events shall not be allowed in the event list of an edge-sensitive storage device

model.

Furthermore, the always statement shall contain an if statement to model the first asynchronous control and

optional nested else if statements to model additional asynchronous controls. A final else statement, which

specifies the synchronous logic portion of the always block, shall be controlled by the edge control variable

not listed in the if and else if statements.

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


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

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

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

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

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

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

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

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

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

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