هذا هو عظم الترقوة لجسر SPI الذي يحول معاملات عظم الترقوة من مضيف إلى معاملات ذاكرة SPI. يمكن استخدامه لرسم خريطة SPI Flash أو Eeprom أو RAM في مساحة العنوان للمعالج. يعمل الجسر بشفافية ، لذلك يتصرف مثل ذاكرة قراءة/كتابة الذاكرة حيث يخفي بروتوكول SPI - على حساب الكمون الإضافي. وبالتالي ، فإن الجسر يدعم التنفيذ في مكانه (XIP) مما يسمح للمعالج بالوصول مباشرة إلى الإرشادات والبيانات الموجودة في ذاكرة SPI.
هذا مشروع "عرضي" آخر لمعالج NEORV32 RISC-V. يمكن إضافة الجسر كوحدة XIP إلى المعالج يومًا ما.
الميزات الرئيسية
تودوس / الأفكار / مساعدة المساعدة
يعتمد الجسر على ملف VHDL واحد rtl/wb_spi_bridge.vhd . الكيان العلوي هو wb_spi_bridge ، والتي يمكن إنشاء مثيل لها مباشرة دون الحاجة إلى أي مكتبات خاصة.
entity wb_spi_bridge is
generic (
SPI_CLK_DIV : positive ; -- clock divider: f(spi_clk_o) = f(clk_i) / 2*SPI_CLK_DIV, min 2
SPI_ABYTES : positive ; -- number of address bytes in SPI protocol, 1..4
SPI_CPHA : std_ulogic ; -- clock phase
SPI_CPOL : std_ulogic ; -- idle polarity
WB_ADDR_BASE : std_ulogic_vector ( 31 downto 0 ); -- module base address, size-aligned
WB_ADDR_SIZE : positive -- module address space in bytes
);
port (
-- wishbone host interface --
wb_clk_i : in std_ulogic ; -- clock
wb_rstn_i : in std_ulogic ; -- reset, async, low-active
wb_srstn_i : in std_ulogic ; -- reset, SYNC, low-active
wb_adr_i : in std_ulogic_vector ( 31 downto 0 ); -- address
wb_dat_i : in std_ulogic_vector ( 31 downto 0 ); -- read data
wb_dat_o : out std_ulogic_vector ( 31 downto 0 ); -- write data
wb_we_i : in std_ulogic ; -- read/write
wb_sel_i : in std_ulogic_vector ( 03 downto 0 ); -- byte enable
wb_stb_i : in std_ulogic ; -- strobe
wb_cyc_i : in std_ulogic ; -- valid cycle
wb_ack_o : out std_ulogic ; -- transfer acknowledge
wb_err_o : out std_ulogic ; -- transfer error
-- SPI device interface --
spi_csn_o : out std_ulogic ; -- chip-select, low-active
spi_clk_o : out std_ulogic ; -- serial clock
spi_data_i : in std_ulogic ; -- device data output
spi_data_o : out std_ulogic -- controller data output
);
end wb_spi_bridge ;الكيان الأعلى يثبت كيانين في الملف :
wb_spi_bridge_link يتعامل مع بروتوكول ذاكرة SPI (اقرأ ، الكتابة ، تمكين الكتابة)wb_spi_bridge_phy يتعامل مع بروتوكول الواجهة المحيطية التسلسلية الفعليةwb_rstn_i ) وواحدة متزامنة ( wb_srstn_i ) ، وكلاهما منخفض النشاط. مطلوب إعادة تعيين غير متزامن لإحضار الجسر إلى حالة محددة. إعادة تعيين متزامن اختياري ويمكن استخدامها لإعادة ضبط الجسر من منطق التطبيق. اربط هذه إعادة تعيين إلى 1 إذا لم يتم استخدامها.
يتم التكوين الخاص بالتطبيق لجسر Wishbone-to-SPI باستخدام الأداء العام للكيان العلوي.
يتم تكوين تردد ساعة SPI باستخدام SPI_CLK_DIV عام. إنه يحدد المقياس الذي ينطبق على مدخلات الساعة clk_i للحصول على ساعة SPI الفعلية. يتم تعريف ساعة SPI بواسطة f_spi = f_main / (2 * SPI_CLK_DIV) . الحد الأدنى للقيمة المسموح بها لمجموع الساعة 2 مما يؤدي إلى سرعة ساعة SPI القصوى البالغة 1/4 من سرعة ساعة الإدخال.
يتم تكوين وضع الساعة الفعلي عبر SPI_CPHA و SPI_CPOL . يتيح الجمع بين هذين الأوليدين تكوين أي من أوضاع ساعة SPI القياسية الأربعة. لمزيد من المعلومات حول أوضاع الساعة ، انظر مقالة SPI Wikipedia.
يتم تكوين حجم العنوان لذاكرة SPI ، التي يتم تعريفها بواسطة سعةها ، بواسطة SPI_ABYTES عام. القيم المسموح بها هي 1 و 2 و 3 و 4. تستخدم معظم spi eeproms حجم عنوان من 16 بت مما يؤدي إلى SPI_ABYTES = 2 . تستخدم العديد من ذكريات فلاش SPI القياسية 24 بت للعنوان الناتج عن SPI_ABYTES = 3 .
يستخدم الجسر ثلاثة أوامر ذاكرة قياسية فقط. إذا كانت أوامر ذاكرة SPI معينة مختلفة ، فيمكنك تكييفها في ملف مصدر VHDL:
-- spi memory opcodes -----------------------------------------------------------
constant cmd_write_c : std_ulogic_vector ( 7 downto 0 ) := x"02" ; -- write data
constant cmd_read_c : std_ulogic_vector ( 7 downto 0 ) := x"03" ; -- read data
constant cmd_wren_c : std_ulogic_vector ( 7 downto 0 ) := x"06" ; -- write enable
-- ------------------------------------------------------------------------------ يتم تعريف العنوان الأساسي 32 بت للجسر بواسطة WB_ADDR_BASE Generic. يتم تكوين حجم مساحة العنوان المحتلة ، والذي يتم تعريفه لسعة ذاكرة SPI ، بواسطة WB_ADDR_SIZE عام. يجب أن يكون حجم مساحة العنوان قوة اثنين ويجب أن يكون العنوان الأساسي محاذاة بشكل طبيعي مع هذا الحجم.
مثال: فلاش SPI مع 64 كيلو بايت (64*1024 بايت):
WB_ADDR_BASE => 0 x"FFFF0000" ,
WB_ADDR_SIZE => 64 * 1024 في هذه الحالة ، سيكون العنوان الأساسي لـ 0xFFFF8000 غير صالح لأنه لا يتماشى بشكل طبيعي مع حدود 64 كيلو بايت.
تعتمد الواجهة المضيفة على مواصفات Wishbone B4. وهو يدعم عمليات نقل الوصول الفردية الكلاسيكية والأنابيب . نقل الانفجار غير مدعوم بعد.
| مثال الوصول إلى الوضع الكلاسيكي | مثال الوصول إلى وضع الأنابيب الوضع |
|---|---|
stb و cyc كلاهما يؤكدان حتى يتم الانتهاء من النقل.cyc حتى يتم الانتهاء من النقل. يتم تأكيد stb فقط لدورة واحدة مباشرة في بداية النقل. | يتم الانتهاء من النقل عند ضبط إشارة الاعتراف ack (نشط لدورة واحدة). هذا يشير إلى إنهاء ناجح. يتم الانتهاء من النقل أيضًا عند err إشارة الخطأ (نشط لدورة واحدة) مما يشير إلى إنهاء خاطئ. لن يرفع الجسر إشارة الخطأ فقط إذا تم تعيين قناع غير قابل للبايت غير مدعوم (انظر أدناه).
يدعم الجسر الوصول 32 بت و 16 بت و 8 بت من الوصول. قراءة الوصول دائما إرجاع كلمة 32 بت كاملة. لاحظ أن الجسر يصل إلى بيانات الذاكرة بالترتيب البايت الصغير . تحدد إشارة قناع sel BYTE كمية البيانات للوصول وفقًا. يتم دعم أقنعة البايت التالية:
sel | ص/ث | كمية البيانات |
|---|---|---|
1111 | يقرأ | كلمة 32 بت كاملة |
1111 | يكتب | كلمة 32 بت كاملة |
1100 | يكتب | أعلى 16 بت نصف كلمة |
0011 | يكتب | أقل من 16 بت نصف كلمة |
0001 | يكتب | بايت 0 |
0010 | يكتب | بايت 1 |
0100 | يكتب | بايت 2 |
1000 | يكتب | البايت 3 |
جميع مجموعة قناع البايت المتبقية سترفع خطأ في النقل (تم تعيين err لدورة واحدة بدلاً من ack ).
يرسل الجسر دائمًا تسلسل أمر كامل إلى ذاكرة SPI لأي نوع من نقل عظم الترقوة (لا يتم دعم الانفجارات بعد). هذا يعني أن رمز OPCODE للذاكرة ، وتتخل العنوان والبيانات الفعلية يتم نقلهم لكل معاملة واحدة. يوضح الجدول التالي عدد البتات التي يجب نقلها عبر SPI لكل نوع من المعاملات. يتطلب كل بت ساعة واحدة من ساعة SPI.
| ص/ث | حجم البيانات | CMD بت | العنوان بت | بت البيانات | مجموع البتات |
|---|---|---|---|---|---|
| يقرأ | كلمة (32 بت) | 8 | 8*SPI_ABYTES | 32 | 8 + 8*SPI_ABYTES + 32 |
| يكتب | كلمة (32 بت) | 8 + 8 | 8*SPI_ABYTES | 32 | 8 + 8 + 8*SPI_ABYTES + 32 |
| يكتب | نصف كلمة (16 بت) | 8 + 8 | 8*SPI_ABYTES | 16 | 8 + 8 + 8*SPI_ABYTES + 16 |
| يكتب | بايت (8 بت) | 8 + 8 | 8*SPI_ABYTES | 8 | 8 + 8 + 8*SPI_ABYTES + 8 |
على سبيل المثال ، يتطلب الوصول إلى الكتابة على مستوى الكلمة إلى فلاش SPI الذي يستخدم العنوان 24 بت 8 + 8 + 8*3 + 32 = 72 SPI Clock Concles. دورة ساعة SPI واحدة تساوي 2 * SPI_CLK_DIV دورات الساعة الرئيسية clk_i .
يتطلب أي نوع من الوصول إلى الكتابة تعيين مزلاج تمكين كتابة الذاكرة ، والذي يتم إرساله لإرسال أمر واحد 8 بت.
توفر المشاريع سيارة TestBench بسيطة sim/wb_spi_bridge_tb.vhd ، والتي يمكن محاكاةها بواسطة GHDL عبر البرنامج النصي:
wb_spi_bridge/sim$ sh ghdl.sh سيتم تشغيل المحاكاة لمدة 1 مللي ثانية باستخدام ساعة 100 ميجا هرتز. خلال هذا الوقت ، يتم تشغيل جميع الوصول إلى عظم الترقوة المدعوم (وأحدهم غير قانوني). لاحظ أن هذا Testbench مخصص لفحص الموجة اليدوي - إنه ليس فحصًا ذاتيًا! يتم تخزين بيانات الشكل الموجي إلى sim/wb_spi_bridge.vcd ، والتي يمكن عرضها باستخدام gtkwave :
wb_spi_bridge/sim$ gtkwave wb_spi_bridge.vcdالجسر هو FPGA- أثبت . تم اختباره عن طريق توصيله مباشرة بمنفذ واجهة عظم الترقوة لمعالج NEORV32 RISC-V (لا يوجد اتصال عظم الترجيح) بتواصل 25LC512 SPI EEPROM.
يوفر أمثلة برنامج NEORV32 برنامج "مستكشف الحافلات" يسمح بأداء وصول عظم الترقوة التعسفي عبر محطة UART. يمكن للجسر التعامل بنجاح مع جميع عمليات القراءة والكتابة. علاوة على ذلك ، يمكن لـ NEORV32 تنفيذ البرامج بنجاح من وحدة SPI.
نتائج رسم الخرائط المثالية للتكوين التالي:
SPI_CLK_DIV => 32 ,
SPI_ABYTES => 2 , -- 16-bit addressing
SPI_CPHA => '0' ,
SPI_CPOL => '0' , -- clock mode 0
WB_ADDR_BASE => x"F0000000" ,
WB_ADDR_SIZE => 64 * 1024 EP4CE22F17C6N @100MHz Hierarchy Logic Cells Logic Registers
----------------------------------------------------------------------------
wb_spi_bridge:wb_spi_bridge_inst 233 (115) 174 (88)
wb_spi_bridge_link:wb_spi_bridge_link_inst 118 (16) 86 (8)
wb_spi_bridge_phy:wb_spi_bridge_phy_inst 102 (102) 78 (78)