logo

حظر Verilog دائمًا

في Verilog، تعد الكتلة دائمًا إحدى الكتل الإجرائية. يتم تنفيذ البيانات داخل الكتلة دائمًا بالتسلسل.

يتم تنفيذ الكتلة دائمًا دائمًا، على عكس الكتل الأولية التي يتم تنفيذها مرة واحدة فقط في بداية المحاكاة. يجب أن يحتوي الحظر دائمًا على قائمة حساسة أو تأخير مرتبط به

القائمة الحساسة هي التي تخبر الكتلة دائمًا بموعد تنفيذ كتلة التعليمات البرمجية.

بناء الجملة

ال فيريلوج قم دائمًا بحظر بناء الجملة التالي

سلسلة ن جافا
 always @ (event) [statement] always @ (event) begin [multiple statements] end 

أمثلة

الرمز @ بعد الكلمة المحجوزة دائماً ، يشير إلى أنه سيتم تشغيل الكتلة في الشرط الموجود بين قوسين بعد الرمز @.

 always @ (x or y or sel) begin m = 0; if (sel == 0) begin m = x; end else begin m = y; end end 

في المثال أعلاه، وصفنا mux 2:1، مع الإدخال x وy. ال هذا هو الإدخال المحدد، و م هو إخراج mux.

في أي منطق تركيبي، يتغير الإخراج كلما تغير الإدخال. عندما يتم تطبيق هذه النظرية على الكتل دائمًا، فيجب تنفيذ التعليمات البرمجية الموجودة داخل الكتل دائمًا كلما تغيرت متغيرات الإدخال أو الإخراج.

ملاحظة: يمكنه تشغيل أنواع البيانات القياسية والأعداد الصحيحة ولكن لا يمكنه تشغيل أنواع البيانات السلكية.

هناك نوعان من القائمة الحساسة في Verilog، مثل:

  1. حساس للمستوى (للدوائر التوافقية).
  2. حساسة للحافة (للفليب فلوب).

الكود أدناه هو نفس 2:1 mux، لكن الناتج م هو الآن إخراج الوجه بالتخبط.

 always @ (posedge clk ) if (reset == 0) begin m <= 0; end else if (sel="=" 0) begin m <="x;" pre> <h4>NOTE: The always block is executed at some particular event. A sensitivity list defines the event.</h4> <h3>Sensitivity List</h3> <p>A sensitivity list is an expression that defines when the always block executed, and it is specified after the @ operator within the parentheses ( ). This list may contain either one or a group of signals whose value change will execute the always block.</p> <p>In the code shown below, all statements inside the always block executed whenever the value of signals x or y change.</p> <pre> // execute always block whenever value of &apos;x&apos; or &apos;y&apos; change always @ (x or y) begin [statements] end </pre> <p> <strong>Need of Sensitivity List</strong> </p> <p>The always block repeats continuously throughout a simulation. The sensitivity list brings a certain sense of timing, i.e., whenever any signal in the sensitivity list changes, the always block is triggered.</p> <p>If there are no timing control statements within an always block, the simulation will hang because of a zero-delay infinite loop.</p> <p>For example, always block attempts to invert the value of the signal clk. The statement is executed after every 0-time units. Hence, it executes forever because of the absence of a delay in the statement.</p> <pre> // always block started at time 0 units // But when is it supposed to be repeated // There is no time control, and hence it will stay and // be repeated at 0-time units only and it continues // in a loop and simulation will hang always clk = ~clk; </pre> <p>If the sensitivity list is empty, there should be some other form of time delay. Simulation time is advanced by a delay statement within the always construct.</p> <pre> always #10 clk = ~clk; </pre> <p>Now, the clock inversion is done after every 10-time units. That&apos;s why the real Verilog design code always requires a sensitivity list.</p> <h4>NOTE: Explicit delays are not synthesizable into logic gates.</h4> <h3>Uses of always block</h3> <p>An always block can be used to realize combinational or sequential elements. A sequential element like flip flop becomes active when it is provided with a clock and reset.</p> <p>Similarly, a combinational block becomes active when one of its input values change. These hardware blocks are all working concurrently independently of each other. The connection between each is what determines the flow of data.</p> <p>An always block is made as a continuous process that gets triggered and performs some action when a signal within the sensitivity list becomes active.</p> <p>In the following example, all statements within the always block executed at every positive edge of the signal clk</p> <pre> // execute always block at the positive edge of signal &apos;clk&apos; always @ (posedge clk) begin [statements] end </pre> <h3>Sequential Element Design</h3> <p>The below code defines a module called <strong> <em>tff</em> </strong> that accepts a data input, clock, and active-low reset. Here, the always block is triggered either at the positive edge of the <strong> <em>clk</em> </strong> or the negative edge of <strong> <em>rstn</em> </strong> .</p> <p> <strong>1. The positive edge of the clock</strong> </p> <p>The following events happen at the positive edge of the clock and are repeated for all positive edge of the clock.</p> <p> <strong>Step 1:</strong> First, if statement checks the value of active-low reset <strong> <em>rstn</em> </strong> .</p> <ul> <li>If <strong> <em>rstn</em> </strong> is zero, then output q should be reset to the default value of 0.</li> <li>If <strong> <em>rstn</em> </strong> is one, then it means reset is not applied and should follow default behavior.</li> </ul> <p> <strong>Step 2:</strong> If the previous step is false, then</p> <ul> <li>Check the value of d, and if it is found to be one, then invert the value of q.</li> <li>If d is 0, then maintain value of q.</li> </ul> <pre> module tff (input d, clk, rstn, output reg q); always @ (posedge clk or negedge rstn) begin if (!rstn) q <= 0; else if (d) q <="~q;" end endmodule pre> <p> <strong>2. Negative edge of reset</strong> </p> <p>The following events happen at the negative edge of <strong> <em>rstn</em> </strong> .</p> <p> <strong>Step 1:</strong> First, if statement checks the value of active-low reset <strong> <em>rstn</em> </strong> . At the negative edge of the signal, its value is 0.</p> <ul> <li>If the value of <strong> <em>rstn</em> </strong> is 0, then it means reset is applied, and output should be reset to the default value of 0.</li> <li>And if the value of <strong> <em>rstn</em> </strong> is 1, then it is not considered because the current event is a negative edge of the <strong> <em>rstn</em> </strong> .</li> </ul> <h3>Combinational Element Design</h3> <p>An always block can also be used in the design of combinational blocks.</p> <p>For example, the digital circuit below represents three different logic gates that provide a specific output at signal o.</p> <img src="//techcodeview.com/img/verilog-tutorial/39/verilog-always-block.webp" alt="Verilog Always Block"> <p>The code shown below is a module with four input ports and a single output port called o. The always block is triggered whenever any of the signals in the sensitivity list changes in value.</p> <p>The output signal is declared as type <strong> <em>reg</em> </strong> in the module port list because it is used in a procedural block. All signals used in a procedural block should be declared as type <strong> <em>reg</em> </strong> .</p> <pre> module combo (input a, input b, input c, input d, output reg o); always @ (a or b or c or d) begin o <= ~((a & b) | (c^d)); end endmodule < pre> <p>The signal o becomes 1 whenever the combinational expression on the RHS becomes true. Similarly, o becomes 0 when RHS is false.</p> <hr></=></pre></=></pre></=>

الحاجة إلى قائمة الحساسية

كم عدد أفلام المهمة المستحيلة الموجودة

تتكرر الكتلة دائمًا بشكل مستمر طوال عملية المحاكاة. توفر قائمة الحساسية إحساسًا معينًا بالتوقيت، أي أنه كلما تغيرت أي إشارة في قائمة الحساسية، يتم تشغيل الكتلة دائمًا.

شجرة بتري وشجرة ب

إذا لم تكن هناك بيانات التحكم في التوقيت داخل الكتلة دائمًا، فسوف تتوقف المحاكاة بسبب حلقة لا نهائية ذات تأخير صفري.

على سبيل المثال، قم دائمًا بمنع محاولات عكس قيمة الإشارة clk. يتم تنفيذ البيان بعد كل 0 وحدة زمنية. ومن ثم يتم تنفيذه إلى الأبد بسبب عدم وجود تأخير في البيان.

 // always block started at time 0 units // But when is it supposed to be repeated // There is no time control, and hence it will stay and // be repeated at 0-time units only and it continues // in a loop and simulation will hang always clk = ~clk; 

إذا كانت قائمة الحساسية فارغة، فيجب أن يكون هناك شكل آخر من أشكال التأخير الزمني. يتم تقديم وقت المحاكاة من خلال بيان تأخير داخل البناء دائمًا.

 always #10 clk = ~clk; 

الآن، يتم قلب الساعة بعد كل 10 وحدات زمنية. ولهذا السبب يتطلب رمز تصميم Verilog الحقيقي دائمًا قائمة حساسية.

ملاحظة: لا يمكن تجميع التأخيرات الصريحة في البوابات المنطقية.

استخدامات الحظر دائمًا

يمكن استخدام الكتلة دائمًا لتحقيق العناصر التوافقية أو المتسلسلة. يصبح العنصر المتسلسل مثل Flip Flop نشطًا عندما يتم تزويده بساعة وإعادة ضبطه.

وبالمثل، تصبح الكتلة المركبة نشطة عندما تتغير إحدى قيم الإدخال الخاصة بها. تعمل جميع كتل الأجهزة هذه بشكل متزامن بشكل مستقل عن بعضها البعض. الاتصال بين كل منهما هو ما يحدد تدفق البيانات.

يتم إنشاء الكتلة دائمًا كعملية مستمرة يتم تشغيلها وتنفيذ بعض الإجراءات عندما تصبح الإشارة الموجودة في قائمة الحساسية نشطة.

في المثال التالي، يتم تنفيذ كافة البيانات داخل الكتلة دائمًا عند كل حافة موجبة للإشارة clk

إزالة الحرف الأول من Excel
 // execute always block at the positive edge of signal &apos;clk&apos; always @ (posedge clk) begin [statements] end 

تصميم العناصر التسلسلية

يحدد الكود أدناه وحدة تسمى tff يقبل إدخال البيانات والساعة وإعادة التعيين النشط المنخفض. هنا، يتم تشغيل الكتلة دائمًا إما على الحافة الإيجابية للملف clk أو الحافة السلبية ل com.rstn .

1. الحافة الإيجابية للساعة

الأحداث التالية تحدث عند الحافة الإيجابية للساعة وتتكرر لجميع الحافة الإيجابية للساعة.

الخطوة 1: أولاً، إذا كان البيان يتحقق من قيمة إعادة التعيين النشط المنخفض com.rstn .

  • لو com.rstn تساوي صفرًا، فيجب إعادة تعيين الإخراج q إلى القيمة الافتراضية وهي 0.
  • لو com.rstn هو واحد، فهذا يعني أنه لم يتم تطبيق إعادة التعيين ويجب أن يتبع السلوك الافتراضي.

الخطوة 2: إذا كانت الخطوة السابقة خاطئة، إذن

  • تحقق من قيمة d، وإذا وجدت أنها واحدة، اقلب قيمة q.
  • إذا كانت d تساوي 0، فاحتفظ بقيمة q.
 module tff (input d, clk, rstn, output reg q); always @ (posedge clk or negedge rstn) begin if (!rstn) q <= 0; else if (d) q <="~q;" end endmodule pre> <p> <strong>2. Negative edge of reset</strong> </p> <p>The following events happen at the negative edge of <strong> <em>rstn</em> </strong> .</p> <p> <strong>Step 1:</strong> First, if statement checks the value of active-low reset <strong> <em>rstn</em> </strong> . At the negative edge of the signal, its value is 0.</p> <ul> <li>If the value of <strong> <em>rstn</em> </strong> is 0, then it means reset is applied, and output should be reset to the default value of 0.</li> <li>And if the value of <strong> <em>rstn</em> </strong> is 1, then it is not considered because the current event is a negative edge of the <strong> <em>rstn</em> </strong> .</li> </ul> <h3>Combinational Element Design</h3> <p>An always block can also be used in the design of combinational blocks.</p> <p>For example, the digital circuit below represents three different logic gates that provide a specific output at signal o.</p> <img src="//techcodeview.com/img/verilog-tutorial/39/verilog-always-block.webp" alt="Verilog Always Block"> <p>The code shown below is a module with four input ports and a single output port called o. The always block is triggered whenever any of the signals in the sensitivity list changes in value.</p> <p>The output signal is declared as type <strong> <em>reg</em> </strong> in the module port list because it is used in a procedural block. All signals used in a procedural block should be declared as type <strong> <em>reg</em> </strong> .</p> <pre> module combo (input a, input b, input c, input d, output reg o); always @ (a or b or c or d) begin o <= ~((a & b) | (c^d)); end endmodule < pre> <p>The signal o becomes 1 whenever the combinational expression on the RHS becomes true. Similarly, o becomes 0 when RHS is false.</p> <hr></=></pre></=>