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

Простая защелка (latch) на Verilog'е

Вот защелка:

http://files.d-lan.dp.ua/download.php?file...33d13ca27ab19b2

 

(простите, но я так и не могу разобраться, как тут вставлять картинки, а не ссылки).

 

А вот текст на Verilog. Вроде, все правильно:

 

module my_latch (r, s, q)
input r, s;
output q;
reg q;

if (r) q <= 1'b0;
else if (s) q <= 1'b1;
endmodule

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


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

я бы сделал все же

 

always @(r, s)
  begin
     if(r)
        q  <= 1'b0;
     else if(s) 
        q  <= 1'b1;
  end

 

или даже

 

always @(r, s)
  begin
     if(s) 
        q  <= 1'b1;
     if(r)
        q  <= 1'b0;
  end

 

по смыслу тоже, запись глаже....

 

а можно прям как на картинке

 

assign q = (~r & (s | q));

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


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

Вот защелка:

 

Открываем темплейты и выбираем нужный..

И в Моделсиме, и в Квартусе и в ISE...

Зачем мудрить?

 

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


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

Открываем темплейты и выбираем нужный..

И в Моделсиме, и в Квартусе и в ISE...

А в ISE где их искать ?

 

 

я бы сделал все же

 

always @(r, s)
...

 

Но и без "always", по идее, тоже должно работать ?

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


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

А в ISE где их искать ?

 

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

 

 

 

без laways не очень понятно как это в шаблон объявления модуля вкладывается

 

то есть

if (r) q <= 1'b0;
else if (s) q <= 1'b1;

это вот что? сколько раз это надо повторять, это не initial и не always...

 

не понятно с точки зрения стандарта как это расценивать. Может кто более в стандарте искушен поправят.

 

в конструкции always @ все понятно, ждем события - @, и как только дошли до енда алвайса опять в начала ждем события. а так это как интеграл без дифференциала. ИМХО

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


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

это вот что? сколько раз это надо повторять, это не initial и не always...

 

не понятно с точки зрения стандарта как это расценивать. Может кто более в стандарте искушен поправят.

 

в конструкции always @ все понятно, ждем события - @, и как только дошли до енда алвайса опять в начала ждем события. а так это как интеграл без дифференциала. ИМХО

В общем, все ясно, спасибо ...

 

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


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

я бы еще явно описал то, что должен делать триггер, когда оба сигнала в единице. Например так:

 

always @* begin

if (r && !s) q <= 1'b0;

else if (!r && s) q <= 1'b1;

else if (r && s) q <= 1'bZ;

else q <= q;

end

 

последнюю строчку можно выкинуть.

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


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

Но и без "always", по идее, тоже должно работать ?

Если так лень читать стандарт, то открываем modelsim/questasim, вводим предложенную вами конструкцию и видим, что вылазит ошибка:

** Error: C:/workspace/modelsim/pr40_rtl/tb/tb_pr40.sv(136): near "<=": syntax error, unexpected <=, expecting IDENTIFIER or TYPE_IDENTIFIER

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

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


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

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

Видна при активной панели редактирования HDL-файлов...

Или надо открыть файл, или открыть "новый"...

 

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


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

Но и без "always", по идее, тоже должно работать ?

Изучите материал по приведенной ниже ссылке. Как раз по Вашему вопросу.

http://svo.2.staticpublic.s3-website-us-ea...og/assignments/

 

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


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

module my_latch (r, s, q)
input r, s;
output q;
reg q;

if (r) q <= 1'b0;
else if (s) q <= 1'b1;
endmodule

Процедурные присваивания допустимы по стандарту только в блоке always. Правильно будет как посоветовал Golikov A

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


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

Из лампочки примитив ловчее будет

 

раз
  LDCE #(
     .INIT(1'b0) // Initial value of latch (1'b0 or 1'b1)
  ) LDCE_inst (
     .Q(Q),      // Data output
     .CLR(CLR),  // Asynchronous clear/reset input
     .D(D),      // Data input
     .G(G),      // Gate input
     .GE(GE)     // Gate enable input
  );
два
  LDCPE #(
     .INIT(1'b0) // Initial value of latch (1'b0 or 1'b1)
  ) LDCPE_inst (
     .Q(Q),      // Data output
     .CLR(CLR),  // Asynchronous clear/reset input
     .D(D),      // Data input
     .G(G),      // Gate input
     .GE(GE),    // Gate enable input
     .PRE(PRE)   // Asynchronous preset/set input
  );
три
  LDPE #(
     .INIT(1'b0) // Initial value of latch (1'b0 or 1'b1)
  ) LDPE_inst (
     .Q(Q),      // Data output
     .PRE(PRE),  // Asynchronous preset/set input
     .D(D),      // Data input
     .G(G),      // Gate input
     .GE(GE)     // Gate enable input
  );

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


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

Вот защелка:

http://files.d-lan.dp.ua/download.php?file...33d13ca27ab19b2

 

(простите, но я так и не могу разобраться, как тут вставлять картинки, а не ссылки).

 

А вот текст на Verilog. Вроде, все правильно:

 

module my_latch (r, s, q)
input r, s;
output q;
reg q;

if (r) q <= 1'b0;
  else if (s) q <= 1'b1;
endmodule

 

Скажите, а зачем городить защелки, если в структуре LE (логической ячейки) есть только LUT и триггер, и защелка реализуется на основе этих элементов?

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


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

Скажите, а зачем городить защелки, если в структуре LE (логической ячейки) есть только LUT и триггер, и защелка реализуется на основе этих элементов?

В большинстве случаев latch - нежелательный результат, поэтому важно знать как его описать. Это позволит не использовать конструкции, приводящие к имплементации латчей. Возможно в некоторых архитектурах и задачах они используются как равноправный элемент дизайна. В обычных ПЛИС их лучше исключить. Если же нужен "логический эквивалент", то ИМХО лучше так сделать (например):

logic a, b, c, y;

assign y = a && b;
always@(posedge clock)
     c <= y;
end

assign q = y || c;

Изменено пользователем serjj

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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