710 lines
28 KiB
Markdown
710 lines
28 KiB
Markdown
# Rocket GPS SoC
|
|
|
|
Bu depo, RV64 Rocket cekirdegi ile GPS acquisition, tracking, navigation ve
|
|
PPS donanimini ayni SoC icinde birlestirir. Ayni tasarim VCU118, Genesys2 ve
|
|
Ti375C529 FPGA kartlarinda; ortak GPS firmware'i ise bare-metal olarak calisir.
|
|
ASIC-style RTL ve simulasyon girisi de korunur.
|
|
Upstream Rocket-Chip kaynaklari daginik kok klasorlerde tutulmaz; gerekli
|
|
upstream kaynaklar `hardware/upstream/rocket-chip/` altindadir.
|
|
|
|
Donanim; RF orneklerini alan acquisition/tracking kanallarini, atomik olcum
|
|
snapshot'larini, interrupt kaynaklarini ve PPS periferigini saglar. `gps_system`
|
|
firmware'i interrupt servislerini, LNAV/ephemeris parsing'i, coherent epoch
|
|
toplamayi, position ve Doppler WLS'i, flash persistence'i ve opsiyonel
|
|
GPS+IMU ESKF'yi yurutur. Flash bootloader uygulama imajini CRC ile denetleyip
|
|
DTIM'e tasir; GDB yolu ayni ELF'i test icin dogrudan DTIM'e yukleyebilir.
|
|
|
|
## Kisa Harita
|
|
|
|
```text
|
|
hardware/
|
|
soc/scala/ Proje Scala/Chisel SoC katmani
|
|
generated/ FIRRTL ve SystemVerilog dump alani
|
|
fpga/vcu118/rtl/ VCU118 ek RTL
|
|
fpga/vcu118/constraints/ VCU118 XDC
|
|
fpga/genesys2/rtl/ Genesys2 ek RTL
|
|
fpga/genesys2/constraints/ Genesys2 XDC
|
|
fpga/ti375c529/rtl/ Ti375C529 ek RTL
|
|
fpga/ti375c529/constraints/ Ti375C529 Efinity interface kaynagi
|
|
sim/fpga/vcu118/ FPGA smoke/sim girisi
|
|
sim/asic/rocket/ ASIC testbench, modeller, wave.do
|
|
external/gps/rtl/ GPS RTL kaynaklari ve filelist
|
|
upstream/rocket-chip/ Gerekli upstream Rocket-Chip src ve bootrom
|
|
|
|
soc/software/ Bootloader, BSP, uygulamalar, flash image tool
|
|
targets/fpga/vcu118/ VCU118 build/programlama akisi
|
|
targets/fpga/genesys2/ Genesys2 build/programlama akisi
|
|
targets/fpga/ti375c529/ Ti375C529 Efinity build/programlama akisi
|
|
targets/asic/rocket/ ASIC wrapper/filelist/sim akisi
|
|
setup_tools.sh /tools/soc-tools host araci kurulum betigi
|
|
```
|
|
|
|
`hardware/generated/`, `soc/out/`, `targets/*/out/` ve kok `out/` uretilen
|
|
ciktilardir; kalici kaynak degisiklikleri bu dizinlere yapilmamalidir.
|
|
|
|
## Destek Ozeti
|
|
|
|
| Kart | FPGA araci | SoC / ACQ / TRK | Flash ve app offset | Varsayilan RF |
|
|
|---|---|---|---|---|
|
|
| VCU118 | Vivado | 100 / 100 / 125 MHz | 128 MiB, `0x06000000` | PMOD |
|
|
| Genesys2 | Vivado | 50 / 80 / 125 MHz | 32 MiB, `0x01800000` | PMOD |
|
|
| Ti375C529 | Efinity | 100 / 100 / 125 MHz | 64 MiB, `0x00800000` | PMOD |
|
|
|
|
Kart secimi `FPGA_BOARD=<kart>` veya `BOARD=<kart>` ile yapilir. Kesin clock,
|
|
flash, UART ve RF ayarlarini varsaymak yerine once su komut kullanilmalidir:
|
|
|
|
```sh
|
|
make FPGA_BOARD=genesys2 fpga-config
|
|
```
|
|
|
|
Kart bazli ayrintilar `targets/fpga/<kart>/README.md`, yazilim ayrintilari
|
|
`soc/software/gps_system/README.md` icindedir.
|
|
|
|
## Gelistirme Araclari
|
|
|
|
Mill, JDK, CIRCT/firtool ve Z3 makineye/işletim sistemine ozel binary
|
|
paketlerdir; Git'e eklenmezler. Linux x86-64 host araclarini sabit surum ve
|
|
SHA256 kontrolleriyle `/tools/soc-tools` altina kurmak icin:
|
|
|
|
```sh
|
|
./setup_tools.sh
|
|
```
|
|
|
|
Proje araclarini ve RISC-V bare-metal toolchain'i shell'e eklemek icin:
|
|
|
|
```sh
|
|
source source.sh
|
|
make doctor
|
|
```
|
|
|
|
`source.sh`, RISC-V GCC'yi sirasiyla `RISCV_TOOLCHAIN`, `TOOLCHAIN`, proje-ici
|
|
`tools/local/riscv/bin`, `/tools/toolchain/bin`, `/tools/toolchains/bin` ve
|
|
`PATH` icinde arar. Standart olmayan bir kurulum icin:
|
|
|
|
```sh
|
|
RISCV_TOOLCHAIN=/opt/riscv source source.sh
|
|
```
|
|
|
|
Ayni ayar shell'i degistirmeden Make'e de verilebilir:
|
|
|
|
```sh
|
|
make fpga-rtl RISCV_TOOLCHAIN=/opt/riscv
|
|
```
|
|
|
|
`setup_tools.sh` host tarafindaki Scala/Chisel uretim araclarini kurar. RISC-V
|
|
bare-metal toolchain buyuk ve ayri bir urun oldugu icin indirilmez; `source.sh`
|
|
tarafindan mevcut `/tools/toolchains` kurulumundan veya `RISCV_TOOLCHAIN`
|
|
degiskeninden bulunur.
|
|
|
|
## Ana Komutlar
|
|
|
|
| Hedef | Amaci |
|
|
|---|---|
|
|
| `make doctor` | JDK, Mill, firtool ve RISC-V toolchain'i kontrol eder. |
|
|
| `make fpga-config` | Secili kartin etkin clock, flash, UART ve RF ayarlarini yazar. |
|
|
| `make fpga-rtl` | Chisel/FIRRTL'den kart wrapper'i dahil SystemVerilog uretir. |
|
|
| `make fpga-bitstream` | Vivado veya Efinity sentez, place-route ve bitstream akisini calistirir. |
|
|
| `make fpga-elf-flash-image` | `APP` ELF'ini bootloader header/CRC iceren app imajina cevirir. |
|
|
| `make fpga-mcs` | Mevcut bitstream ile app imajini birlestirir; karta yazmaz. Ti375'te cikti HEX'tir. |
|
|
| `make fpga-program` | Bitstream'i FPGA SRAM'ine gecici yukler. |
|
|
| `make fpga-flash-app` | Yalniz uygulama flash bolgesini programlar. |
|
|
| `make fpga-flash-bitstream` | Yalniz konfigurasyon/bitstream bolgesini programlar. |
|
|
| `make fpga-flash-mcs` | Birlesik kalici flash imajini uretip programlar. |
|
|
| `make fpga-flash-all` | Degisen bitstream ve app bolgelerini ayri ayri programlar. |
|
|
| `make fpga-debug-openocd` | Rocket DMI icin OpenOCD/GDB sunucusunu acar. |
|
|
| `make fpga-debug-load` | Secili uygulamayi GDB ile DTIM'e yukler. |
|
|
| `make fpga-uart` | Kart UART'ini varsayilan `460800` baud ile dinler. |
|
|
| `make asic-rtl`, `make asic-sim` | ASIC-style RTL veya Questa simulasyon akisini calistirir. |
|
|
|
|
`APP` verilmezse varsayilan `hello_uart` olur. GPS firmware'i icin her build ve
|
|
programlama komutunda `APP=gps_system` acikca verilmelidir. `fpga-mcs` sonrasi
|
|
MCS/HEX dosyasini GUI ile programlamak da gecerlidir; kalici boot testi icin
|
|
kart power-cycle edilmelidir.
|
|
|
|
GPS bare-metal uygulamasini derlemek ve FPGA uzerinde GDB ile RAM'e yuklemek:
|
|
|
|
```sh
|
|
make -C soc/software app APP=gps_system
|
|
make -C targets/fpga/vcu118 debug-load APP=gps_system
|
|
```
|
|
|
|
## GPS Firmware Profilleri: ESKF ve GPS-only
|
|
|
|
`gps_system` varsayilan olarak ESKF acik (`GPS_ESKF_ENABLE=1`) ve UART
|
|
`460800` baud olacak sekilde derlenir. Kok Makefile'in kart varsayilani VCU118
|
|
oldugu icin Genesys2 komutlarinda `FPGA_BOARD=genesys2` acikca yazilmalidir.
|
|
|
|
TDK ICM42688 + GPS + ESKF iceren birlesik Genesys2 MCS/BIN:
|
|
|
|
```sh
|
|
make FPGA_BOARD=genesys2 APP=gps_system \
|
|
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
|
|
```
|
|
|
|
Yalniz GPS acquisition/tracking, WLS, Doppler velocity ve PPS calistiran;
|
|
IMU/ESKF baslatmayan firmware:
|
|
|
|
```sh
|
|
make FPGA_BOARD=genesys2 APP=gps_system \
|
|
GPS_ESKF_ENABLE=0 fpga-mcs
|
|
```
|
|
|
|
`GPS_ESKF_ENABLE` verilmezse deger `1`'dir. Iki komut ayni
|
|
`targets/fpga/genesys2/out/flash/genesys2_rocket.mcs` ve `.bin` yollarini
|
|
kullanir; ikinci build birincinin ciktisinin uzerine yazar.
|
|
|
|
`fpga-mcs` mevcut `.bit` dosyasini kullanip bootloader ve uygulamayi yeniden
|
|
derler. Yalniz software profili veya baud degisikligi icin sentez gerekmez.
|
|
Tracking/PPS RTL veya Chisel degistiyse once:
|
|
|
|
```sh
|
|
make FPGA_BOARD=genesys2 APP=gps_system fpga-bitstream
|
|
make FPGA_BOARD=genesys2 APP=gps_system GPS_ESKF_ENABLE=1 \
|
|
IMU_SENSOR=tdk fpga-mcs
|
|
```
|
|
|
|
Firmware ve host UART dinleyicisinin varsayilani birlikte `460800`'dur:
|
|
|
|
```sh
|
|
make FPGA_BOARD=genesys2 fpga-uart
|
|
```
|
|
|
|
### Kalici GPS verisi
|
|
|
|
`gps_system` varsayilan olarak ephemeris flash store'u ve navigation context
|
|
store'u acik derler. Ephemeris store bos ise 32 PRN icin stale baslangic
|
|
kayitlari yazilir; bunlar zaman/fit kontrolunu gecmeden konum hesabinda
|
|
kullanilmaz ve gercek LNAV ephemeris'i geldikce yenilenir. Her boot'ta erase
|
|
yapilmaz (`GPS_EPHEMERIS_FLASH_FORCE_FORMAT=0`).
|
|
|
|
| Kart | Navigation context | Ephemeris store |
|
|
|---|---:|---:|
|
|
| Genesys2 | `0x01FC0000` | `0x01FE0000` |
|
|
| VCU118 | `0x07FC0000` | `0x07FE0000` |
|
|
| Ti375C529 | `0x03FC0000` | `0x03FE0000` |
|
|
|
|
Ilgili build ayarlari `GPS_NAV_CONTEXT_ENABLE`,
|
|
`GPS_EPHEMERIS_FLASH_ENABLE` ve `GPS_EPHEMERIS_FLASH_SEED_INITIAL`'dir.
|
|
|
|
### UART GPS durum satirlari
|
|
|
|
`[TRK] tracked satellites` aktif ve lock durumundaki tracking kanallarini
|
|
gosterir. `[NAV] epoch funnel` ise bir konum epoch'unun asamalarini ayirir:
|
|
|
|
```text
|
|
tracked aktif/locked tracking kanali
|
|
ready gecerli ephemeris, HOW time anchor ve taze olcumu olan kanal
|
|
candidates tamamlanmis ayni epoch snapshot'ina giren kanal
|
|
coherent zaman/coherence kontrolunden gecen kanal
|
|
fix en az WLS minimumu ile nav solve calistirilabildi
|
|
```
|
|
|
|
Bu nedenle `tracked` sayisinin `ready` sayisindan buyuk olmasi tek basina
|
|
interrupt hatasi degildir. `fix=1` WLS denemesinin girdisinin hazir oldugunu
|
|
gosterir; basarili `[LOCATION]` sonucunu tek basina garanti etmez.
|
|
`eph_reject/eph_hit/eph_miss`,
|
|
`assembly_failed/deadline/overwrite` sayaclari kaybin ephemeris mi yoksa epoch
|
|
assembly tarafinda mi oldugunu ayirmak icindir. Firmware revizyonu acilista
|
|
`[FUSION] init build=...` alaninda gorulur; beklenen log yoksa once karta
|
|
yuklenen build bu alanla dogrulanmalidir.
|
|
|
|
### Doppler, WLS ve ESKF veri yolu
|
|
|
|
```text
|
|
tracking loop, her 20 ms:
|
|
carrier Q7 + 20 prompt I/Q + wideband power + ABS_SAMPLE/code phase
|
|
-> sabit tracking snapshot
|
|
-> synchronizer + APB-domain atomik register + interrupt
|
|
-> C/N0 ve Doppler/range-rate donusumu
|
|
-> ham Doppler + tek-kanal FDE ile C/N0-weighted velocity WLS
|
|
-> ECEF velocity + 3x3 covariance + receiver clock drift
|
|
-> ECEF->ENU adapter
|
|
-> ayri velocity NIS gate
|
|
-> ayni capture epoch'unda 15-state ESKF update
|
|
-> daha yeni IMU history replay
|
|
```
|
|
|
|
RTL Doppler veya C/N0 uzerinde IIR yapmaz; ham ve 20 ms sabit snapshot'i
|
|
software'e verir. Software ayni PRN icin C/N0'yi `alpha=0.2` ile yumusatir;
|
|
Doppler'in hem ham de `alpha=0.05` IIR sonucu korunur. L1 range-rate
|
|
`-doppler_hz * c / 1575420000` ile hesaplanir. Ham yol tek-kanal
|
|
leave-one-out FDE'li velocity WLS'ten ESKF'ye, filtreli yol ayri velocity
|
|
WLS'ten yalniz PPS clock-bias drift predictor'una gider. PPS'in ana faz/zaman
|
|
olcumu position WLS `clock_bias_m` sonucudur; Doppler yalniz 200 ms epoch'lar
|
|
arasindaki turev prediction'ina ve kalite siniflandirmasina yardim eder. Her
|
|
iki velocity WLS state'i `[vx, vy, vz, receiver_clock_drift_mps]`'dir; uydu
|
|
LOS hizi ve broadcast satellite clock drift observation'dan ayrilir. C/N0,
|
|
range-rate agirligini belirler; post-fit residual gerekirse formal
|
|
covariance'i yalniz buyutur.
|
|
|
|
Klasik mutlak-pseudorange GNSS modelinde receiver zaman hatasi
|
|
`delta_t_r(t)` ise:
|
|
|
|
```text
|
|
code WLS 4. state: b_r = c * delta_t_r [metre]
|
|
Doppler WLS 4. state: bdot_r = c * d(delta_t_r)/dt [metre/saniye]
|
|
b_r(t + dt) ~= b_r(t) + bdot_r * dt
|
|
```
|
|
|
|
Burada `bdot_r`, receiver oscillator frequency error'inin range-rate
|
|
birimindeki ortak etkisidir. Ornegin `0.1 ppm` yaklasik `29.98 m/s` eder;
|
|
Doppler WLS bu ortak terimi uydu yonune gore degisen gercek `vx/vy/vz`
|
|
hareketinden ayirir.
|
|
|
|
Bu projede onemli bir datum farki vardir: position WLS'e verilen capture
|
|
zamanlarindan ortak receiver zamani cikarilir ve `STARTOFFSET` eklenir. Bu
|
|
nedenle `solution.clock_bias_m`, saf `c*delta_t_r` degil, yaklasik
|
|
`c*STARTOFFSET - reference_range` olan referans-uyduya bagli goreli
|
|
datumdur. Doppler WLS'nin dorduncu bilinmeyeni yine uydulara ortak receiver
|
|
clock/frequency drift'tir; fakat iki fit arasinda
|
|
`clock_bias_m(t+dt)=clock_bias_m(t)+clock_drift_mps*dt` kisiti kurulmaz.
|
|
Fit'ler ayri measurement/normal-equation kullanir. Doppler WLS, LOS
|
|
vektorleri icin position WLS'nin guncel receiver konumuna baglidir.
|
|
|
|
ESKF; ENU position/velocity, quaternion attitude, accel bias ve gyro bias
|
|
iceren 15 hata durumlu filtredir. Her timestamp'li IMU ornegi prediction'a
|
|
girer. Gecikmis GPS position ve Doppler velocity olcumleri kendi capture
|
|
epoch'unda uygulanir, ardindan daha yeni IMU history replay edilir. Position
|
|
ve velocity'nin ayri NIS kapilari vardir; kotu Doppler ayni epoch'taki gecerli
|
|
position update'ini iptal etmez. Durağanlik supervisor'u uygun oldugunda ZUPT
|
|
ve zero-gyro update uygular; GPS kesintisinde filtre sahte konum olcumu
|
|
uretmeden dead-reckoning yapar ve covariance buyur.
|
|
|
|
C/N0, geometri, WLS clock sigma, integrity ve Doppler residual metrikleri PPS
|
|
software'inin `acquire/precision/robust/holdover` profilini de secer. PPS
|
|
donanimi bu metrikleri dogrudan yorumlamaz; software v2.2 mailbox ile PI
|
|
`Kp/Ki`, slew ve lock esiklerini atomik olarak gunceller. Ayrintilar:
|
|
|
|
- `hardware/external/gps/rtl/trck_src/README.md`
|
|
- `soc/software/gps_system/README.md`
|
|
- `soc/software/fusion/README.md`
|
|
- `hardware/external/gps/rtl/pps/README.md`
|
|
- `soc/software/pps_python/README.md`
|
|
|
|
Alt girisler:
|
|
|
|
```sh
|
|
make -C hardware/soc help
|
|
make -C hardware/fpga/vcu118/rtl help
|
|
make -C hardware/sim/fpga/vcu118 help
|
|
make -C targets/fpga/vcu118 help
|
|
make -C targets/fpga/genesys2 help
|
|
make -C targets/fpga/ti375c529 help
|
|
make -C targets/asic/rocket help
|
|
```
|
|
|
|
## FPGA Kart Secimi ve RF Girisi
|
|
|
|
FPGA karti kok Makefile'dan `FPGA_BOARD` ile secilir:
|
|
|
|
```sh
|
|
make FPGA_BOARD=vcu118 fpga-config
|
|
make FPGA_BOARD=genesys2 fpga-config
|
|
make FPGA_BOARD=ti375c529 fpga-config
|
|
```
|
|
|
|
Top-level `BOARD=...` alias'i da desteklenir. Orneklerde Genesys2 kullanilir:
|
|
|
|
```sh
|
|
make BOARD=genesys2 fpga-config
|
|
```
|
|
|
|
Top-level hedeflerde tireli isimler tercih edilir (`fpga-program` gibi).
|
|
Yanlislikla underscore kullanilmasi durumunda yaygin FPGA hedefleri icin
|
|
alias'lar da vardir (`fpga_program`, `fpga_debug_openocd` gibi).
|
|
|
|
`fpga-config` secilen kartin clock, flash, UART, DTIM ve RF ayarlarini
|
|
gosterir. Genesys2 ve VCU118'de RF kaynagi `RF_INPUT_MODE` ile secilir:
|
|
|
|
```text
|
|
RF_INPUT_MODE=pmod Varsayilan. Harici 4-bit RF data + RF clock PMOD'dan gelir.
|
|
RF_INPUT_MODE=generated Dahili RF clock uretilir, RF data sifira baglanir.
|
|
RF_INPUT_MODE=ethernet Kart bazli raw-Ethernet RF streamer path'i.
|
|
```
|
|
|
|
## MAX2771 EVKIT PMOD Baglantisi
|
|
|
|
MAX2771, mevcut standart PMOD SPI'dan ayri bir uc-telli seri IP ve MMIO
|
|
peripheralidir. MAX2771 IP tabani `0x10016000`, mevcut PMOD SPI tabani ise
|
|
`0x10015000` adresindedir. Iki arayuzun portlari ve kart pinleri birbirinden
|
|
bagimsizdir.
|
|
|
|
Genesys2 icin MAX2771 EVKIT, PMOD `JB` grubuna baglanir:
|
|
|
|
| MAX2771 sinyali | FPGA yonu | Genesys2 PMOD | FPGA pini | Elektrik standardi |
|
|
|---|---|---|---|---|
|
|
| `SCLK` | cikis | `JB2` | `V30` | LVCMOS33 |
|
|
| `CSN` | cikis | `JB3` | `V25` | LVCMOS33 |
|
|
| `SDATA` | yazmada cikis, okumada giris | `JB4` | `W26` | LVCMOS33 |
|
|
|
|
Okuma komutunda FPGA, R/W bitinden sonraki turnaround baslangicinda `SDATA`
|
|
surucusunu high-Z yapar ve ayni `JB4` pinini giris olarak ornekler. Yazmada
|
|
ayni pin cikis olarak kullanilir. EVKIT ve kart GND hatlari ortaklanmalidir.
|
|
|
|
VCU118 icin ayrilan bos PMOD0/J52 pinleri:
|
|
|
|
| MAX2771 sinyali | FPGA yonu | VCU118 PMOD | Header pini | FPGA pini | FPGA I/O standardi |
|
|
|---|---|---|---|---|---|
|
|
| `SCLK` | cikis | `PMOD0_5` | `J52.4` | `AU16` | LVCMOS18 |
|
|
| `CSN` | cikis | `PMOD0_6` | `J52.6` | `AT15` | LVCMOS18 |
|
|
| `SDATA` | yazmada cikis, okumada giris | `PMOD0_7` | `J52.8` | `AT16` | LVCMOS18 |
|
|
|
|
VCU118'in U41 level shifter'i PMOD header tarafini 3.3 V'a cevirir. Mevcut
|
|
standart PMOD SPI pinleri degistirilmemistir:
|
|
|
|
Ti375C529, PMOD0/J13'te RF veri ve saatinden arta kalan uc pini kullanir:
|
|
|
|
| MAX2771 sinyali | FPGA yonu | Ti375C529 PMOD | FPGA pini | Elektrik standardi |
|
|
|---|---|---|---|---|
|
|
| `SCLK` | cikis | `J13.1` | `G15` | 3.3_V_LVCMOS |
|
|
| `CSN` | cikis | `J13.8` | `A11` | 3.3_V_LVCMOS |
|
|
| `SDATA` | yazmada cikis, okumada giris | `J13.9` | `A13` | 3.3_V_LVCMOS |
|
|
|
|
| Kart | Standart PMOD SPI CSN/MOSI/MISO/SCLK | MAX2771 CSN/SDATA/SCLK |
|
|
|---|---|---|
|
|
| Genesys2 | `JC1/JC2/JC3/JC4` | `JB3/JB4/JB2` |
|
|
| VCU118 | `J53.1/J53.3/J53.5/J53.7` | `J52.6/J52.8/J52.4` |
|
|
| Ti375C529 | `J14.1/J14.2/J14.3/J14.4` | `J13.8/J13.9/J13.1` |
|
|
|
|
MAX2771 register varsayilanlarini yazip tek-hat `SDATA` uzerinden geri okuyarak
|
|
dogrulayan bare-metal uygulama:
|
|
|
|
```sh
|
|
make -C targets/fpga/genesys2 software APP=max2771_spi_test
|
|
```
|
|
|
|
Test MAX2771 register `0x0`-`0xA` icerigini veri sayfasindaki degerlerle
|
|
degistirir. EVKIT uzerindeki MAX32625 kontrolcusunun seri hatlari test boyunca
|
|
high-Z olmali ve EVKIT GUI ayni anda kullanilmamalidir.
|
|
|
|
Ti375C529 Efinity wrapper'i su anda yalniz harici PMOD RF girisini kullanir;
|
|
bu kartta `RF_INPUT_MODE=pmod` birakilmalidir. `generated` ve `ethernet`
|
|
yollari Ti375C529 wrapper'ina henuz uygulanmamistir.
|
|
|
|
Top-level FPGA wrapper'lar elle yazilmaz; `targets/fpga/*/tools/gen_*_wrapper.py`
|
|
scriptleri tarafindan uretilir. Genesys2 ve VCU118'de RF secimi RTL `ifdef`
|
|
ile degil, generator parametresi ile yapilir. `make rtl` ve Vivado `build.tcl`
|
|
ayni `RF_INPUT_MODE` degerini wrapper generator'a gecirir.
|
|
|
|
Varsayilan `pmod` modunda Ethernet RF IP/RTL okunmaz ve top'ta Ethernet PHY
|
|
portlari olusmaz. Ethernet RF akisi gerektiginde:
|
|
|
|
```sh
|
|
make -C targets/fpga/vcu118 bitstream RF_INPUT_MODE=ethernet
|
|
sudo make -C targets/fpga/vcu118 eth-rf-send
|
|
|
|
make -C targets/fpga/genesys2 bitstream RF_INPUT_MODE=ethernet
|
|
sudo make -C targets/fpga/genesys2 eth-rf-send
|
|
```
|
|
|
|
PMOD RF pinleri ve voltajlari:
|
|
|
|
```text
|
|
Genesys2 JA, connector ve FPGA tarafi 3.3 V:
|
|
port FPGA pin PMOD pin FPGA I/O PMOD header level
|
|
rf_clk_pmod U27 JA[0] LVCMOS33 3.3 V
|
|
rf_data_pmod[0] U28 JA[1] LVCMOS33 3.3 V
|
|
rf_data_pmod[1] T26 JA[2] LVCMOS33 3.3 V
|
|
rf_data_pmod[2] T27 JA[3] LVCMOS33 3.3 V
|
|
rf_data_pmod[3] T22 JA[4] LVCMOS33 3.3 V
|
|
|
|
VCU118 PMOD0/J52, connector tarafi 3.3 V, FPGA U1 tarafi U41 level shifter
|
|
uzerinden 1.8 V bank/LVCMOS18:
|
|
port FPGA pin PMOD pin FPGA I/O PMOD header level
|
|
rf_clk_pmod AY14 PMOD0_0 J52.1 LVCMOS18 3.3 V
|
|
rf_data_pmod[0] AY15 PMOD0_1 J52.3 LVCMOS18 3.3 V
|
|
rf_data_pmod[1] AW15 PMOD0_2 J52.5 LVCMOS18 3.3 V
|
|
rf_data_pmod[2] AV15 PMOD0_3 J52.7 LVCMOS18 3.3 V
|
|
rf_data_pmod[3] AV16 PMOD0_4 J52.2 LVCMOS18 3.3 V
|
|
|
|
Ti375C529 PMOD0/J13, connector ve FPGA tarafi 3.3 V:
|
|
port FPGA pin PMOD pin FPGA resource FPGA I/O
|
|
rf_clk A12 J13.10 GPIOR_95_CLK12 3.3_V_LVCMOS
|
|
rf_data[0] G16 J13.2 GPIOR_89 3.3_V_LVCMOS
|
|
rf_data[1] F16 J13.3 GPIOR_90 3.3_V_LVCMOS
|
|
rf_data[2] F17 J13.4 GPIOR_91 3.3_V_LVCMOS
|
|
rf_data[3] G17 J13.7 GPIOR_92 3.3_V_LVCMOS
|
|
```
|
|
|
|
VCU118'de disaridan PMOD header'a 3.3 V seviye verilir. FPGA U1 package
|
|
pinlerine dogrudan 3.3 V uygulanmaz; o tarafta XDC `LVCMOS18` kullanir.
|
|
|
|
Ti375C529'de AX2771 `rf_clk` hatti mutlaka J13 pin 10'a baglanmalidir. Bu pin
|
|
global-clock girisidir. J13 pin 1 / G15 (`GPIOR_88_PLLIN1`) MAX2771 `SCLK`
|
|
cikisidir; dedicated fabric GCLK olmadigi icin RF saati oradan alinmaz.
|
|
|
|
PMOD SPI portu her RF modunda aktiftir ve ayri MMIO register block olarak
|
|
`0x10015000` adresindedir. Kart uzerindeki konfig flash SPI'si `0x10014000`
|
|
adresinde kalir. Yazilim driver'i single/quad calisma modunu `ctrl.bit2`
|
|
uzerinden secer; single modda `dq[0]` MOSI, `dq[1]` MISO olarak kullanilir ve
|
|
`dq[2:3]` high-Z kalir. Quad modda `dq[3:0]` birlikte kullanilir.
|
|
|
|
```text
|
|
Genesys2 PMOD JC, connector ve FPGA tarafi 3.3 V:
|
|
port FPGA pin PMOD pin FPGA I/O PMOD header level
|
|
pmod_spi_csn AC26 JC1 LVCMOS33 3.3 V
|
|
pmod_spi_dq[0] AJ27 JC2 MOSI LVCMOS33 3.3 V
|
|
pmod_spi_dq[1] AH30 JC3 MISO LVCMOS33 3.3 V
|
|
pmod_spi_sck AK29 JC4 SCK LVCMOS33 3.3 V
|
|
pmod_spi_dq[2] AD26 JC7 LVCMOS33 3.3 V
|
|
pmod_spi_dq[3] AG30 JC8 LVCMOS33 3.3 V
|
|
|
|
VCU118 PMOD1/J53, connector tarafi 3.3 V, FPGA U1 tarafi U42 level shifter
|
|
uzerinden 1.2 V bank/LVCMOS12:
|
|
port FPGA pin PMOD pin FPGA I/O PMOD header level
|
|
pmod_spi_csn N28 PMOD1_0 J53.1 LVCMOS12 3.3 V
|
|
pmod_spi_dq[0] M30 PMOD1_1 J53.3 MOSI LVCMOS12 3.3 V
|
|
pmod_spi_dq[1] N30 PMOD1_2 J53.5 MISO LVCMOS12 3.3 V
|
|
pmod_spi_sck P30 PMOD1_3 J53.7 SCK LVCMOS12 3.3 V
|
|
pmod_spi_dq[2] P29 PMOD1_4 J53.2 LVCMOS12 3.3 V
|
|
pmod_spi_dq[3] L31 PMOD1_5 J53.4 LVCMOS12 3.3 V
|
|
|
|
Ti375C529 PMOD1/J14, connector ve FPGA tarafi 3.3 V:
|
|
port FPGA pin PMOD pin FPGA resource FPGA I/O
|
|
pmod_spi_csn B12 J14.1 GPIOR_96_CLK13 3.3_V_LVCMOS
|
|
pmod_spi_dq[0] C14 J14.2 MOSI GPIOR_97 3.3_V_LVCMOS
|
|
pmod_spi_dq[1] C13 J14.3 MISO GPIOR_98 3.3_V_LVCMOS
|
|
pmod_spi_sck C12 J14.4 SCK GPIOR_99 3.3_V_LVCMOS
|
|
pmod_spi_dq[2] D12 J14.7 GPIOR_100 3.3_V_LVCMOS
|
|
pmod_spi_dq[3] F12 J14.8 GPIOR_101_PLLIN1 3.3_V_LVCMOS
|
|
```
|
|
|
|
Sensorden gelen external interrupt hatti SPI'dan bagimsizdir. `pmod_irq`
|
|
top-level input'u olarak PMOD'a alinir ve PLIC'te `BSP_PMOD_IRQ` (`11`)
|
|
ID'siyle gorunur.
|
|
|
|
```text
|
|
Genesys2:
|
|
port FPGA pin PMOD pin FPGA I/O PMOD header level
|
|
pmod_irq AK30 JC9 LVCMOS33 3.3 V
|
|
|
|
VCU118:
|
|
port FPGA pin PMOD pin FPGA I/O PMOD header level
|
|
pmod_irq M31 PMOD1_6 J53.6 LVCMOS12 3.3 V
|
|
|
|
Ti375C529:
|
|
port FPGA pin PMOD pin FPGA resource FPGA I/O
|
|
pmod_irq D13 J14.9 GPIOR_102 3.3_V_LVCMOS
|
|
gps_pps E13 J14.10 GPIOR_103 3.3_V_LVCMOS
|
|
```
|
|
|
|
Ti375C529'de `gps_pps` J14.10 uzerinden cikan 3.3 V PPS sinyalidir;
|
|
`pmod_irq` ise J14.9 uzerinden FPGA'ya girer.
|
|
|
|
Bu pinler mod bazli companion XDC dosyalarinda tutulur:
|
|
`hardware/fpga/genesys2/constraints/genesys2_pmod_rf.xdc`,
|
|
`hardware/fpga/vcu118/constraints/vcu118_pmod_rf.xdc`,
|
|
`hardware/fpga/genesys2/constraints/genesys2_pmod_spi.xdc`,
|
|
`hardware/fpga/vcu118/constraints/vcu118_pmod_spi.xdc`,
|
|
`hardware/fpga/genesys2/constraints/genesys2_pmod_irq.xdc`,
|
|
`hardware/fpga/vcu118/constraints/vcu118_pmod_irq.xdc`,
|
|
`hardware/fpga/genesys2/constraints/genesys2_ethernet.xdc` ve
|
|
`hardware/fpga/vcu118/constraints/vcu118_ethernet.xdc`. Ti375C529 pinleri,
|
|
I/O standartlari, PLL'ler ve hard-JTAG baglantisi tek Efinity interface
|
|
scriptinde tutulur:
|
|
`hardware/fpga/ti375c529/constraints/ti375c529_rocket.isf`.
|
|
|
|
### Ti375C529 kart uzeri baglantilar
|
|
|
|
Ti375C529 development kit'te Rocket sistem saati kart uzerindeki 100 MHz
|
|
osilatorden, GPS isleme saatleri ise AX2771'in J13.10 uzerindeki
|
|
16.367981 MHz RF saatinden uretilir. SW3 active-low Rocket resetidir. FTDI
|
|
UART varsayilan olarak 460800 baud ve mevcut Linux enumeration'inda
|
|
`/dev/ttyUSB2` kullanir. Birden fazla kart veya farkli enumeration icin
|
|
`UART_PORT=...` ve `FTDI_URL=...` ile override edilebilir.
|
|
|
|
Lower 512-Mbit konfig flash'i kart icinde su pinlere baglidir; PMOD'a kablo
|
|
cekilmez:
|
|
|
|
```text
|
|
port FPGA pin FPGA resource
|
|
flash_csn A7 GPIOB_N_38 / SSL_N
|
|
flash_sck G6 GPIOB_P_39 / CCK
|
|
flash_dq[0] H4 GPIOB_N_40 / CDI0
|
|
flash_dq[1] H5 GPIOB_P_40 / CDI1
|
|
flash_dq[2] G5 GPIOB_N_39 / CDI2
|
|
flash_dq[3] B7 GPIOB_P_38 / CDI3
|
|
```
|
|
|
|
Efinity `JTAG_USER1`, mevcut Rocket DMI tunnel protokolunu kullanir. Host
|
|
OpenOCD build'inde `riscv set_bscan_tunnel_ir` destegi bulunmalidir; Efinity
|
|
ile gelen OpenOCD yerine uyumlu host OpenOCD kullanilir. OpenOCD 0.12 icin
|
|
gerekli host yamasi
|
|
`targets/fpga/ti375c529/flow/debug/openocd-0.12-ti375-bscan.patch`
|
|
dosyasindadir. Ayrintili Efinity, clock, JTAG ve dogrulama notlari icin
|
|
`targets/fpga/ti375c529/README.md` dosyasina bakin.
|
|
|
|
## FPGA Flash ve MCS Akislari
|
|
|
|
Bu hedefler kok Makefile'dan secilen karta yonlenir. Genesys2 icin
|
|
`BOARD=genesys2`, VCU118 icin `BOARD=vcu118`, Ti375C529 icin
|
|
`BOARD=ti375c529` kullanilir. `APP` verilmezse varsayilan uygulama
|
|
`hello_uart` olur.
|
|
|
|
Sadece ELF'i derleyip bootloader'in okuyacagi flash-format app imajina cevirmek:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-elf-flash-image
|
|
```
|
|
|
|
Bu akista ELF dogrudan MCS'e girmez. Once su dosya uretilir:
|
|
|
|
```text
|
|
soc/out/flash/hello_uart.flash.bin
|
|
```
|
|
|
|
Yeni bitstream ve yeni aplikasyon ile birlesik MCS/BIN olusturmak:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-bitstream fpga-mcs
|
|
```
|
|
|
|
Genesys2 ciktilari:
|
|
|
|
```text
|
|
targets/fpga/genesys2/out/bitstream/genesys2_rocket.bit
|
|
targets/fpga/genesys2/out/flash/genesys2_rocket.mcs
|
|
targets/fpga/genesys2/out/flash/genesys2_rocket.bin
|
|
```
|
|
|
|
Birlesik MCS'i olusturup kart flash'ina yazmak:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-flash-mcs
|
|
```
|
|
|
|
Yeni bitstream de uretilsin, sonra birlesik MCS flash'a yazilsin:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-bitstream fpga-flash-mcs
|
|
```
|
|
|
|
Sadece bitstream region'ini kart flash'ina yazmak:
|
|
|
|
```sh
|
|
make BOARD=genesys2 fpga-flash-bitstream
|
|
```
|
|
|
|
Yeni bitstream uretip sadece bitstream region'ini yazmak:
|
|
|
|
```sh
|
|
make BOARD=genesys2 fpga-bitstream fpga-flash-bitstream
|
|
```
|
|
|
|
ELF'i flash formatina cevirip sadece app region'ini kart flash'ina yazmak:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-flash-app
|
|
```
|
|
|
|
`fpga-flash`, `fpga-flash-app` icin alias'tir:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-flash
|
|
```
|
|
|
|
Degisen bitstream ve app region'larini ayri MCS'lerle programlamak:
|
|
|
|
```sh
|
|
make BOARD=genesys2 APP=hello_uart fpga-flash-all
|
|
```
|
|
|
|
Flash programlama bittikten sonra FPGA her zaman otomatik olarak flash'taki
|
|
kullanici bitstream'inden yeniden baslamaz. Kartin kalici flash'tan boot
|
|
etmesini test etmek icin power-cycle/reconfigure yapin; sadece RAM/SRAM'e
|
|
hemen yuklemek icin `fpga-program` kullanin:
|
|
|
|
```sh
|
|
make BOARD=genesys2 fpga-program
|
|
```
|
|
|
|
OpenOCD baslarken `LIBUSB_ERROR_BUSY` gorulurse JTAG kablosunu Vivado
|
|
`hw_server` tutuyordur. Hardware Manager'i kapatin veya bu prosesleri durdurun:
|
|
|
|
```sh
|
|
pkill -u "$USER" -x hw_server || true
|
|
pkill -u "$USER" -x cs_server || true
|
|
make BOARD=genesys2 fpga-debug-openocd
|
|
```
|
|
|
|
Genesys2 flash yerlesimi:
|
|
|
|
```text
|
|
bitstream offset: 0x00000000
|
|
app offset: 0x01800000
|
|
flash size: 32 MiB
|
|
interface: SPIx4
|
|
```
|
|
|
|
### Ti375C529 Efinity build ve flash
|
|
|
|
Efinity `/tools/efinix/efinity`, `/tools/Efinix/efinity`, `/opt`, kullanici
|
|
dizini ve `tools/local/efinity` altinda aranir. Farkli bir kurulum
|
|
`EFINITY_HOME=/path/to/efinity/<version>` ile secilebilir. `fpga-bitstream`,
|
|
uzun RTL elaborasyonundan once kurulumdaki `bin/setup.sh` ve
|
|
`scripts/efx_run.py` dosyalarini kontrol eder. Build, SRAM'e gecici programlama
|
|
ve kart tespiti kokten su sekilde yapilir:
|
|
|
|
```sh
|
|
make FPGA_BOARD=ti375c529 fpga-config
|
|
make FPGA_BOARD=ti375c529 fpga-bitstream
|
|
make -C targets/fpga/ti375c529 detect
|
|
make FPGA_BOARD=ti375c529 fpga-program
|
|
```
|
|
|
|
Ti375C529'de repository genelindeki `fpga-mcs` hedef adi korunur fakat cikti
|
|
Xilinx MCS/BIN degil, Efinity raw HEX'tir. Lower 512-Mbit flash yerlesimi:
|
|
|
|
```text
|
|
configuration offset: 0x00000000
|
|
app offset: 0x00800000
|
|
flash size: 64 MiB
|
|
interface: active-x1 configuration / user-mode quad SPI
|
|
```
|
|
|
|
Konfig ve uygulama imajlarini uretmek ve programlamak icin:
|
|
|
|
```sh
|
|
make FPGA_BOARD=ti375c529 APP=hello_uart fpga-mcs
|
|
make FPGA_BOARD=ti375c529 APP=hello_uart fpga-flash-app
|
|
make FPGA_BOARD=ti375c529 fpga-flash-bitstream
|
|
make FPGA_BOARD=ti375c529 APP=hello_uart fpga-flash-mcs
|
|
```
|
|
|
|
Ciktilar:
|
|
|
|
```text
|
|
targets/fpga/ti375c529/out/bitstream/ti375c529_rocket.bit
|
|
targets/fpga/ti375c529/out/bitstream/ti375c529_rocket.hex
|
|
targets/fpga/ti375c529/out/flash/ti375c529_rocket.hex
|
|
targets/fpga/ti375c529/out/flash/ti375c529_rocket.json
|
|
```
|
|
|
|
Flash programlama Efinity'nin Ti375'e uygun JTAG-to-SPI bridge'ini gecici
|
|
olarak yukler. Gercek persistent boot testi icin programlamadan sonra karta
|
|
power-cycle uygulanmalidir. GDB ile DTIM'e yukleme ve UART dinleme:
|
|
|
|
```sh
|
|
make FPGA_BOARD=ti375c529 fpga-debug-openocd
|
|
make FPGA_BOARD=ti375c529 APP=hello_uart fpga-debug-load
|
|
make FPGA_BOARD=ti375c529 fpga-uart
|
|
```
|
|
|
|
## GPS Reset Davranisi
|
|
|
|
OpenOCD/GDB `monitor reset` yolu Rocket debug module `ndmreset` sinyalini
|
|
assert eder. FPGA top wrapper'lari bu sinyali SoC resetine katar; bu reset hem
|
|
Rocket core'a hem APB peripheral tarafina gider.
|
|
|
|
GPS APB entegrasyonu reseti tek tel olarak kullanmaz. `APBGpsBlock` icinde
|
|
`ResetCatchAndSync` ile APB/PCLK, acquisition 80 MHz, tracking 125 MHz ve
|
|
RF/AFE clock domainleri icin ayri active-low resetler uretilir. Assert async,
|
|
deassert ilgili clock domaininde 3 kademe senkronizedir. APB register wrapper
|
|
lari `PRESETN` ile resetlenir; `acq_top`, `trck_top` ve `afe_top` ise kendi
|
|
clock domain resetleriyle resetlenir.
|
|
|
|
Not: Senkron deassert icin ilgili clock calismalidir. PMOD/RF clock yoksa
|
|
RF/AFE domain reseti release olmaz; bu reset acisindan beklenen davranistir.
|
|
|
|
Detayli dosya haritasi icin `PROJECT_LAYOUT.md` ve `hardware/README.md`.
|