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

минимальная рабочая синтезабельная конструкция

Здравствуйте!

Хочу уточнить некоторые моменты, тонкости которых пока не очень осознал.

Стоит, к примеру, задача: дат тактовый сигнал clc и выхдной out. Нужно на выходе выпускать сигнал с частотой в 2 раза ниже (модельный пример, в реальной жизни может быть сложнее, сирену организовать какую или еще что).

Вопрос:

Мне хватит написать так

 

input clc;

output out;

reg out;

reg h=0;

 

always @(clc)

begin

if(clc==1)h=h^1;

out=h;

end

 

или нужно вот так

 

input clc;

output out;

reg out;

reg h=0;

reg b;

 

always @(clc)

if(b!=clc) //физическое отслеживание смены тактового сигнала

begin

b=clc;

if(clc==1)h=h^1;

out=h;

end

 

или еще как-то иначе нужно?

т.е. понятно, что @(clc) - несинтесируемая конструкция, необходимая лишь для моделирования. Но как на практике нужно (грамотно, по возможности) задавать события для выполнения блока always.

 

Заранее благодарен за помощь и заранее извиняюсь за туманность изложения:)

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


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

Все много проще.

 

module div2(
   input clk, 
   input reset, 
   output reg out
);
always @(posedge clk, posedge reset) begin
   if(reset)
      out <= 0;
   else
      out <= ~out;
end
endmodule

 

 

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


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

Все много проще.

 

module div2(
   input clk, 
   input reset, 
   output reg out
);
always @(posedge clk, posedge reset) begin
   if(reset)
      out <= 0;
   else
      out <= ~out;
end
endmodule

Да, красиво:) Но все же не все мне очевидно.

1) А кто такой reset и как от соотносится с clc?

2) Как будет во всем этом участвовать clc после синтеза?

2) И последнее, будет ли работать правильно какой-то из моих примеров?

 

Спасибо, masics, за соучастие:)

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


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

Да, красиво:) Но все же не все мне очевидно.

1) А кто такой reset и как от соотносится с clc?

это асинхронный сброс для обнуления out в самом начале. (reg out=0 - это только для симуляций)

2) Как будет во всем этом участвовать clc после синтеза?

clc - это тактовый сигнал. В этом случае TFF будет работать по переднему фронту (при изменении с 0 на 1).

3) И последнее, будет ли работать правильно какой-то из моих примеров?

наверное, будет но только на симуляциях.

 

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


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

Если уж делать минимальную конструкцию, то и сброс не нужен.

module div (input clk, output reg out);
  always @(posedge clk)  out = !out;
endmodule

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


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

Если уж делать минимальную конструкцию, то и сброс не нужен.

module div (input clk, output reg out);
  always @(posedge clk)  out = !out;
endmodule

Симуляция работать не будет. И "=" не следует использовать в описании флип-флопов.

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


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

Симуляция работать не будет.

В Quartus работает. В других программах, думаю, тоже будет. По-умолчанию неопределенное состояние воспринимается, как 0.

И "=" не следует использовать в описании флип-флопов.

Я мог бы спросить "почему это?" Но лучше направлю почитать вот эту дискуссию. Можете начать с самого начала.

http://electronix.ru/forum/index.php?showt...st&p=732818

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


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

Симуляция работать не будет. И "=" не следует использовать в описании флип-флопов.

может поспорим? %) Как раз для такого и нужен initial или vsim ....+initreg+0....

 

а насчет присвоений в данном конкретном примере это монописуально.

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


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

может поспорим? %) Как раз для такого и нужен initial или vsim ....+initreg+0....

А я о чем говорю? Или async reset или initial. Я выбрал reset чтобы можно было просинтезировать.

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


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

А я о чем говорю? Или async reset или initial. Я выбрал reset чтобы можно было просинтезировать.

И родить лишнюю трассу на пустом месте, нафиг нафиг.

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


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

В Quartus работает. В других программах, думаю, тоже будет. По-умолчанию неопределенное состояние воспринимается, как 0.

Неопределенное состояние = Х. Можно специальными ключами установить другое значение. Я никогда такого не делал - это не правильно.

Я мог бы спросить "почему это?" Но лучше направлю почитать вот эту дискуссию. Можете начать с самого начала.

http://electronix.ru/forum/index.php?showt...st&p=732818

После того, как я потерял 2 дня при использовании чужого кода с таким присвоением, предпочту дуть на воду. И попробуйте пропустить такой код через synopsys design compiler.

 

И родить лишнюю трассу на пустом месте, нафиг нафиг.

А потом, когда кнопка reset будет работать "странно" будете искать почему не обнулился флип-флоп в state machine и весь дизайн работает наперекосяк.

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


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

А потом, когда кнопка reset будет работать "странно" будете искать почему не обнулился флип-флоп в state machine и весь дизайн работает наперекосяк.

Где вы, в этом примере, видите стейт машину? Да вы накололись на разное поведение при отсутствии сброса, да в этом виноваты вы как разработчик, НО это не повод лепить сбросы во всё подряд, без логического обоснования этого сброса. Почитайте статью Xilinx гуру "Let's talk about reset" (с) Ken Chapmen

 

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


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

Где вы, в этом примере, видите стейт машину? Да вы накололись на разное поведение при отсутствии сброса, да в этом виноваты вы как разработчик, НО это не повод лепить сбросы во всё подряд, без логического обоснования этого сброса. Почитайте статью Xilinx гуру "Let's talk about reset" (с) Ken Chapmen

конечно, можно нагородить всяких initial и ifdef, но я предпочитаю reset как проверенный и надежный способ.

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

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


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

Симуляция работать не будет. И "=" не следует использовать в описании флип-флопов.

1)Чтобы симуляция работала нужно задать опцию +initreg( modelsim)

Support is added for vlog/vopt options +initreg+0|1|X|Z (to initialize registers) and +initmem+0|1|X|Z (to initialize memory). The value 0|1|X|Z specifies that all the bits in this register or memory are to be 0 or 1 or X or Z.

2) Про "=", не согласен с фразой "не следует", скорее использовать осторожно.

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


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

конечно, можно нагородить всяких initial и ifdef, но я предпочитаю reset как проверенный и надежный способ.

в том то и дело, что для схем которые запускаются из любого состояния, initial нужен только для симулятора. Для синтезатора вы можете его вырезать тегами synthesis translate off/on

А когда код идет в десятки проектов и в ASIC, то рисковать не стоит.

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

 

Моя точка зрения, подкрепленная моим опытом: Сбрасывать надо только то, что должно быть сброшено. Для всего остального это лишние траты.

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


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

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

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

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

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

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

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

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

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

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