تطوير برامج للمعالج المركزي Redd على سبيل المثال من الوصول إلى FPGA

في مقالة سابقة ، قلت إن الوقت قد حان لنا للانتقال إلى بروتوكولات البث. لكن بعد أن بدأت في إعداد قصة عنهم ، أدركت أنني نفسي أسبح في موضوع واحد مهم للغاية. كما لوحظ بالفعل ، فإن علاقتي بنظام Linux غريبة للغاية. بشكل عام ، أدركت أنني شخصياً لا أستطيع إنشاء تطبيق C ++ من الصفر يرضي جميع مبادئ البرمجة لـ Redd. يمكنك أن تطلب من شخص ما القيام بذلك ، ثم استخدم فقط القالب الجاهز ، ولكن سلسلة المقالات مصممة لتعليم الجميع كيفية التطوير تحت تأثير Redd من البداية. لذلك ، سألت مديري (أحد أخصائيي Linux الكبار) ، وأوضح لي ما يجب النقر عليه. ثم أعدت التفكير قليلاً في كلماته والآن أعتبر أنه من الضروري إصلاح كل المعرفة كتابيًا. هذا سينقذ الناس مثلي من الأفكار المؤلمة: "هكذا ... ما فعله مفهوم ، لكن كيف يمكنني تكرار هذا؟" بشكل عام ، يمكن لأي شخص يعمل تحت Linux تشغيل القسمين التاليين قطريًا. من غير المحتمل أن تجد شيئًا جديدًا هناك (ستجد المزيد). وبالنسبة للباقي ، أقدم خيارين من طرق التطوير التي تتوافق مع المبادئ المعلنة للعمل بموجب Redd: تكاليف العمالة المنخفضة للتطوير والتصحيح عن بُعد.



جميع مقالات الدورة:

  1. تطوير أبسط "البرامج الثابتة" لأجهزة FPGA المثبتة في Redd ، وتصحيح الأخطاء باستخدام اختبار الذاكرة كمثال
  2. تطوير أبسط "البرامج الثابتة" لأجهزة FPGA المثبتة في Redd. الجزء 2. رمز البرنامج
  3. تطوير جوهرها الخاص لتضمينها في نظام المعالج على أساس FPGA

العمل باستخدام أدوات Visual Studio


اتضح أنه يمكنك إجراء تطوير لنظام Linux عن بُعد ، دون الحاجة إلى تشغيله على جهازك المحلي على الإطلاق ، ودون تثبيت أي أدوات برامج غير تابعة لشركة Microsoft. يظهر هنا كيفية وضعه على Visual Studio (قمت بتثبيته في الإصدار 2019 ، ولكن يبدو أنه ظهر في عام 2015) docs.microsoft.com/ru-ru/cpp/linux/download-install-and-setup- عبء العمل على تطوير نظام التشغيل linux؟ view = vs-2019

وهنا نظرية العمل .

حسنًا ، يمكنك التجول حول علامات التبويب والكثير من الناحية النظرية وكل شيء باللغة الروسية.

عظيم! دعونا نحاول استخدام المعرفة المكتسبة للوصول إلى شريحة FT2232H ، التي يتم من خلالها توصيل المعالج Redd المركزي بـ FPGA. هذه القناة في المستقبل هي التي ستشكل أساس عمل البث لدينا. افتح Visual Studio ، حدد "إنشاء مشروع". في المرشحات ، حدد "Language - C ++" ، "Platform - Linux" ، "Project Type - Console". سأبين أين يوجد هذا بالفعل لنوع المشروع. من بين ما تمت تصفيته ، نختار "تطبيق وحدة التحكم":



دعنا نسميها ، قل ، SimpleConsole. لقد أنشأنا مثل هذا الكود المصدري Spartan:

#include <cstdio> int main() { printf("hello from SimpleConsole!\n"); return 0; } 

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

نملأ المعلمات الخاصة بمستخدم Redd ، نيابةً عن من سيتم تنفيذ العمل في المشروع.



إذا كان هناك أي شيء - يمكن تغيير المعلمات هنا في هذا المكان السري (لا تحاول تغيير خصائص المشروع ، فلن يؤدي ذلك إلى أي شيء جيد):





في الواقع ، يمكنك وضع نقطة توقف على سطر واحد والتحقق من أن المشروع يبدأ ويعمل. لكن هذا تافه. لذلك ، ننتقل إلى مهمة أكثر إثارة للاهتمام - العمل مع FT2232. السؤال الذي يطرح نفسه: من أين تحصل على المكتبات اللازمة؟ لنظام التشغيل Linux ، يتم تضمين كل شيء في حزمة برنامج التشغيل. هناك برنامج التشغيل نفسه ، والمكتبات ، وأمثلة من التطبيقات للعمل معهم ، وحتى تعليمات موجزة. بشكل عام ، ننتقل إلى محرك البحث:

 FTDI D2XX drivers 

سيوضح أين يمكن تنزيلها. صحيح ، على وجه التحديد ، كان كل شيء سيئًا بالنسبة لي. يحظر مزودي موقع FTDI (بالإضافة إلى reprap و 7zip وحتى osronline) ، في إشارة إلى RosKomNadzor. في استجابة للبيانات ، ترسل ILV أسماء غير المشتركين ، قائلة إننا لا نمنع أي شيء ، بل نتعامل مع المزود بنفسك. حيث فقط في هؤلاء غير المشتركين لم يعرضوا عليّ أن أنتقل ، حتى إلى الشرطة. هم إلغاء الاشتراك للغاية. ينتهي توجيه محاولات الشكوى من تقاعس ILV إلى ILV ، حيث يأتي إلغاء الاشتراك التالي. بشكل عام ، قد يتضح أن مزودك سيمنع الوصول أيضًا. لا تشعر بالقلق ، فما عليك سوى البحث عن طرق أخرى للتنزيل ، وقضاء بعض الوقت في هذا الأمر. وبعد ذلك فوجئوا بتأخر تطوير الصواريخ لعدة عقود ... لقد بدأت المراسلات مع ILV في نوفمبر الماضي ، والآن حان يونيو ، باستثناء إلغاء الاشتراكات - لا يوجد إجراء ... لكني صرفت انتباهي.

يمكن العثور على كيفية استخدام برامج التشغيل في الملف التمهيدي ، في الحزمة نفسها. يمكنك أيضًا العثور على المستند AN_220 FTDI Drivers Installation Guide لنظام التشغيل Linux . أخيرًا ، يمكنك أن تجد على YouTube مقطع فيديو لدليل تثبيت برنامج تشغيل Linux d2xx من خلال رقائق FTDI. يوجد رابط إليها أيضًا في صفحة تنزيل برنامج التشغيل. بشكل عام ، لم يركز FTDI على خيارات لإعلام المستخدمين. في الواقع ، إذا تلقيت حزمة Redd جاهزة ، فسيتم بالفعل تثبيت برامج التشغيل نفسها وتكوينها عليها. وسنكون مهتمين بملفات الرأس والأمثلة.

دعونا إدراج مثال شريحة \ الافراج عن \ الأمثلة \ EEPROM \ قراءة . بداية الوظيفة الرئيسية ، حيث يفتح الجهاز ويتم التقاط نوعه. هذا سيكون كافيا للتأكد من أن كل شيء يعمل. أنا أكره التصنيفات ، ولكن نظرًا لأننا نسحب بسرعة وننزل الكود الذي يستمر لمدة 10 دقائق ، فسوف أسحب التصنيف الموجود في المثال الأصلي لتوفير الوقت. اتضح مثل هذا:

 #include <cstdio> #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include "ftd2xx.h" int main(int argc, char* argv[]) { printf("hello from ConsoleApplication1!\n"); FT_STATUS ftStatus; FT_HANDLE ftHandle0; int iport; static FT_PROGRAM_DATA Data; static FT_DEVICE ftDevice; DWORD libraryVersion = 0; int retCode = 0; ftStatus = FT_GetLibraryVersion(&libraryVersion); if (ftStatus == FT_OK) { printf("Library version = 0x%x\n", (unsigned int)libraryVersion); } else { printf("Error reading library version.\n"); return 1; } if (argc > 1) { sscanf(argv[1], "%d", &iport); } else { iport = 0; } printf("Opening port %d\n", iport); ftStatus = FT_Open(iport, &ftHandle0); if (ftStatus != FT_OK) { /* This can fail if the ftdi_sio driver is loaded use lsmod to check this and rmmod ftdi_sio to remove also rmmod usbserial */ printf("FT_Open(%d) failed\n", iport); return 1; } printf("FT_Open succeeded. Handle is %p\n", ftHandle0); ftStatus = FT_GetDeviceInfo(ftHandle0, &ftDevice, NULL, NULL, NULL, NULL); if (ftStatus != FT_OK) { printf("FT_GetDeviceType FAILED!\n"); retCode = 1; goto exit; } printf("FT_GetDeviceInfo succeeded. Device is type %d.\n", (int)ftDevice); exit: return 0; } 

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

 1>main.cpp 1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(5,20): error : ftd2xx.h:      1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(5,20): error : #include "ftd2xx.h" 1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(5,20): error : ^ 1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(5,20): error : compilation terminated. 

لكنني وضعت لهم المقبل! كل شيء بسيط. محليا ، هم في مكان قريب ، ولكن يتم الانتهاء من التجمع عن بعد. لكي يقوم Studio بنقلها إلى جهاز بعيد ، تحتاج إلى إضافتها إلى المشروع. علاوة على ذلك ، من ملف main.cpp أود فقط إضافة ftd2xx.h ، لكنه لا يزال يسحب WinTypes.h في العبور . لديك لإضافة كليهما.





الآن يقسم رابط.

 1>  1>D:\Work\SimpleConsole\SimpleConsole\obj\x64\Debug\main.o : error : In function `main': 1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(18): error : undefined reference to `FT_GetLibraryVersion' 1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(37): error : undefined reference to `FT_Open' 1>D:\Work\SimpleConsole\SimpleConsole\main.cpp(55): error : undefined reference to `FT_GetDeviceInfo' 1>collect2 : error : ld returned 1 exit status 

من الواضح أنه لا يوجد مكتبة كافية. عند فحص ملفات تعريف المثال ، أدركت أنني بحاجة إلى إضافة معلمتين إلى إعدادات الرابط:





الآن المشروع يسير بنجاح. نضع نقطة توقف على السطر الأخير ، في محاولة لتشغيل. نرى النص التالي:

 hello from ConsoleApplication1! Library version = 0x10408 Opening port 0 FT_Open succeeded. Handle is 0x555555768540 FT_GetDeviceInfo succeeded. Device is type 10. 

عموما - ليس سيئا. تم فتح شيء ما ، حتى تم العثور على بعض الأجهزة. ما هو النوع 10؟ في ملف الرأس من FTDI نجد:

 enum { FT_DEVICE_BM, FT_DEVICE_AM, FT_DEVICE_100AX, FT_DEVICE_UNKNOWN, FT_DEVICE_2232C, FT_DEVICE_232R, FT_DEVICE_2232H, FT_DEVICE_4232H, FT_DEVICE_232H, FT_DEVICE_X_SERIES, FT_DEVICE_4222H_0, FT_DEVICE_4222H_1_2, FT_DEVICE_4222H_3, FT_DEVICE_4222_PROG, }; 

نحن نحسب الإصبع من الأعلى إلى الأسفل - أمامنا هو FT4222H. نعم ، لدى Redd الكثير من أجهزة FTDI. الآن سأقول باختصار أننا نحتاج إلى فرز رقم الجهاز الذي تم تمريره إلى وظيفة FT_Open () ، يتم تمرير هذا الرقم إلى الوظيفة الرئيسية () كوسيطة. يمكن تعيينها في خصائص التصحيح للمشروع.

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

عرضسبب
لا يفتح جهاز واحد.بشكل افتراضي ، يتطلب Linux حقوق المسؤول لفتح أجهزة USB ، ولكن المستخدم الذي يقوم بتسجيل الدخول لتصحيح الأخطاء لا يملكها. يجب عليك تكوين المنافذ بحيث يمكن استخدامها من قبل مستخدم عادي.
اثنين فقط من الأجهزة مفتوحة ، سواء FT4222H.بشكل افتراضي ، يتم تثبيت برنامج تشغيل منفذ COM ظاهري قياسي على وحدة التحكم FT2232H. يجب أن تخبر نظام التشغيل بعدم القيام بذلك.
لا توجد مكتباتلم يتم تثبيت برامج تشغيل D2XX على نظام تشغيل الجهاز Redd.

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

العمل مع Linux يعمل في جهاز افتراضي


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

بادئ ذي بدء ، وضعنا برنامج VirtualBox من Oracle على الجهاز المحلي. إذا كانت هناك أية مشكلات متعلقة بالترخيص (استخدمها مجانًا ، كفرد ، لكنني لا أعرف تمامًا ما يحدث مع الكيانات القانونية) ، حدد جهازًا ماديًا منفصلًا وأضع نظام Linux هناك. أي واحد؟ الأمر أسهل بالنسبة لي ، وأنا أفهم كل منهم عن نفسه. يعني أنا تقريبا لا أفهم واحد. لذلك ، أخبرني الرئيس أنك بحاجة إلى استخدام دبيان ، لقد قمت بتثبيت دبيان. يمكنك الذهاب بنفس الطريقة (استخدم مبدأ "لماذا لا؟"). على الأقل في المستقبل سأعتمد على العمل معه.

عند العمل على نظام Linux ، يجب أن تلتزم بقاعدتين تسهلان الحياة إلى حد كبير:

  1. إذا أخبرونا ، رداً على أمر ما ، أنه لا توجد حقوق كافية ، فإن الأمر يستحق التكرار ، مضيفًا تعويذة sudo السحرية إلى البداية.
  2. إذا قيل لنا استجابةً لأحد الأوامر أنه لا يوجد مثل هذا الأمر ، فإن الأمر يستحق محاولة تثبيته عن طريق الإدلاء بالتثبيت الإملائي السحري apt-get <install مفقود .

هكذا. لقد قمنا فقط بتثبيت نظام التشغيل. أضف دعم C ++ على الفور عن طريق تثبيت برنامج التحويل البرمجي g ++ ، وكذلك مصحح أخطاء gdb. كيف؟ لذلك باستخدام القاعدة 2:

apt-get install g ++
apt-get install gdb

لم تعط؟ عظيم! كرر باستخدام القاعدة 1:

sudo apt-get install g ++
sudo - الحصول على تثبيت gdb

نذهب الآن إلى الإنترنت ، في محرك البحث نكتب:

كسوف بيئة تطوير متكاملة

نجد رابطًا إلى eclipse.org ، حيث تتوفر الخيارات الأولى لجافا ، ونجد وننزل خيارًا لـ C / C ++:



قم بتنزيل وفك ، في المنزل.

في الواقع ، لا يلزم التثبيت. اذهبوا إلى الدليل حيث تم تفكيك كل شيء وتشغيل ملف الكسوف:



نحن في بيئة التطوير. حسنًا ، إذا كنت قد عملت بالفعل مع ميكروكنترولر وحتى نوى المعالج لـ FPGAs ، فمن المحتمل أنك تعرف بالفعل ما هو Eclipse. حتى الأشياء غير المألوفة اكتمال تقريبا. نبدأ في البحث في أشياء أكثر أو أقل دراية. نخلق مشروع C ++. يجب أن أقول على الفور أن هناك طريقتان. واحد سوف يؤدي إلى النجاح ، والثاني إلى طريق مسدود. لذلك ، اتبع بعناية المسار الذي أمشي:







لقد أنشأنا مشروعًا يسير على ما يرام. لتكوين تصحيح الأخطاء الخاص به ، انتقل إلى خصائص GDB:



قم بإنشاء تكوين من النوع C / C ++ Remote Application ، في مجموعة الاتصال ، انقر فوق جديد:



اختر اتصالًا مثل SSH:



نقوم بملء خصائص الاتصال عن طريق تبديل زر الاختيار الخاص بنوع الترخيص إلى ترخيص كلمة المرور:



في الواقع ، النظام جاهز للتصحيح. بعد التأكد من عرض نص الترحيب فعليًا ، نحاول نقل الرمز من المثال السابق (الذي كان في Visual Studio) هنا. لتسجيل مكتبات إضافية ، حدد خصائص المشروع:



علاوة على ذلك ، نظرًا لأن التجميع يجري محليًا ، يجب أن تكون المكتبات أيضًا في دليل usr / local / lib المحلي. أذكرك بأنه يتم تنزيل المكتبات باستخدام برنامج التشغيل ، وأن كيفية تثبيتها جاهزة ، بالإضافة إلى مقاطع الفيديو AN220 و YouTube للحصول على التفاصيل ، راجع القسم الموجود في Visual Studio.

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

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

FPGA قياس سرعة الكتابة عبر FT2232H


حسنا ماذا. دعونا إصلاح المهارات المكتسبة في مشروع حقيقي أكثر أو أقل. بالطبع ، لم يعد بدء شيء خطير أمرًا ممكنًا ؛ الكل متعب بالفعل. لكننا نحصل على بعض أكثر أو أقل نتيجة عملية. على سبيل المثال ، نقيس بأقصى سرعة يمكننا نقل البيانات إلى FPGA عبر رقاقة FT2232H. ليس البروتوكول أسهل ، لذلك لن ننقله على كلا الجانبين ، ولكننا نقصر أنفسنا على الإرسال منا إلى القناة ، على الطرف الآخر المثبت عليه FPGA. ستساعدنا الوثيقة AN_130 FT2232H المستخدمة في وضع FIFO المتزامن للنمط FT245 في تحقيق ذلك ، حيث يتم تشغيل وحدة التحكم في هذا المجمع على وجه التحديد في هذا الوضع (FIFO متزامن). تحتوي هذه الوثيقة أيضًا على وصف للاستنتاجات ، بالشكل الذي تُستخدم به في هذا الوضع ، ومخططات التوقيت ، وحتى أمثلة التعليمات البرمجية ، والتي سنستلهم منها.

هكذا. نريد أن نسجل في FIFO باستخدام وحدة التحكم. ماذا سيأتي منا؟ حاولت ، وأنا أعلم. سوف يستغرق 1 كيلوبايت من البيانات ، وبعد ذلك سوف يتعطل جهاز التحكم. سوف يرفض قبول بيانات إضافية. الشيء هو أن كيلو بايت هو حجم المخزن المؤقت الداخلي الخاص به. بينما يكون ذلك ممكنًا ، سيتم أخذ البيانات من USB وتخزينها في هذه المساحة. ولكن بالنسبة لهم للذهاب إلى القناة المتزامنة ، يجب عليه أن يعلم عن الاستعداد لاستقبالهم. نحن ننظر إلى البديل المؤقت.



هكذا. عندما تحتوي وحدة التحكم على أي بيانات في FIFO ، فإنها تسقط إشارة RXF. استجابة لهذا ، يجب أولاً إسقاط إشارة OE والاحتفاظ بها عند الصفر لمدة ساعة واحدة على الأقل (هذا يتبع أكثر من الوصف إلى المخطط أكثر من المخطط نفسه). سنحصل على بيانات على الحافلة ، يجب أن نؤكد استقبالهم بمستوى إشارة RD منخفض. وهكذا - للإطار كله. عندما ترفع وحدة التحكم خط RXF ، يجب علينا إزالة OE و RD. لن نستخدم البيانات اليوم. لقياس السرعة ، ما عليك سوى محاكاة تلقي البيانات على FPGA من FT2232H. حسنا اذن لمثل هذه العملية البسيطة ، ليس هناك حاجة إلى نظام المعالج. يكفي صنع إنسان آلي متدهور ، سيستغرق تطويره وقتًا أقل بكثير من مجرد التدليل مع إعداد المعالج والبرنامج. لذلك ، نقوم بإنشاء مشروع يحتوي على ملف SystemVerilog واحد فقط بالمحتويات التالية:

 module JustRead( input logic clk, input logic rxf_n, output logic oe_n, output logic rd_n ); enum {IDLE,TRANSFER} state = IDLE; always @ (posedge clk) begin oe_n <= 1; rd_n <= 1; case (state) IDLE: begin if (rxf_n == 0) begin oe_n <= 0; state <= TRANSFER; end end TRANSFER: begin if (rxf_n == 0) begin oe_n <= 0; rd_n <= 0; end else begin state <= IDLE; end end endcase end endmodule 

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

 module JustReadTB( output logic clk, output logic rxf_n, input logic oe_n, input logic rd_n ); JustRead dut ( .clk, .rxf_n, .oe_n, .rd_n ); always begin clk = 1; #16; clk = 0; #16; end initial begin rxf_n = 1; #120; rxf_n = 0; #120; rxf_n = 1; end endmodule 

الوقت الذي استغرقته هو الأول المتاح ، وهو تسلسل التبديل الذي يعلق على إشارة الساعة هو المهم. نحصل على مخطط التوقيت التالي:



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

لا يتسبب تعيين أرجل FPGA في هذا المشروع أيضًا في صعوبات حتى بالنسبة للتحرير من خلال الجدول (سيستغرق نقل المهام من ملف * .QSF وقتًا أطول ، وأؤكد باستمرار أنه عند تطوير أنظمة ليوم واحد لـ Redd ، يكون توفير الوقت أمرًا ذا أولوية).



نجمعها ونملأها ، قبل إيقاف تشغيل طاقة المجمع ، يمكنك العمل مع البرنامج ، ولن يتوقف التشغيل بعد تجاوز سعة المخزن المؤقت.

في البرنامج ، قمت بعمل وظيفتين. أول عمليات البحث ويفتح الجهاز. أخذت شيئًا من الاختبار الأخير ، واستعيرت شيئًا من AN130 :

 FT_HANDLE OpenFT2232H() { FT_HANDLE ftHandle0; static FT_DEVICE ftDevice; //      int nDevice = 0; while (true) { //     if (FT_Open(nDevice, &ftHandle0) != FT_OK) { //  ,      return 0; } //     ? if (FT_GetDeviceInfo(ftHandle0, &ftDevice, NULL, NULL, NULL, NULL) == FT_OK) { // ,    if (ftDevice == FT_DEVICE_2232H) { // ,     AN130 FT_SetBitMode(ftHandle0, 0xff, 0x00); usleep(1000000); //Sync FIFO mode FT_SetBitMode(ftHandle0, 0xff, 0x40); FT_SetLatencyTimer(ftHandle0, 2); FT_SetUSBParameters(ftHandle0, maxBlockSize, maxBlockSize); return ftHandle0; } } //    FT_Close(ftHandle0); //    nDevice += 1; } } 

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

 const int maxBlockSize = 0x100000; uint8_t buf[maxBlockSize]; … //   BlockSize ,  1 double TestSpeed(FT_HANDLE ftHandle0,int totalSize, int blockSize) { if (blockSize > maxBlockSize) { return -1; } DWORD dwWrittenTotal = 0; timespec before; clock_gettime(CLOCK_REALTIME, &before); for (int i = 0; i < totalSize; i += blockSize) { DWORD dwWritten; FT_Write(ftHandle0, buf, blockSize, &dwWritten); //     dwWrittenTotal += dwWritten; } timespec after; clock_gettime(CLOCK_REALTIME, &after); if (dwWrittenTotal < (DWORD)totalSize) { return -2; } //     uint64_t nsBefore = before.tv_nsec; uint64_t nsAfter = after.tv_nsec; //      nsAfter += (after.tv_sec - before.tv_sec) * 1000000000; //   nsAfter -= nsBefore; //      double res = ((double)nsAfter)/((double)1000000000); //   -    return ((double)dwWrittenTotal) / res; } 

حسنًا ، تم تشغيل التعليمات البرمجية التي تؤدي الوظائف الأساسية كما يلي:

 int main(int argc, char* argv[]) { FT_HANDLE ftHandle0 = OpenFT2232H(); if (ftHandle0 == 0) { printf("Cannot open device\n"); return -1; } const int totalSize = 0x100000; static const int blockSizes[] = { 0x10,0x20,0x40,0x80,0x100,0x200,0x400,0x800,0x1000,0x2000, 0x4000,0x8000,0x10000,0x20000,0x40000,0x80000,0 }; for (int i = 0; blockSizes[i] != 0; i++) { double speed = TestSpeed(ftHandle0, totalSize, blockSizes[i]); printf("%d,%d\n", blockSizes[i], (int)(speed/1000.)); int stop = 0; } // ,    FT_Close(ftHandle0); return 0; } 

أعلم أنه في USB ، تعتمد السرعة بشدة على حجم الكتلة التي يتم إرسالها ، لذلك أتحقق من السرعة لمعرفة الخيارات المختلفة. لا حاجة لتعداد خطي. لقد وضعت للتو قائمة بأحجام نموذجية. أنا إخراج البيانات بالكيلو بايت في الثانية الواحدة. البايتات غير مريحة للعينين ، للميغابايت دقة منخفضة مع حجم كتلة صغير. الكيلوبايت في الثانية الواحدة هو حل وسط معقول. نحصل على النتائج التالية:
 16,59 32,110 64,237 128,490 256,932 512,1974 1024,3760 2048,5594 4096,10729 8192,16109 16384,20170 32768,24248 65536,26664 131072,28583 262144,29370 524288,29832 

نقوم بحفظها في ملف * .csv ، ونحمّلها في Excel ، ونبني رسمًا بيانيًا للسرعة مقابل حجم الكتلة.



الحد الأقصى هو 30 ميغابايت في الثانية. إلى حد أقصى نظري من 52 ميغا بايت / ثانية الآن. ربما يمكنك التعجيل بطريقة ما ، لكن اترك الأمر للقراء في شكل عمل عملي. الشيء الرئيسي هو أننا أتقننا جميع خطوات العمل مع القناة ونحن على استعداد لتوصيل FPGA بالمعالج المركزي بنظام واحد.

أثناء تجميع المقالة ، تم العثور على المستند AN_165 ، والذي قال إن الحد الأقصى للسرعة في وضع FIFO المتزامن كان 35 ميجابايت / ثانية. وهذا هو ، مساحة للنمو - ما يصل إلى حجم معين. لكنها لا تزال هناك.

استنتاج


تعرفنا على استراتيجيتين لتطوير وتصحيح رمز البرنامج الذي تم تنفيذه على المعالج المركزي لمجمع Redd (باستخدام أدوات Microsoft Visual Studio وعلى جهاز افتراضي مع Linux OS). لقد اكتسبنا أيضًا مهارات عملية في العمل مع القناة التي يتواصل من خلالها المعالج المركزي للمجمع مع FPGA.

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

, «» , USB, .

Source: https://habr.com/ru/post/ar456008/


All Articles