العمل مع بطاقة SD عبر واجهة SPI. تنفيذ VHDL

مرحباً هبر! بمجرد العمل ، حصلت على مهمة تقييم إمكانية تنفيذ تخزين البيانات على بطاقة SD عند توصيلها بـ FPGA. تم افتراض استخدام SPI كواجهة تفاعل ، لأنه أسهل في التنفيذ. أود أن أشارك الخبرة المكتسبة.



نظرًا لأن المساحة الموجودة على لوحة الدوائر المطبوعة محدودة دائمًا ، فسيتم النظر في بطاقات SD على سبيل المثال في البطاقات في عامل شكل microSD.

المحتوى


1. مواصفات القراءة
1.1 معلومات عامة
1.2 التهيئة
1.3 مسح المعلومات
1.4 معلومات القراءة
1.4.1 قراءة كتلة بيانات واحدة
1.4.2 قراءة العديد من كتل البيانات
1.5 معلومات
الكتابة 1.5.1 كتابة كتلة بيانات واحدة
1.5.2 كتابة العديد من كتل البيانات
2. تنفيذ الخوارزمية في الأجهزة
2.1 مكون الطبقة المادية
2.2 مكون مستوى الأمر
2.3 مكون الاتصال بالعالم الخارجي
3. التحقق في الأجهزة
4. النتائج

1. مواصفات القراءة


1.1 عام


تخبرنا القراءة السريعة للمواصفات عن خيارات بطاقة SD التالية:

  • يتم نقل البيانات إلى بطاقة SD على خط واحد ؛
  • يتم قراءة البيانات من بطاقة SD على سطر واحد ؛
  • في وضع SPI ، يمكن أن تكون الطاقة + 3.3V فقط ؛
  • تردد الساعة في وضع التهيئة في نطاق 100-400 كيلو هرتز ؛
  • تردد الساعة بعد التهيئة - 25 ميجاهرتز.

وهذا يعني على الفور النقطة في عرض النطاق الترددي الذروة النظري: 25 ميجاهرتز * 1 بت = 25 ميجابت / ثانية ، وهو صغير إلى حد ما . الثاني ناقص استخدام بطاقات SD ، الطاقة + 3.3V. على لوحة الدوائر المطبوعة التي تم التخطيط لها لتثبيت بطاقة SD ، لا يوجد مثل هذا الجهد.

يمكن تقسيم بطاقات عامل MicroSD إلى 3 فئات حسب السعة:

  • SDSC سعة البطاقة حتى 2 جيجا بايت شاملة. العنوان داخل البطاقة بايت.
  • SDHC. سعة البطاقة أكثر من 2 جيجا بايت وتصل إلى 32 جيجا بايت شاملة. يشير العنوان الموجود داخل البطاقة إلى كتلة 512 بايت.
  • SDXC. تبلغ سعة البطاقة أكثر من 32 جيجا بايت وتصل إلى 128 تيرابايت. يشير العنوان الموجود داخل البطاقة إلى كتلة 512 بايت.

يظهر الشكل العام للخريطة في الشكل أدناه.


رقم الاتصالاسمنوعوصف
1RSV-غير مستعمل
2CSإدخالاختيار رقاقة
3DIإدخالخط البيانات من الجهاز الرئيسي (MOSI)
4Vddالتغذيةمصدر التيار
5SCLKإدخالإشارة الساعة
6Vssالتغذيةأرض
7فعلانتاج |خط البيانات إلى الجهاز الرئيسي (MISO)
8RSV-غير مستعمل

يتم التوصيل وفقًا للرسم البياني أدناه:


يجب أن يكون تصنيف المقاوم 50 كيلو أوم ،

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

يبلغ حجم الأوامر المرسلة عبر واجهة SPI 48 بت. تنسيق الأمر:

  • تحتوي البتة 47 (أقصى اليسار) دائمًا على القيمة 0.
  • تحتوي البتة 46 دائمًا على القيمة 1.
  • تحتوي البتات 45..40 على فهرس الأوامر.
  • تحتوي البتات 39..8 على وسيطات الأمر.
  • تحتوي البتات 7..1 على CRC من البتات السابقة.
  • يحتوي البت 0 دائمًا على القيمة 1.

يمنح البتان 47 و 46 البطاقة القدرة على تتبع بداية المعاملة بشكل لا لبس فيه ، لأن حافلة MOSI في حالة الراحة تساوي واحدة.



ستتلقى الأوامر المستخدمة عند العمل مع بطاقة SD إجابات مثل R1 و R3 و R7.


إجابة من نوع R1 ، حجم 8 بت. نوع الإجابة R3 ، الحجم 40 بت. نوع الإجابة R7 ، حجم 40 بت. جميع الأوامر وإجاباتها مفصلة في المواصفات المادية للطبقة المبسطة.









1.2 التهيئة


خوارزمية التهيئة:

  1. بعد تشغيل الطاقة ، انتظر 1 مللي ثانية على الأقل.
  2. توليد ما لا يقل عن 74 ساعة تبديل للبطاقة. يجب أن تكون خطوط CS و MOSI في حالة الوحدة المنطقية.
  3. إنشاء أمر CMD0. يقوم الأمر CMD0 بإعادة تعيين بطاقة SD.
  4. CMD0. R1. , R1 16 , 3. R1 , 0x01 ( ), 3, 5.
  5. CMD8. .
  6. CMD8. R7. , , , 7, , , 17, 13.
  7. CMD55. CMD55 , .
  8. CMD55. R1. 0x01 ( ), 7, 9.
  9. ACMD41. ACMD41 , SDSC ( 0x00000000) .
  10. ACMD41. R1. , , 11. , 0x00 ( ) 14, 7.
  11. CMD1. CMD1 ACMD41.
  12. CMD1. R1. , , 13, , 0x00 ( ), 14, 11.
  13. . , . .
  14. CMD16. , 512 .
  15. CMD16. R1. , 0x00 ( ) 16, 13.
  16. . . .
  17. CMD55. CMD55 , .
  18. CMD55. R1. 0x01 ( ), 17, 19.
  19. ACMD41. ACMD41. ACMD41 , SDHC ( 0x40000000) .
  20. ACMD41. R1. , , 13. , 0x00 ( ) 21, 17.
  21. CMD58. .
  22. في انتظار رد على أمر CMD58. الإجابة هي نوع الاستجابة R3. إذا تم تعيين بت في الرد بأن البطاقة تعمل مع عناوين كتلة 512 بايت ، فانتقل إلى الخطوة 16 ، وإلا إلى الخطوة 14.

بعد اكتمال التهيئة ، يمكن تشغيل البطاقة في كتل 512 بايت بتردد ساعة 25 ميجاهرتز. هذه هي النسخة الكاملة من خوارزمية التهيئة ، والتي تغطي جميع أنواع البطاقات. في حالتي ، عند استخدام بطاقة 16 جيجا بايت ، تتكون خوارزمية التهيئة من الخطوات 1-6 ، 17-22 ، 16.

خوارزمية الجرافيك

1.3 مسح المعلومات


تدعم بطاقات عامل الشكل Micro SD أوامر المسح. بعد أمر المسح ، سيتم ملء قيمة عناوين المسح المحددة بالقيمة 0xFF أو 0x00 ، اعتمادًا على البطاقة.

خوارزمية محو المعلومات

  1. CMD32. .
  2. CMD32. R1. 0x00 ( - ), 3, 4.
  3. . , .
  4. CMD33. . , CMD32.
  5. CMD33. R1. 0x00 ( - ), 3, 6
  6. إرسال أمر CMD38. الأمر الخاص بمسح المعلومات من الكتل المحددة. يجب إرسال أي 4 بايت كوسيطة ، باستثناء القيم 0x00000001 ، 0x00000002.
  7. في انتظار رد على أمر CMD38. الجواب هو استجابة من النوع R1b. هذه نسخة موسعة من الإجابة عندما تولد البطاقة استجابة R1 ، ثم ترسم خط MISO إلى الصفر ، مما يشير إلى أن الشريحة مشغولة. من الضروري الانتظار حتى تظهر قيمة الوحدة على خط MISO. إذا لم تكن الإجابة 0x00 (حدث خطأ أثناء تنفيذ الأمر) ، فانتقل إلى الخطوة 3 ، وإلا إلى الخطوة 8
  8. استكمال خوارزمية المحو.

خوارزمية الجرافيك

1.4 معلومات القراءة


يمكن قراءة المعلومات من بطاقة SD عبر SPI بطريقتين.

1.4.1 قراءة كتلة بيانات واحدة


عند قراءة كتلة بيانات واحدة ، ينشئ الجهاز الرئيسي أمرًا لبطاقة SD لقراءة كتلة بيانات واحدة ، وينتظر ردًا على أن الأمر قد تمت معالجته وينتظر حزمة تحتوي على بيانات من البطاقة. بعد استلام حزمة تحتوي على بيانات من البطاقة ، تنتهي معاملة القراءة.


نظرة عامة على عملية قراءة كتلة واحدة من البيانات.

في البداية ، تم تنفيذ مثل هذا الخيار ، ولكن السرعة الناتجة كانت منزعجة للغاية (ستكون مقارنات السرعة أقل).

1.4.2 قراءة كتل بيانات متعددة


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


نظرة عامة على معاملة قراءة العديد من كتل البيانات.


بنية حزمة البيانات

حيث:

  • رمز البيانات يستخدم الأمر read القيمة 0xFE.
  • كتلة البيانات. يحتوي على بيانات مقروءة من البطاقة.
  • اتفاقية حقوق الطفل تحتوي على المجموع الاختباري من الحقول السابقة.

إذا حدث خطأ أثناء القراءة ، فإن البطاقة بدلاً من Data Token تُرجع رمز Error. حجم رمز الخطأ هو 1 بايت. تحتوي البتات 7..5 على قيمة صفر ، بتات 4..0 ترميز نوع الخطأ.

خوارزمية لقراءة كتل البيانات المتعددة:

  1. إرسال أمر CMD18. يخبر الأمر البطاقة أنه سيتم قراءة كتل متعددة.
  2. في انتظار رد على أمر CMD18. الجواب هو استجابة من نوع R1. إذا لم تكن الإجابة 0x00 (حدث خطأ أثناء تنفيذ الأمر) ، فانتقل إلى الخطوة 3 ، وإلا إلى الخطوة 4.
  3. حالة الخطأ. فشلت القراءة ، فخرجت من خوارزمية القراءة.
  4. في انتظار رمز مميز من البطاقة. إذا تم استلام رمز خطأ من البطاقة ، فانتقل إلى الخطوة 3 ، أو انتقل إلى الخطوة 5.
  5. تلقي من حجم بطاقة كتلة بيانات 512 بايت.
  6. استقبال من حجم حقل CRC للبطاقة 2 بايت.
  7. . , 8, 4.
  8. CMD12. . , Data Packet, .
  9. CMD12. R1b. R1, MISO , . MISO , . 0x00 ( - ), 3, 10.
  10. .

هناك فارق بسيط طفيف في خوارزمية القراءة. يجب تعيين إشارة تحديد الشريحة (CS) على المنطق صفر قبل إنشاء الأمر CMD18 وتعيينها إلى المنطق بعد تلقي استجابة للأمر CMD12.

خوارزمية الجرافيك

1.5 معلومات التسجيل


يمكن كتابة المعلومات إلى بطاقة SD عبر واجهة SPI في نسختين.

1.5.1 كتابة كتلة بيانات واحدة


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


نظرة عامة على معاملة الكتابة لكتلة بيانات واحدة.

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

1.5.2 كتابة كتل بيانات متعددة


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


نظرة عامة على معاملة الكتابة لعدة كتل بيانات.

تشبه بنية رزمة البيانات بنية رزمة البيانات عند قراءة البيانات.

شكل:

  • رمز البيانات بالنسبة للأمر write ، يتم استخدام القيمة 0xFC.
  • كتلة البيانات. يحتوي على بيانات مكتوبة على البطاقة.
  • اتفاقية حقوق الطفل تحتوي على المجموع الاختباري من الحقول السابقة.

حجم Stop Tran Token المستخدم لإكمال أمر الكتابة هو 1 بايت في الحجم ويساوي 0xFD.

بعد دفع الجزء الأخير من Data Packet في البطاقة ، تستجيب البطاقة للساعة التالية بحالة سجل البيانات - Data Response. يبلغ حجم استجابة البيانات 1 بايت ، ويمكن أن تكون البتات 7..5 أيًا ، والبت 4 دائمًا صفر ، والبت 0 دائمًا يساوي واحدًا ، والبتات 3..1 ترميز حالة سجل البيانات. بعد إعادة البطاقة Data Packet ، تقوم البطاقة بسحب خط MISO إلى الصفر ، مما يشير إلى أن البطاقة مشغولة. بعد أن يكون مستوى الوحدة المنطقية على خط MISO ، يمكنك نقل حزمة البيانات التالية إلى البطاقة.

خوارزمية تسجيل كتل البيانات المتعددة:

  • إرسال أمر CMD25. يخبر الأمر البطاقة أنه ستتم كتابة كتل متعددة.
  • CMD25. R1. 0x00 ( - ), 3, 4.
  • . , .
  • .
  • 512 .
  • CRC 2 .
  • Data Response . , 3, 8.
  • . , 9, 4.
  • Stop Tran Token. , .
  • في انتظار رد من البطاقة. توجه البطاقة على Stop Tran Token خط MISO إلى الصفر ، مما يشير إلى أن البطاقة مشغولة. من الضروري الانتظار على سطر MISO لقيمة الوحدة ، والتي ستشير إلى نهاية الأمر
  • الانتهاء من خوارزمية التسجيل.

هناك أيضًا فارق بسيط في خوارزمية التسجيل. يجب تعيين إشارة تحديد الشريحة (CS) على المنطق صفر قبل إنشاء الأمر CMD25 وتعيينها إلى المنطق بعد تلقي استجابة إلى Stop Tran Token

خوارزمية الجرافيك

2. تنفيذ الخوارزمية في الأجهزة


نتيجة لقراءة المواصفات ، نحصل على بعض خصائص الخوارزمية التي يجب تنفيذها في الأجهزة.

أوضاع التشغيل الممكنة:

  • تشكيل التردد الأولي. يجب أن تكون خطوط CS و MOSI في حالة الوحدة المنطقية.
  • نقل البيانات إلى بطاقة SD.
  • استقبال البيانات من بطاقة SD.
  • في انتظار الانتهاء من الفريق. يتم استخدامه عندما تقوم بطاقة SD ، بعد إنشاء استجابة ، برسم خط MISO إلى الصفر من أجل انتظار ظهور الوحدة.
  • اقرأ الرد عند كتابة البيانات.
  • في انتظار رمز مميز أثناء قراءة البيانات.

أوضاع الساعة الممكنة:

  • إشارة الساعة لتهيئة.
  • إشارة الساعة للعمل.

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

  • مكون الطبقة المادية ، التي ترتبط مباشرة ببطاقة SD ، يولد إشارات SCLK و CS و DI ويقرأ مع DO.
  • مكون على مستوى الأمر يعد كل البيانات لمكون في الطبقة المادية.
  • مكون للتواصل مع العالم الخارجي يخفي الجهاز الداخلي بالكامل ويوفر واجهة للأوامر (القراءة والكتابة والمحو) والبيانات.

2.1 مكون الطبقة المادية


entity SDPhy is
	generic	(	gTCQ		: time := 2 ns );
	port	(	-- Control bus
			iPhyTxData	: in	std_logic_vector( 9 downto 0);
			iPhyMode	: in	std_logic_vector( 4 downto 0);
			iPhyTxWrite	: in	std_logic;
			oPhyTxReady	: out	std_logic; 
			-- Out Data
			oPhyRxData	: out	std_logic_vector( 7 downto 0); 
			oPhyRxWrite	: out	std_logic;
			oPhyCmdEnd	: out	std_logic;
			-- Spi
			oSdCS		: out	std_logic;
			oSdClk		: out	std_logic;
			oSdMosi		: out	std_logic;
			oSdMosiT	: out	std_logic;
			iSdMiso		: in	std_logic;
			-- system
			sclk		: in	std_logic;
			pclk		: in	std_logic;
			rst		: in	std_logic ); 
end SDPhy;

أين:

  • iPhyTxData , iPhyMode , .
  • iPhyTxWrite , iPhyTxData iPhyMode .
  • oPhyTxReady , . FULL FIFO, .
  • oPhyRxData , SD-.
  • oPhyRxWrite , oPhyRxData .
  • oPhyCmdEnd , .
  • oSdCS (CS) SD-.
  • oSdClk SD-.
  • oSdMosi SD-.
  • oSdMosiT SD-.
  • iSdMiso SD-.
  • sclk SD- (50 ).
  • pclk , .
  • إعادة تعيين إشارة ، المستوى النشط الأول.

في FPGAs ، هناك وحدات خاصة للعمل مع إشارة ساعة (PLL ، MMCM) ، ومع ذلك ، فإن تلقي إشارة ساعة أقل من 5 ميجا هرتز من خرجها يمثل مشكلة. ونتيجة لذلك ، تعمل الطبقة المادية بتردد 50 ميجا هرتز. جنبًا إلى جنب مع كل بيانات في إشارة iPhyMode ، يتم تلقي القليل الذي يشير إلى أي تردد يجب نقل هذه البيانات إلى بطاقة SD (أو استلامها منها). اعتمادًا على بت السرعة ، يتم إنشاء إشارات تمكين الساعة.

يتم تنفيذ آليتين في مكون الطبقة المادية ، لنقل البيانات إلى بطاقة SD وتلقي البيانات منها.

رمز الجهاز لنقل البيانات: جيثب .

  • توفر حالة SDummy تشكيل التردد الأولي ، 128 التبديل.
  • توفر حالة STxBits نقل البيانات إلى بطاقة SD.

رمز الجهاز لاستقبال البيانات: جيثب .

  • توفر حالة sRxBits استقبال البيانات من بطاقة SD.
  • تضمن حالة sBusy أن تكون بطاقة SD جاهزة (تقوم البطاقة بتحرير خط MISO إلى مستوى الوحدة).
  • تطبق حالة sResp قراءة الاستجابة عند كتابة البيانات.
  • تنفذ حالة sToken انتظارًا مميزًا أثناء قراءة البيانات.

2.2 مكون على مستوى القيادة


entity SdCommand is
	generic	(	gTCQ		: time := 2 ns );
	port	(	-- Command from host
			oSdInitComp	: out	std_logic;
			oSdInitFail	: out	std_logic;
			iSdAddress	: in	std_logic_vector(31 downto 0);
			iSdStartErase	: in	std_logic;
			iSdStartRead	: in	std_logic;
			iSdStartWrite	: in	std_logic;
			oSdCmdFinish	: out	std_logic_vector( 1 downto 0);
			oSdhcPresent	: out	std_logic;
			-- Data
			oSdReadData	: out	std_logic;
			iSdDataR	: in	std_logic_vector(31 downto 0);
			oSdWriteData	: out	std_logic;
			oSdDataW	: out	std_logic_vector(32 downto 0);
			-- Spi
			oSdCS		: out	std_logic;
			oSdClk		: out	std_logic;
			oSdMosi		: out	std_logic;
			oSdMosiT	: out	std_logic;
			iSdMiso		: in	std_logic;
			-- system
			pclk		: in	std_logic;
			sclk		: in	std_logic;
			rst		: in	std_logic );

أين:

  • oSdInitComp تسجيل الانتهاء من تهيئة بطاقة SD.
  • علامة oSdInitFail من فشل التهيئة.
  • عنوان iSdAddress في بطاقة SD لتنفيذ الأمر.
  • بدء iSdStartErase محو تنفيذ الأمر.
  • بدء iSdStartRead قراءة تنفيذ الأمر.
  • iSdStartWrite بدء تنفيذ أمر الكتابة.
  • حالة إكمال فريق oSdCmdFinish. بت صفر يساوي واحد ، اكتمل الأمر بنجاح. البت الأول هو واحد ، اكتمل الأمر بخطأ.
  • oSdhcPresent علامة الكشف عن بطاقة SDHC / SDXC.
  • oSdReadData قراءة البيانات للكتابة على بطاقة SD.
  • بيانات iSdDataR للكتابة على بطاقة SD.
  • علامة oSdWriteData لكتابة البيانات المقروءة من بطاقة SD.
  • قراءة بيانات oSdDataW من بطاقة SD.

تتزامن الإشارات المتبقية مع إشارات الطبقة المادية.

يحتوي المكون على 5 آلات أوتوماتيكية.

  • smSdInit ( github ) - تهيئة بطاقة SD.
  • ؛ smSdErase ( github ) - محو البيانات من بطاقة SD.
  • smSdRead ( github ) - قراءة البيانات من بطاقة SD.
  • ؛ smSdWrite ( github ) - كتابة البيانات على بطاقة SD.
  • smSdCommand ( github ) - على أساس الميزات التي تم إنشاؤها تعد البيانات للطبقة المادية من جميع الأجهزة السابقة.

2.3 مكون التواصل مع العالم الخارجي


entity SdHost is
	generic	(	gTCQ		: time := 2 ns );
	port	(	-- Sd Host command
			iSdCommand	: in	std_logic_vector( 2 downto 0);
			iSdAddress	: in	std_logic_vector(31 downto 0);
			iSdStart	: in	std_logic;
			oSdStatus	: out	std_logic_vector( 1 downto 0);
			oSdInitFail	: out	std_logic;
			-- Write data to card
			iSdTxData	: in	std_logic_vector(31 downto 0);
			iSdTxValid	: in	std_logic;
			iSdTxLast	: in	std_logic;
			oSdTxReady	: out	std_logic;
			-- Read data from card
			oSdRxData	: out	std_logic_vector(31 downto 0);
			oSdRxValid	: out	std_logic;
			oSdRxLast	: out	std_logic;
			iSdRxReady	: in	std_logic;
			-- Spi
			oSdCS		: out	std_logic;
			oSdClk		: out	std_logic;
			oSdMosi		: out	std_logic;
			oSdMosiT	: out	std_logic;
			iSdMiso		: in	std_logic;
			-- system
			pclk		: in	std_logic;
			sclk		: in	std_logic;
			rst		: in	std_logic );

أين:

  • رمز الأمر iSdCommand للتنفيذ.
  • iSdAddress هو عنوان تنفيذ الأمر.
  • بدء تنفيذ الأمر iSdStart.
  • حالة استكمال فريق oSdStatus. بت صفر يساوي واحد - اكتمال الأمر. البت الأول هو واحد - اكتمل الأمر بخطأ.
  • علامة oSdInitFail من فشل التهيئة.
  • iSdTxData. واجهة Axi-Stream لكتابة البيانات على بطاقة SD. منفذ مع البيانات.
  • iSdTxValid. واجهة Axi-Stream لكتابة البيانات على بطاقة SD. منفذ بإشارة كتابة.
  • iSdTxLast. واجهة Axi-Stream لكتابة البيانات على بطاقة SD. ميناء مع علامة dw الأخير في البيانات.
  • oSdTxReady. واجهة Axi-Stream لكتابة البيانات على بطاقة SD. منفذ مع علامة الاستعداد لتلقي البيانات.
  • oSdRxData. واجهة Axi-Stream لقراءة البيانات من بطاقة SD. منفذ مع البيانات.
  • oSdRxValid. واجهة Axi-Stream لقراءة البيانات من بطاقة SD. منفذ بإشارة كتابة.
  • oSdRxLast. واجهة Axi-Stream لقراءة البيانات من بطاقة SD. ميناء مع علامة dw الأخير في البيانات.
  • iSdRxReady. واجهة Axi-Stream لقراءة البيانات من بطاقة SD. منفذ مع علامة الاستعداد لتلقي البيانات.

تتزامن الإشارات المتبقية مع إشارات الطبقة المادية.

ينفذ المكون جهاز smSdControl ( جيثب ) واحد.

  • الدولة المنفردة. في انتظار التهيئة والأمر لإكمال.
  • حالة sWaitCmd. التحقق من نوع الأمر.
  • sReadCmd. FIFO, , SD- .
  • sWriteCmd. , FIFO SD-, .
  • sEraseCmd. .
  • sWaitEnd. .
  • sFinish. , .

3.


تمت كتابة الخوارزمية والتحقق منها في المحاكي. من الضروري فحص الحديد الآن. من ما كان متاحًا ، ظهرت لوحة Zybo من Digilent ، وتحتوي على محطات FPGA مجانية في بنك بجهد + 3.3 فولت ، يمكنك بسهولة توصيل جهاز خارجي. نعم ، ونوع FPGA المستخدم هو Zynq-7000 ، مما يعني وجود نواة للمعالج. يمكنك كتابة اختبار في لغة C ، مما يبسط مهمة الاختبار. لذا ، نقوم بتوصيل الخوارزمية التي تم تنفيذها بنواة المعالج عبر منفذ GP (يمكن تشغيل 4 بايت ، على غرار PIO ). لن ننزعج من الانقطاعات ؛ ننفذ استطلاع مؤقت. عند العمل على وحدة المعالج ، ستكون خوارزمية تسجيل البيانات كما يلي:









  • ضع العنوان في بطاقة SD.
  • تعيين رمز الأمر 2.
  • كتابة البيانات في المخزن المؤقت الموجود في منطق برمجة.
  • قم بتشغيل الأمر.
  • انتظر حتى يكتمل الأمر.
  • إعادة تعيين حالة إكمال الفريق.

الاختبار المنفذ:

for (SectorAddress = 0; SectorAddress < 1048576; SectorAddress ++)
{
	if ((SectorAddress % 1024) == 0)
	{
		xil_printf("Data write to %d sector \n\r", SectorAddress);
	}

	/** Set address */
	Xil_Out32(0x43c00008, SectorAddress);

	/** Set command */
	Xil_Out32(0x43c00004, 2);

	/** Write data to PL */
	for (int32_t i = 0; i < 1024; i++)
	{
		Xil_Out32(0x43c00014, cntrData);
		cntrData++;
	}

	/** Start */
	Xil_Out32(0x43c00000, 1);

	/** Wait end of operation */
	for (;;)
	{
		status = Xil_In32(0x43c0000c);
		if (status == 0x01 || status == 0x03)
		{
			if (status == 0x03)
			{
				xil_printf("Error in write \n\r");
			}
			break;
		}
		else
		{
			cntrDuration++;
			usleep(100);
		}
	}

	/** Duration operation */
	durationWrite += cntrDuration;

	if (cntrDuration > MaxWrite )
	{
		MaxWrite = cntrDuration;
	}

	cntrDuration = 0x00;

	/** Clear start */
	Xil_Out32(0x43c00000, 0);

	SectorAddress += 7;
}

إلى السؤال حول سبب استخدام الحد الخارجي من 1024 في الحلقة.تعين الخوارزمية عدد الكتل يساوي 8. حجم كتلة واحدة هو 512 بايت. الحجم الكلي لـ 8 كتل بيانات هو 8 * 512 بايت = 4096 بايت. حجم الحافلة بين وحدة المعالج والمنطق القابل للبرمجة هو 4 بايت. اتضح أنه لإرسال 4096 بايت من 4 بايت من وحدة المعالج إلى المنطق القابل للبرمجة ، من الضروري إجراء عمليات كتابة 4096/4 = 1024.

عند العمل على وحدة المعالج ، ستكون خوارزمية قراءة البيانات كما يلي:

  • ضع العنوان في بطاقة SD.
  • تعيين رمز الأمر 1.
  • قم بتشغيل الأمر.
  • انتظر حتى يكتمل الأمر.
  • إعادة تعيين حالة إكمال الفريق.
  • قراءة البيانات من المخزن المؤقت في منطق برمجة.

الاختبار المنفذ:

for (SectorAddress = 0; SectorAddress < 1048576; SectorAddress++)
{
	if ((SectorAddress % 1024) == 0)
	{
		xil_printf("Data read from %d sector \n\r", SectorAddress);
	}

	/** Set address */
	Xil_Out32(0x43c00008, SectorAddress);

	/** Set command */
	Xil_Out32(0x43c00004, 1);

	/** Start */
	Xil_Out32(0x43c00000, 1);

	/** Wait end of operation */
	for (;;)
	{
		status = Xil_In32(0x43c0000c);
		if (status == 0x01 || status == 0x03)
		{
			 if (status == 0x03)
			{
				xil_printf("Error in read \n\r");
			}
			break;
		}
		else
		{
			cntrDuration++;
			usleep(100);
		}
	}

	 /** Duration operation */
	 durationRead += cntrDuration;

	 if (cntrDuration > MaxRead )
	 {
		 MaxRead = cntrDuration;
	 }

	cntrDuration = 0x00;

	/** Clear start */
	Xil_Out32(0x43c00000, 0);

	/** Read data from PL */
	for (int32_t i = 0; i < 1024; i++)
	{
		DataR = Xil_In32(0x43c0001c);
		if (DataR != cntrData)
		{
			xil_printf("Data corrupt! \n\r");
		}
		DataR = Xil_In32(0x43c00020);
		cntrData++;
	}

	SectorAddress += 7;
}

عند العمل على وحدة المعالج ، ستكون خوارزمية محو البيانات كما يلي:

  • ضع العنوان في بطاقة SD.
  • تعيين كود الأمر 4.
  • قم بتشغيل الأمر.
  • انتظر حتى يكتمل الأمر.
  • إعادة تعيين حالة إكمال الفريق.

الاختبار المنفذ:

for (SectorAddress = 0; SectorAddress < 1048576; SectorAddress++)
{
	if ((SectorAddress % 1024) == 0)
	{
		xil_printf("Data erase from %d sector \n\r", SectorAddress);
	}

	/** Set address */
	Xil_Out32(0x43c00008, SectorAddress);

	/** Set command */
	Xil_Out32(0x43c00004, 4);

	/** Start */
	Xil_Out32(0x43c00000, 1);

	/** Wait end of operation */
	for (;;)
	{
		status = Xil_In32(0x43c0000c);
		if (status == 0x01 || status == 0x03)
		{
			if (status == 0x03)
			{
				xil_printf("Error in write! \n\r");
			}
			break;
		}
		else
		{
			cntrDuration++;
			usleep(100);
		}
	}

	/** Duration operation */
	durationErase += cntrDuration;

	if (cntrDuration > MaxErase )
	{
		MaxErase = cntrDuration;
	}

	cntrDuration = 0x00;

	/** Clear start */
	Xil_Out32(0x43c00000, 0);

	SectorAddress += 7;
}

اختبار تماما على جيثب.

4. النتائج


كمية البياناتقراءةسجلمحو
كتلة واحدة (512 بايت)4.7 ميجابت في الثانية1.36 ميجابت في الثانية0.58 ميجابت في الثانية
8 كتل (4096 بايت)15.4 ميجابت في الثانية6.38 ميجابت في الثانية4.66 ميجابت في الثانية
16 كتلة (8192 بايت)18.82 ميجابت في الثانية11.26 ميجابت في الثانية9.79 ميجابت في الثانية

تم استخدام بطاقة 16 جيجا بايت. أثناء الاختبار ، تم تسجيل 2 غيغابايت من البيانات ، وتم قراءة 2 غيغابايت من البيانات ، وتم مسح 2 غيغابايت من البيانات.

الاستنتاجات مخيبة للآمال. عند استخدام FPGA ، لا معنى لاستخدام بطاقة SD في وضع SPI ، باستثناء الحالة عندما يكون من الضروري جدًا تخزين كميات كبيرة من البيانات دون تقديم متطلبات السرعة.

All Articles