FPGAS في C مع Cynth

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

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

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

بينما (1)
{
Out1 = CTR1 ++؛
Out2 = CTR2 ++؛
}
ستؤدي قيمة Out1 إلى تعديل بعض الشيء قبل القيمة في Out2. إذا كان لديك الكثير من هذه، فإن الدولة بقدر ما out999، قد يكون التأخير كبيرا. قد يشبه رمز Verilog المكافئ:

دائما @ (posedge clk)
يبدأ
Out1 <= CTR1؛ CTR1 <= CTR1 + 1؛ Out2 <= CTR2؛ CTR2 <= CTR2 + 1؛ نهاية هذا يبدو عمليا نفسه، ولكن سيتم تعديل المخرجات في نفس الوقت بالضبط بغض النظر عن مدى وجود العديد منهم. ما هو أكثر من ذلك هو أن جميع الأشياء الأخرى التي لا يمكنك رؤيتها ستتحدث في الوقت نفسه بالضبط. تماما مثل الأجهزة وكذلك المدخل لا "مسح" مدخلاته، وعمليات FPGA جميع مدخلاتها وكذلك تنتج المخرجات. في حالة CYNTH، تنتج كل وظيفة C وحدة فيريلوج لها نفس الحجج الدقيقة مثل الوظيفة مع خلاف آخر للوقوف في قيمة العودة، إن وجدت. سيكون هناك مدخلات على مدار الساعة للنظام، وإشارة إعادة تعيين، بالإضافة إلى ثلاثة إشارات إدارة. واحد هو المدخلات التي تسمح للمعالجة. هناك مخرجان. يشير المرء إلى تقديم الوظيفة للسماح وكذلك يشير إلى ما هو أكثر مما يشير إلى أن النتيجة متاحة. المثال المقدم مع الرمز هو نمط العين Cylon يدفع أربعة المصابيح. هناك نوعان من الوظائف الخارجية التي يتم إنتاجها مع فيريلوج نقي. تعمل وظيفة Write_leds على محركات المصابيح بالإضافة إلى دالة النوم بإنشاء تأخير. رمز C هو وظيفة بسيطة تسمى Roving: بينما (1) { إذا (dir && c == 8) دير = 0؛ آخر إذا (! dir && c == 1) دير = 1؛ إذا (دير) ج << = 1؛ آخر ج = 1 = 1؛ Write_leds (ج)؛ النوم (1000)؛ // 1s. } تنفذ بيانات Verilog المقابلة نفس الوظيفة بالضبط كما يمكنك تأكيد استخدام محاكي Verilog. إذا كنت ترغب في الحفر في التعليمات البرمجية المنتجة، فيمكنك اكتشاف المزيد عن Verilog مع بعض المشاريع. إذا كان ج ليس الشيء الخاص بك، فقد تحاول دائما بيثون.

Leave a Reply