Jump to content
    

Простая защелка (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

Share this post


Link to post
Share on other sites

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

 

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));

Share this post


Link to post
Share on other sites

Вот защелка:

 

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

 

 

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

 

always @(r, s)
...

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

 

 

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

 

то есть

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

Спасибо, сейчас гляну ...

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

раз
  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
  );

Share this post


Link to post
Share on other sites

Вот защелка:

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 и триггер, и защелка реализуется на основе этих элементов?

Share this post


Link to post
Share on other sites

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

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

logic a, b, c, y;

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

assign q = y || c;

Edited by serjj

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...