سؤال

لقد قيل لي استخدام "عندما" بيان لإعطاء المضاعف ولكن لا يستخدم عبارة "إذا" يسبب أخطاء توقيت ... لا أفهم هذا ... إذن ما هو الفرق بين "إذا" و "متى "؟ و هل لديك خريطة لنفس الشيء في الأجهزة؟

هل كانت مفيدة؟

المحلول

حسنا، يتيح لمناقشة بعض النقاط في البداية على الفرق بين إذا وعندما البيانات:

  • كلاهما يسمى عناصر تصميم Dataflow.

عندما البيان

  • بيان متزامن
  • غير المستخدمة في العملية، المستخدمة فقط في الهندسة المعمارية كعملة هي التنفيذ المتسلسل

إذا كان البيان

  • بيان متتابع
  • المستخدمة في العملية كما هي عبارة متتابعة، ولا تستخدم خارج العملية

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

مرجع: برامج وممارسات التصميم الرقمي، John F. Wakerly، الطبعة الثالثة

نصائح أخرى

انظر هذه:

في الأساس، if هو متتابع، و when هو متزامن. انهم لا خريطة لنفس الشيء في الأجهزة ... هذه الصفحة يصف، في الأسفل، بعض الاعتبارات الخاصة اللازمة لتوليف if بيان.

كلا أنماط الترميز صالحة تماما.

دعونا نتذكر بعض العناصر. بدء تشغيل من HDL، يتم التوليف في خطوتين رئيسيتين:

  1. أولا، يتم تحليل VHDL من أجل الكشف عن قوالب RTL. (تتكون في عناصر RTL: تخبط الوجه، التعبيرات الحسابية، المضاعفات، منطق التحكم). نقول أن هذه العناصر "مسلمة" (أي يجب عليك الكود باستخدام القالب الصحيح للحصول على ما تريد في البداية. يجب أن تتخيل كيفية توصيل هذه العناصر، قبل الترميز).
  2. الخطوة الثانية حقيقية توليف المنطق, ، يستغرق الأمر معلمات تقنية مستهدفة معينة في الاعتبار (أنواع البوابات المتاحة، التوقيت، المنطقة، الطاقة).

يفصل هذه الخطوتين بوضوح الاحتياجات الوظيفية RTL (منطق توجيه، الحسابات) من حالات الطوارئ التكنولوجية (توقيت إلخ).

دعنا نعود إلى الخطوة الأولى (RTL):

فيما يتعلق بالمتضاعفات، تكون عدة أنماط الترميز ممكنة:

  • باستخدام تعيين متزامن:

    y <= a1 عند cond1 آخر a2 عند cond2 آخر cond3؛

  • باستخدام IF بيان ضمن العملية:

    تبدأ العملية (A1، A2، A3، CAND1، كوند 2) إذا (Cond1) ثم Y <= A1؛ elsif (cond2) ثم y <= a2؛ آخر y <= a3؛ إنهاء إذا؛ نهاية؛

  • باستخدام مهمة متزامنة أخرىشكل، مناسب للأوصاف العامة: إذا كان SEL هو عدد صحيح وموكشين مجموعة من الإشارات، ثم:

    muxout <= muxin (sel)؛ - نستنتج MUX

لاحظ أن أساليب الترميز الثلاثة تعمل دائما. لاحظ أيضا أنهم "أكثر قليلا" من التعددية البسيطة حيث يجبر أسلوب الترميز على وجود ترميز ذات أولوية (إذا كانت المفتاح، عند آخر)، والتي ليست حالة تعدد معادلة بسيطة تعتمد على المعادلة، متماثل حقا.

  • باستخدام بيان الحالة

    عملية (A1، A2، A3، CAND1، CAND2) متغير CAND: STD_LOGIC (1 أسفل 0)؛ بدء cond: = cond2 & cond1؛ Case Cond هو عندما "01" => y <= a1؛ عندما "10" => y <= a2؛ عندما يكون الآخرون => y <= a3؛ حالة النهاية نهاية؛

  • باستخدام عبارة SELECT (في مثالنا، هناك حاجة إلى اثنتان متزامقتان):

    SEL <= cond2 & cond1؛ مع SEL حدد y <= a1 عندما "01"، A2 عندما "10"، A3 عند الآخرين؛

الملاحظة الأخيرة حول ارتفاع التجريد، حتى بالنسبة لتصميم RTL: المزج الآن ناضجة حقا. إلقاء نظرة على Jiri Gaisler الترميز أنماط معالج المصدر المفتوح ليون 2 على سبيل المثال، وكذلك أنماط الترميز (انظر هنا). إنهالساح نهج مختلف جدا، ولكنه صالح تماما، من الكتب الكلاسيكية.

يجب أن تفهم دائما ما سوف يستنتجه المزج RTL.

في العكس من ذلك، يتيح لك التوليف السلوكي أن تنسى (جزئيا) ما سوف يستنتجه المزج. ولكن هذه قصة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top