سؤال

لقد قمت بمحاكاة سلوكية لرمزي، ويعمل تماما. النتائج متوقعة. عندما أقوم بتجميع الرمز الخاص بي وتحميله إلى Spartan 3E FPGA ومحاولة تحليل استخدام شريحة الشرائح، فإن النتائج ليست قريبة من ما كنت أتوقعه. ماذا فعلت بشكل غير صحيح؟http://pastebin.com/xwmekl7r.

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

المحلول

مشكلتك هي مع خطوط 13-16، حيث تحدد القيم الأولية لسجلات الحالة:

 reg    [OUTPUT_WIDTH-1:0] previousstate = 0;              
 reg    [OUTPUT_WIDTH-1:0] presentstate = 1;
 reg    [6:0] fib_number_cnt = 1;  
 reg    [OUTPUT_WIDTH-1:0] nextstate = 1; 

هذا يعادل كتابة عبارة "أولية" تعيين هذه القيم، والتي ليست مركبة - لا يوجد شيء مثل قيمة افتراضية في الأجهزة. عند وضع التصميم الخاص بك داخل FPGA، ستستمر جميع هذه السجلات في قيم عشوائية.

بدلا من ذلك، تحتاج إلى تهيئة هذه العدادات / الدول داخل كتلة دائما، عند إعادة التعيين مرتفعة.

always @(posedge clk or posedge reset)
  if (reset) begin
     previousstate <= 0;
     presentstate <= 1;
     ... etc ...
  end

الإجابة على أسئلة المتابعة:

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

الآن، يتطلب حظر وسؤال عدم الحجب إجابة طويلة جدا :). سأوجهك إلى هذه الورقة من Snug-2000 والتي ربما تكون أفضل ورقة مكتوبة على الإطلاق في هذا الموضوع. يجيب على سؤالك، وكذلك العديد من الآخرين حول هذا الموضوع. بعد ذلك، سوف تفهم السبب في أن استخدام عبارات الحظر في المنطق المتسلسل يعتبر ممارسة سيئة، ولماذا يعمل التعليمات البرمجية الخاصة بك بشكل جيد مع عبارات الحظر على أي حال.

http://cs.haifa.ac.il/courses/verilog/cummings-neblocking-snug99.pdf.


المزيد من الإجابات:

"النمط" المعتاد لإنشاء المنطق مثل لك هو الحصول على كتلتين دائما، واحد يحدد المنطق، وواحد يحدد يتخبط. في السابق، يمكنك استخدام عبارات الحظر لتنفيذ المنطق، وفي هذا الأخير، تقوم بإغلاق القيمة التي تم إنشاؤها (أو إعادة تعيينها). لذلك، شيء مثل هذا:

wire some_input;

// Main logic (use blocking statements)
reg state, next_state;
always @*
  if (reset) next_state = 1'b0;
  else begin
    // your state logic
    if (state) next_state = some_input;
    else next_state = 1'b0;
  end

// Flops (use non-blocking)
always @(posedge clock)
  if (reset) state <= 1'b0;
  else state <= next_state;

لاحظ أنني أستخدم إعادة تعيين متزامن، ولكن يمكنك استخدام ASYNC إذا لزم الأمر.

نصائح أخرى

خطوط 13-16 صحيحة. "ريج [6: 0] fib_number_cnt = 1؛" ليس هو نفسه باستخدام العبارة "الأولي". قراءة دليل توليف Xilinx للحصول على وصف أكثر تفصيلا لكيفية تهيئة السجلات.

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