Ini adalah Wishbone to SPI Bridge yang mengubah transaksi WishBone dari host menjadi transaksi SPI-memory. Ini dapat digunakan untuk memetakan flash SPI, EEPROM atau RAM ke dalam ruang alamat prosesor. Jembatan beroperasi secara transparan , sehingga berperilaku seperti memori baca/tulis yang dipetakan memori karena menyembunyikan protokol SPI - dengan biaya latensi tambahan. Oleh karena itu, jembatan mendukung Execute-in-Place (XIP) yang memungkinkan prosesor untuk secara langsung mengakses (dan mengeksekusi) instruksi dan data yang terletak di memori SPI.
Ini adalah proyek "spin-off" lain dari prosesor RISC-V NEORV32. Jembatan mungkin ditambahkan sebagai modul XIP ke prosesor suatu hari nanti.
Fitur utama
Todos / Ide / Bantuan-Bantuan
Jembatan didasarkan pada satu file VHDL rtl/wb_spi_bridge.vhd . Entitas teratas adalah wb_spi_bridge , yang dapat dipakai secara langsung tanpa perlu perpustakaan khusus.
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 ;Entitas teratas membuat dua entitas dalam file :
wb_spi_bridge_link menangani protokol memori SPI (baca, tulis, tulis-enable)wb_spi_bridge_phy menangani protokol antarmuka serial serial yang sebenarnyawb_rstn_i ) dan yang sinkron ( wb_srstn_i ), yang keduanya rendah aktif. Reset asinkron diperlukan untuk membawa jembatan ke keadaan yang ditentukan. Reset sinkron adalah opsional dan dapat digunakan untuk mengatur ulang jembatan dari logika aplikasi. Ikat reset ini ke 1 jika tidak digunakan.
Konfigurasi spesifik aplikasi dari jembatan wishbone-to-spi dilakukan dengan menggunakan obat generik dari entitas teratas.
Frekuensi clock SPI dikonfigurasikan menggunakan SPI_CLK_DIV generik. Ini mendefinisikan scaler yang berlaku untuk input jam clk_i untuk mendapatkan jam SPI yang sebenarnya. Jam SPI ditentukan oleh f_spi = f_main / (2 * SPI_CLK_DIV) . Nilai minimum yang diizinkan untuk skaler jam adalah 2 menghasilkan kecepatan clock SPI maksimal 1/4 dari kecepatan clock input.
Mode jam yang sebenarnya dikonfigurasi melalui SPI_CPHA dan SPI_CPOL . Kombinasi dari dua obat generik ini memungkinkan untuk mengkonfigurasi salah satu dari empat mode jam SPI standar. Untuk informasi lebih lanjut tentang mode jam, lihat artikel SPI Wikipedia.
Ukuran alamat memori SPI, yang didefinisikan oleh kapasitasnya, dikonfigurasi oleh SPI_ABYTES generik. Nilai yang diizinkan adalah 1, 2, 3 dan 4. Sebagian besar eeprom SPI menggunakan ukuran alamat 16-bit yang menghasilkan SPI_ABYTES = 2 . Banyak memori flash SPI standar menggunakan 24-bit untuk pengalamatan yang menghasilkan SPI_ABYTES = 3 .
Jembatan hanya menggunakan tiga perintah memori standar. Jika perintah dari memori SPI tertentu berbeda, Anda dapat menyesuaikannya dalam file sumber 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
-- ------------------------------------------------------------------------------ Alamat dasar 32-bit dari jembatan ditentukan oleh WB_ADDR_BASE generik. Ukuran ruang alamat yang ditempati, yang didefinisikan kapasitas memori SPI, dikonfigurasi oleh WB_ADDR_SIZE generik. Ukuran ruang alamat harus menjadi kekuatan dua dan alamat dasar harus diselaraskan secara alami dengan ukuran ini.
Contoh: SPI Flash dengan 64KB (64*1024 byte):
WB_ADDR_BASE => 0 x"FFFF0000" ,
WB_ADDR_SIZE => 64 * 1024 Dalam hal ini alamat basis 0xFFFF8000 tidak akan valid karena tidak secara alami disejajarkan dengan batas 64kB.
Antarmuka host didasarkan pada spesifikasi WishBone B4. Ini mendukung transfer akses tunggal klasik dan pipelined . Transfer burst belum didukung.
| Contoh akses baca mode klasik | Contoh Akses Tulis Mode Pipelined |
|---|---|
stb dan cyc keduanya tetap ditegaskan sampai transfer selesai.cyc tetap ditegaskan sampai transfer selesai. stb ditegaskan hanya untuk satu siklus tepat di awal transfer. | Transfer diselesaikan ketika sinyal mengakui ack diatur (aktif untuk satu siklus). Ini menunjukkan penghentian yang berhasil. Transfer juga selesai ketika sinyal kesalahan err (aktif untuk satu siklus) yang menunjukkan penghentian yang salah. Jembatan akan menaikkan sinyal kesalahan hanya jika topeng byte-enable yang tidak didukung diatur (lihat di bawah).
Jembatan ini mendukung akses menulis 32-bit, 16-bit dan 8-bit. Baca akses selalu mengembalikan kata 32-bit penuh. Perhatikan bahwa jembatan mengakses data memori dalam orde byte kecil-endian . Sinyal mask byte sel mendefinisikan jumlah data dari akses yang sesuai. Masker byte berikut didukung:
sel | r/w | Kuantitas data |
|---|---|---|
1111 | membaca | Kata 32-bit penuh |
1111 | menulis | Kata 32-bit penuh |
1100 | menulis | Setengah kata 16-bit atas |
0011 | menulis | Turunkan 16-bit setengah kata |
0001 | menulis | byte 0 |
0010 | menulis | byte 1 |
0100 | menulis | byte 2 |
1000 | menulis | Byte 3 |
Semua kombinasi topeng byte yang tersisa akan meningkatkan kesalahan transfer ( err diatur untuk satu siklus, bukan ack ).
Jembatan selalu mengirimkan urutan perintah lengkap ke memori SPI untuk segala jenis transfer WishBone (semburan belum didukung). Ini berarti bahwa opcode memori, bit alamat dan data aktual ditransfer untuk setiap transaksi tunggal. Tabel berikut menunjukkan jumlah bit yang akan ditransfer melalui SPI untuk setiap jenis transaksi. Setiap bit membutuhkan satu jam dari jam SPI.
| r/w | Ukuran data | Bit CMD | Alamat bit | Bit data | Total bit |
|---|---|---|---|---|---|
| membaca | kata (32-bit) | 8 | 8*SPI_ABYTES | 32 | 8 + 8*SPI_ABYTES + 32 |
| menulis | kata (32-bit) | 8 + 8 | 8*SPI_ABYTES | 32 | 8 + 8 + 8*SPI_ABYTES + 32 |
| menulis | setengah kata (16-bit) | 8 + 8 | 8*SPI_ABYTES | 16 | 8 + 8 + 8*SPI_ABYTES + 16 |
| menulis | byte (8-bit) | 8 + 8 | 8*SPI_ABYTES | 8 | 8 + 8 + 8*SPI_ABYTES + 8 |
Misalnya akses tulis-lebar kata ke flash SPI yang menggunakan pengalamatan 24-bit membutuhkan 8 + 8 + 8*3 + 32 = 72 siklus jam SPI. Satu siklus jam SPI sama dengan 2 * SPI_CLK_DIV dari jam utama clk_i .
Segala jenis akses menulis yang diperlukan untuk mengatur latch enable write ingatan, yang selesai mengirim perintah 8-bit tunggal.
Proyek -proyek ini menyediakan sim/wb_spi_bridge_tb.vhd , yang dapat disimulasikan oleh GHDL melalui skrip menyediakan:
wb_spi_bridge/sim$ sh ghdl.sh Simulasi akan berjalan untuk 1ms menggunakan jam 100MHz. Selama waktu ini semua akses Wishbone yang didukung (dan satu ilegal) dipicu. Perhatikan bahwa testbench ini dimaksudkan untuk inspeksi bentuk gelombang manual - ini bukan pemeriksaan diri! Data bentuk gelombang disimpan ke sim/wb_spi_bridge.vcd , yang dapat dilihat dengan menggunakan gtkwave :
wb_spi_bridge/sim$ gtkwave wb_spi_bridge.vcdJembatan ini terbukti FPGA . Ini telah diuji dengan menghubungkannya secara langsung ke port antarmuka WishBone dari prosesor RISC-V NEORV32 (No WishBone Interconnect) yang berinteraksi dengan 25LC512 SPI EEPROM.
Contoh perangkat lunak NEORV32 menyediakan program "Bus Explorer" yang memungkinkan untuk melakukan akses Wishbone yang sewenang -wenang melalui terminal UART. Jembatan dapat berhasil menangani semua operasi membaca dan menulis. Selain itu, NEORV32 dapat berhasil mengeksekusi program di tempat dari modul SPI.
Hasil pemetaan teladan untuk konfigurasi berikut:
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)