feat(gps): expose ESKF build profiles and 460800 UART

This commit is contained in:
2026-07-25 19:39:36 +03:00
parent ecbb8d0b68
commit 49b8609bb4
16 changed files with 393 additions and 39 deletions
+3
View File
@@ -40,6 +40,9 @@ help:
'' \
'Config:' \
' FPGA_BOARD=$(FPGA_BOARD) # vcu118 or genesys2' \
' UART_BAUD=460800 # FPGA firmware and host listener default' \
' GPS_ESKF_ENABLE=1 # gps_system: 1 ESKF, 0 GPS-only' \
' IMU_SENSOR=auto # gps_system: auto, tdk, st or stm' \
'' \
'Direct entry points:' \
' make -C soc help' \
+87
View File
@@ -86,6 +86,93 @@ 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. Iki profili
saklamak gerekiyorsa her build'den sonra dosyayi profil adiyla kopyalayin.
`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
```
### 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
-> satellite velocity/clock-drift duzeltmeli 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`, Doppler'i
`alpha=0.05` ile yumusatir. L1 range-rate
`-doppler_hz * c / 1575420000` ile hesaplanir. En az dort uyduyla cozulmus
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.
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
+6
View File
@@ -46,3 +46,9 @@ external/gps/rtl/
pass this path as the default GPS_SYSTEM_DIR, so the Vivado flow does not
depend on a user-specific /home/... checkout.
```
GPS tracking olcum yolunun 20 ms Doppler/C/N0 snapshot, PCLK synchronizer,
APB register/interrupt ve software velocity WLS sozlesmesi
`external/gps/rtl/trck_src/README.md` icinde belgelenir. PPS PI periferigi,
runtime coefficient/lock register map'i ve fiziksel pin sinirlari
`external/gps/rtl/pps/README.md` icindedir.
+10
View File
@@ -47,6 +47,16 @@ The hardware does not add `POSTPONE_TOW`. Baremetal must commit an already
epoch-aligned GPS reference, so the verified 160 ms subframe readout correction
is owned exactly once by the navigation software.
Tracking C/N0 and Doppler are not inputs to the PPS RTL. The tracking wrapper
publishes those measurements through its separate 20 ms APB mailbox. Firmware
uses C/N0, geometry, WLS clock sigma, integrity and Doppler velocity residual
to select `acquire`, `precision`, `robust` or `holdover`, then writes the
corresponding PI coefficients, slew limit and lock thresholds through this
PPS mailbox. Doppler also predicts the WLS clock-bias datum between commits.
This keeps quality policy and the small navigation pre-filter in software
while the deterministic PI loop, fixed-point rate state and physical edge
generation remain in hardware.
The APB register offsets live in `pps_pkg.sv`. Multiword input fields are
shadow registers and must be followed by one `COMMIT` write. A new mailbox
must not be written while `STATUS.COMMIT_BUSY` is set.
+107
View File
@@ -0,0 +1,107 @@
# GPS tracking measurement yolu
Bu dizindeki tracking loop yalniz code/carrier takibi yapmaz; her 20 ms GPS
L1 C/A navigation-bit epoch'unda software'in C/N0 ve Doppler kullanabilmesi
icin atomik bir measurement snapshot'i da uretir.
## 20 ms snapshot
`tracking_measurement.sv`, ilk NAV-bit kenarinda accumulator'lari arm eder ve
sonraki her bit epoch'unda su alanlari birlikte latch eder:
```text
nav bit
ABS_SAMPLE
remaining code phase
signed carrier frequency, Q7
20 x prompt I toplami
20 x prompt Q toplami
20 x (I_prompt^2 + Q_prompt^2) wideband power toplami
sample count
16-bit sequence
```
Prompt energy `lock_detector.sv` icinde pipeline'li oldugu icin bit kenarindan
sonra dort tracking clock beklenir; bu, son 1 ms enerji terimini eski epoch'a
dahil eder ve yeni epoch ile karistirmaz. Snapshot ve `measurement_valid`
sonraki bit epoch'una kadar, yaklasik 20 ms sabit kalir.
## APB aktarimi ve interrupt
`apb_wrappers/tracking_wrapper.sv`, valid ve payload'un her bitini
`double_ff_syn` yardimcisi ile PCLK domainine alir. Bu yardimcinin mevcut
implementasyonu `stage_1`, `stage_2` ve registered `Dout` olmak uzere uc
register kademesidir. Kaynak payload 20 ms sabit kaldigi icin FIFO veya toggle
handshake kullanilmaz. Wrapper synchronized valid kenarindan sonra iki ek PCLK
settle cycle bekler, tum alanlari APB-domain register bankina ayni anda kopyalar
ve measurement interrupt/flag uretir.
Software sequence'i okumadan once ve payload'dan sonra tekrar okuyarak atomik
snapshot dogrulamasi yapar. Sequence degisirse okuma tekrar edilir; sequence
atlarsa kayip measurement diagnostics sayaci artar.
Measurement register offsetleri:
| Offset | Alan |
|---:|---|
| `0x50` | version, valid, NAV bit, lock ve sample count metadata |
| `0x54` | 16-bit sequence |
| `0x58` | signed carrier frequency Q7 |
| `0x5c` | ABS_SAMPLE |
| `0x60` | remaining code phase |
| `0x64` | signed prompt sum I |
| `0x68` | signed prompt sum Q |
| `0x6c` | wideband power low |
| `0x70` | wideband power high |
## Software'e verilen anlam
Carrier register'i toplam NCO frekansidir. Software IF merkezini cikarir:
```text
doppler_hz = carrier_q7 / 128 - 4092000
range_rate_mps = -doppler_hz * c / 1575420000
```
Pozitif received-frequency Doppler azalan geometrik range anlamina geldigi
icin range-rate denkleminde eksi isareti vardir.
C/N0, 20 prompt icin narrowband/wideband power estimator'i ile hesaplanir:
```text
R = (sum_i^2 + sum_q^2) / WBP
C/N0_linear = 1000 * (R - 1) / (20 - R)
C/N0_dbhz = 10 * log10(C/N0_linear)
```
RTL IIR uygulamaz. Ham snapshot debug ve yeniden tune icin korunur. ISR state'i
ayni PRN'de C/N0 icin `alpha=0.2`, Doppler icin `alpha=0.05` software IIR
uygular; reacquisition veya PRN degisiminde eski kanal state'i kullanilmaz.
Filtrelenmis range-rate, satellite ECEF velocity ve satellite clock drift ile
C/N0-weighted 4-state velocity WLS'ye girer:
```text
state = [receiver_vx, receiver_vy, receiver_vz, receiver_clock_drift_mps]
observation = measured_range_rate
- satellite_LOS_rate
+ c * satellite_clock_drift
H = [-u_x, -u_y, -u_z, 1]
```
WLS en az dort gecerli uydu ister; ECEF velocity, 3x3 covariance, receiver
clock drift ve residual RMS uretir. Fusion adapter velocity/covariance'i ENU'ya
dondurur ve ayri velocity NIS kapisi ile 15-state ESKF'ye verir.
## Dogrulama
```sh
make -C hardware/external/gps/rtl/trck_src/tb test
make -C soc/software/gps_system/tests run
make -C soc/software/gps_system/tests sanitize
```
Questa testleri 20 prompt akumulasyonu, snapshot hold, synchronizer settle,
atomik APB copy ve interrupt'i; Linux C testleri Q7 Doppler/range-rate, C/N0
estimator, coherent read, satellite velocity/clock drift ve weighted velocity
WLS/covariance yolunu kontrol eder.
+7 -3
View File
@@ -11,8 +11,10 @@ APP_FLASH_OFFSET ?= 0x06000000
APP ?= hello_uart
GPS_DEBUG ?= 1
GPS_DEBUG_LEVEL ?= 1
GPS_ESKF_ENABLE ?= 1
IMU_SENSOR ?= auto
BSP_UART_CLOCK_HZ ?= 100000000
BSP_UART_BAUDRATE ?= 115200
BSP_UART_BAUDRATE ?= 460800
GPS_SYSTEM_UART_BAUDRATE ?= 460800
BSP_CLINT_TIMEBASE_HZ ?= 1000000
GPS_SYSTEM_CLINT_TIMEBASE_HZ ?= 500000
@@ -42,6 +44,8 @@ help:
@echo " BSP_UART_CLOCK_HZ=$(BSP_UART_CLOCK_HZ)"
@echo " BSP_UART_BAUDRATE=$(BSP_UART_BAUDRATE)"
@echo " GPS_SYSTEM_UART_BAUDRATE=$(GPS_SYSTEM_UART_BAUDRATE)"
@echo " GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)"
@echo " IMU_SENSOR=$(IMU_SENSOR)"
@echo " BSP_CLINT_TIMEBASE_HZ=$(BSP_CLINT_TIMEBASE_HZ)"
@echo " GPS_SYSTEM_CLINT_TIMEBASE_HZ=$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)"
@echo " GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES=$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)"
@@ -63,11 +67,11 @@ steval-mki217v1-test:
@make -C steval_mki217v1_test TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/steval_mki217v1_test" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
gps-system:
@make -C gps_system TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/gps_system" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(GPS_SYSTEM_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES="$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
@make -C gps_system TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/gps_system" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(GPS_SYSTEM_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES="$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
app:
@test -d "$(APP)"
@make -C "$(APP)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/$(APP)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
@make -C "$(APP)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/$(APP)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
flash-image: app
@mkdir -p "$(FLASH_DIR)"
+1 -1
View File
@@ -13,7 +13,7 @@ APP_FLASH_OFFSET ?= 0x06000000
MARCH ?= rv64imafdc_zicsr_zifencei
MABI ?= lp64d
BSP_UART_CLOCK_HZ ?= 100000000
BSP_UART_BAUDRATE ?= 115200
BSP_UART_BAUDRATE ?= 460800
BSP_DTIM_BASE ?= 0x80000000
BSP_DTIM_SIZE ?= 0x00100000
CONFIG_STAMP := $(BUILD_DIR)/build_config.txt
+1 -1
View File
@@ -7,7 +7,7 @@
#endif
#ifndef BSP_UART_BAUDRATE
#define BSP_UART_BAUDRATE 115200UL
#define BSP_UART_BAUDRATE 460800UL
#endif
void bsp_init(void)
+1 -1
View File
@@ -13,7 +13,7 @@ LINKER_SCRIPT ?= $(COMMON_DIR)/linker_ram.ld
MARCH ?= rv64imafdc_zicsr_zifencei
MABI ?= lp64d
BSP_UART_CLOCK_HZ ?= 100000000
BSP_UART_BAUDRATE ?= 115200
BSP_UART_BAUDRATE ?= 460800
BSP_CLINT_TIMEBASE_HZ ?= 1000000
BSP_DTIM_BASE ?= 0x80000000
BSP_DTIM_SIZE ?= 0x00100000
+62 -7
View File
@@ -6,6 +6,22 @@ Bu klasör Genesys2 kartından UART ile alınan GPS WLS konumlarını ve PMOD SP
ve jiroskop biası. Kartın durağan olduğu deneyde zero-velocity update (ZUPT)
uygulanır ve GPS innovation değerlerine aykırı-ölçüm kapısı konur.
Bare-metal ürün firmware'i ana dizinden iki profille üretilebilir:
```sh
# TDK + GPS + ESKF (varsayılan GPS_ESKF_ENABLE=1)
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
# GPS-only; IMU/ESKF kapalı, WLS/Doppler/PPS açık
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=0 fpga-mcs
```
Firmware ve UART kayıt aracının varsayılan hızı `460800` baud'dur. İki profil
aynı MCS/BIN çıktı yolunu kullandığı için ikinci build ilk dosyanın üzerine
yazar.
## Güncel durum ve devralma notu (2026-07-16)
Bu bölüm yeni bir geliştirme oturumunun nereden devam edeceğini tek yerde
@@ -71,6 +87,37 @@ GPS position + Doppler velocity --\
TDK veya ST IMU -> imu_sensor ----/
```
### Doppler ESKF'ye nasıl geliyor?
1. Tracking RTL her 20 ms NAV-bit epoch'unda carrier NCO Q7 değerini,
`ABS_SAMPLE`, remaining code phase ve 20 prompt'un I/Q/WBP toplamlarını
birlikte latch eder. Payload 20 ms sabit kalır; APB wrapper registered
synchronizer ve settle süresinden sonra atomik register bankı ile interrupt
üretir.
2. Firmware coherent mailbox okumasında sequence'i payload öncesi/sonrası
kontrol eder. Carrier değeri için
`doppler_hz = carrier_q7/128 - 4092000`, L1 pseudorange-rate için
`range_rate = -doppler_hz*c/1575420000` kullanılır.
3. Aynı PRN'in 50 Hz snapshot'larında C/N0 `alpha=0.2`, Doppler `alpha=0.05`
software IIR ile yumuşatılır. RTL ham ölçümü korur; hardware Doppler IIR
içermez.
4. En az dört uyduyla C/N0-weighted velocity WLS
`[receiver_vx, receiver_vy, receiver_vz, receiver_clock_drift_mps]`
state'ini çözer. Her observation'dan satellite LOS velocity çıkarılır,
broadcast satellite clock drift eklenir. Inverse normal matrix ve post-fit
residual ECEF velocity covariance'ini üretir.
5. GPS adapter velocity ve 3x3 covariance'i ECEF'ten ENU'ya döndürür,
kart ölçümüne dayalı minimum `2/2/3 m/s` standard-deviation floor'larını
uygular ve position ile aynı capture timestamp'ini korur.
6. Fusion engine gecikmiş position ve velocity'yi aynı geçmiş epoch'unda
uygular. Velocity'nin ayrı 3-DOF `%99.9`, `NIS=16.266` kapısı vardır; bir
velocity reject aynı epoch'taki kabul edilmiş position update'ini bozmaz.
Sonra daha yeni IMU history current-time horizon'a kadar replay edilir.
Bu zincirin RTL/register ayrıntısı
`hardware/external/gps/rtl/trck_src/README.md`, bare-metal WLS ve kart
doğrulaması `soc/software/gps_system/README.md` içindedir.
Python tarafındaki giriş noktaları:
- `serial_capture.py`: UART akışını zaman damgalı CSV olarak toplar;
@@ -149,11 +196,12 @@ konum çözülmesi tek başına PPS üretildiğini kanıtlamaz.
İlk kabul edilen WLS/PPS commit'i yalnız coarse alignment yapar. Ardından faz
hatası en fazla sekiz adet 125 MHz tracking-clock tick'i, yani 64 ns olan beş
ardışık PI update gerekir. Lock kazanıldıktan sonra 256 ns üzerindeki yeni bir
faz hatası lock'u düşürür. WLS receiver-clock bias/pseudorange jitter'ı veya
epoch capture belirsizliği beş ardışık ölçümde 64 ns koşulunu bozarsa konum
gelmeye devam ederken PPS pini sürekli LOW kalabilir. Bu şu an en güçlü
olasılıktır; register ölçmeden eşik değiştirilmemelidir.
ardışık PI update gerekir. RTL reset release eşiği 256 ns'dir; v2.2 production
software profile'ları tek seyrek WLS sıçraması pulse kaybettirmesin diye
release eşiğini runtime `LOOP_CONFIG` ile 1.024 us yapar. WLS receiver-clock
bias/pseudorange jitter'ı veya epoch capture belirsizliği beş ardışık ölçümde
64 ns acquire koşulunu bozarsa konum gelmeye devam ederken PPS pini LOW
kalabilir.
Firmware ancak WLS başarılı, `solution_valid=true`, PPS referans satırı FDE ile
dışlanmamış ve referans kanalın capture sequence'i sıfır değilse PPS mailbox'a
@@ -185,7 +233,7 @@ monitor resume
| Register | Beklenen/yorum |
|---|---|
| `VERSION @ 0x1002a07c` | `0x00020100`; farklıysa ELF/bitstream eşleşmiyor |
| `VERSION @ 0x1002a07c` | Production v2.2 için `0x00020200`; farklıysa ELF/bitstream eşleşmesini kontrol edin |
| `CONTROL @ 0x1002a000` | Enable + track açıkken alt bitler genellikle `0x3` |
| `STATUS @ 0x1002a004` | `0x1`: commit/alignment yok; alt bitler `0x7`: aligned fakat lock değil; bit 11 set ve alt bitler `0xf`: locked/valid |
| `ACTIVE_SEQUENCE @ 0x1002a048` | `0`: firmware hiç geçerli PPS commit'i yapmamış; artıyorsa WLS referansları PPS'ye ulaşıyor |
@@ -197,7 +245,7 @@ lock acquisition/faz jitter'ıdır. `STATUS` lock gösteriyor ve `PULSE_COUNT`
artıyorsa JC10 sinyali JC11 GND referansıyla osiloskop veya logic analyzer'da
ölçülmelidir; pulse saniyede bir yaklaşık 100 ms HIGH'dır.
2026-07-25 canlı Genesys2 ölçümünde `VERSION=0x00020100`,
Erken 2026-07-25 v2.1 canlı Genesys2 ölçümünde `VERSION=0x00020100`,
`CONTROL=0x00000003` ve snapshot `ACTIVE_SEQUENCE=11583` görüldü.
`PULSE_COUNT=314`, PPS core'un resetten beri 314 `pps_out` pulse olayı
oluşturduğunu kanıtladı; post-route top-level yol da sabit LOW değildir.
@@ -218,6 +266,13 @@ işaret eder. Eşik ölçümsüz büyütülmemeli; önce clock-bias/TDOP kalite
outlier reddi veya faz gözlemi süzme stratejisi board A/B testiyle
değerlendirilmelidir.
Bu tarihsel v2.1 teşhisinden sonra v2.2 dinamik PI profilleri, Doppler
clock-drift prediction, bounded WLS clock-bias filtresi, 2 s validity
watchdog/30 s state koruma politikası ve fractional capture correction
eklenmiştir. Güncel sentetik ve kart sonuçları
`soc/software/gps_system/README.md` altındaki PPS bölümlerinde, register/RTL
davranışı `hardware/external/gps/rtl/pps/README.md` içinde tutulur.
## Çalıştırma
UART kaydı:
+1 -1
View File
@@ -14,7 +14,7 @@ import serial
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("--port", default="/dev/ttyUSB2")
parser.add_argument("--baud", type=int, default=115200)
parser.add_argument("--baud", type=int, default=460800)
parser.add_argument("--duration", type=float, default=60.0)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument(
+67 -15
View File
@@ -1,6 +1,8 @@
# GPS System Port Notes
Bu notlar GPS bare-metal yaziliminin VCU118 Rocket SoC portu ve interrupt debug sureci icin yazildi.
Bu notlar GPS bare-metal yaziliminin VCU118/Genesys2 Rocket SoC portunu,
tracking Doppler/C/N0 yolunu, ESKF entegrasyonunu ve interrupt debug surecini
belgeler.
## Uygulama akisi ve dosya sinirlari
@@ -66,6 +68,34 @@ ve raw kuyruga koyar. GPS ISR'leri acquisition/tracking olaylarini kaydeder.
interrupt'lari gelebilecegi icin IMU kuyrugu WLS'den hem once hem sonra drain
edilir; GPS update'i WLS bitis zamaninda degil capture epoch'unda uygulanir.
### ESKF entegrasyonunda yapilanlar
- TDK ICM42688 ve ST LSM6DSOX suruculeri sensor-markasindan bagimsiz
`imu_sensor`/`imu_sample_t` sinirinin arkasina alindi. Her IMU ornegi olcum
aninda monotonik CLINT timestamp'i alir; ISR icinde ESKF matematigi
calismaz.
- Filtre ENU position/velocity, quaternion attitude, accel bias ve gyro bias
iceren 15 hata durumlu ESKF'dir. Prediction her ham IMU orneginde midpoint
mechanization ile calisir; telemetry bolucusu prediction oranini dusurmez.
- GPS WLS position ve Doppler velocity ayni capture timestamp'iyle tek
`fusion_navigation_measurement_t` icinde tasinir. Gecikmis GPS olcumu
history icindeki kendi epoch'una uygulanir; sonraki IMU ornekleri current
time'a kadar tekrar oynatilir.
- Position ve velocity update'lerinin ayri 3-DOF NIS kapilari ve
accept/reject sayaclari vardir. Velocity bozuksa ayni epoch'taki gecerli
position update'i geri alinmaz.
- Doppler WLS ECEF velocity covariance'i ENU'ya dondurulur. Kart verisinde
zayif geometrinin formal covariance'i asiri iyimser yapmamasi icin
horizontal `2.0 m/s`, vertical `3.0 m/s` minimum standard deviation floor'u
uygulanir; daha buyuk formal belirsizlik korunur.
- Durağanlik supervisor'u IMU/GNSS hareket kanitlarini histerezisle
birlestirir ve yalniz guvenli durumda ZUPT/zero-gyro update uygular.
GPS kesintisinde sahte position olcumu uretilmez; dead-reckoning devam eder
ve covariance buyur.
- Kotu ilk fix sonraki tutarli fix'leri surekli NIS reject'e kilitlerse,
timeout ve coklu-fix sureklilik kosuluyla yalniz position state/covariance
yeniden ankrajlanir. Velocity, attitude ve IMU bias state'leri korunur.
## Generic IMU Mimarisi (TDK ve ST)
GPS/ESKF artik dogrudan bir sensor surucusune bagli degildir. Veri yolu:
@@ -129,6 +159,23 @@ Bu durumda GPS acquisition/tracking/WLS ve ham lat-lon yayini calismaya devam
eder; IMU stream'i ve `navigation_fusion` baslatilmaz. UART startup satirinda
`eskf_enabled` ve gercek init sonucu olan `eskf_ready` ayri alanlardir.
Ana proje dizininden Genesys2 MCS uretmek icin:
```sh
# TDK + ESKF; GPS_ESKF_ENABLE verilmezse de varsayilan 1'dir.
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
# GPS-only: tracking, C/N0, Doppler velocity WLS ve PPS calisir.
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=0 fpga-mcs
```
Her iki profil bootloader ve uygulamayi varsayilan `460800` baud ile derler.
Iki komut ayni MCS/BIN yoluna yazdigi icin iki imaj birlikte saklanacaksa
build'ler arasinda profil adiyla kopyalanmalidir. Bu secenekler software
derleme parametresidir; mevcut bitstream ile `fpga-mcs` yeterlidir.
Otomatik WHO_AM_I algilama varsayilandir:
```sh
@@ -446,32 +493,30 @@ Bu kosuda `mcause=5` tekrar etmedi.
## Build ve Debug Komutlari
Build:
Ana dizinden kalici flash imaji:
```sh
make -C /home/ankaoc/Desktop/rocket/rocket-chip/soc/software/gps_system \
BUILD_DIR=/home/ankaoc/Desktop/rocket/rocket-chip/soc/out/software/gps_system \
clean all
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
```
OpenOCD:
```sh
make -C /home/ankaoc/Desktop/rocket/rocket-chip fpga-debug-openocd
make FPGA_BOARD=genesys2 fpga-debug-openocd
```
ELF'i RAM'e yukleyip calistirma:
```sh
/tools/toolchains/rvtc-medany/bin/riscv64-unknown-elf-gdb \
-q /home/ankaoc/Desktop/rocket/rocket-chip/soc/out/software/gps_system/gps_system.elf \
-ex "target extended-remote :3333" \
-ex "monitor reset halt" \
-ex "load" \
-ex "set \$pc = _start" \
-ex "monitor resume" \
-ex "detach" \
-ex "quit"
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-debug-load
```
UART:
```sh
make FPGA_BOARD=genesys2 fpga-uart
```
Durum okumak icin claim register'ini okumadan:
@@ -749,6 +794,13 @@ Gecersiz oranlar reddedilir; sonuc `10..60 dB-Hz` araliginda sinirlanir.
Bir-bit estimator jitter'i ayni PRN'in ard arda olcumlerinde software
IIR'i ile `alpha=0.2` kullanilarak yumusatilir.
RTL snapshot, synchronizer, APB register ve measurement-interrupt ayrintilari
`hardware/external/gps/rtl/trck_src/README.md` icinde belgelenir. Ozetle
payload tracking domaininde yaklasik 20 ms sabit tutulur; valid ve tum alanlar
PCLK'e registered synchronizer ile alinir, iki ek settle cycle'dan sonra
atomik APB bankina kopyalanir. Software sequence-before/payload/sequence-after
okumasiyla coherence'i tekrar dogrular.
Carrier register'i signed Q7 toplam NCO frekansidir. Doppler ve range-rate
donusumu:
+6 -1
View File
@@ -107,7 +107,12 @@ $(BOOTLOADER_IMG): FORCE $(BOOTLOADER_SW_SRCS)
$(APP_ELF): $(APP_SW_SRCS)
test -d "$(APP_SW_DIR)"
$(MAKE) -C "$(APP_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(APP_BUILD_DIR)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" $(SIM_APP_MAKE_ARGS) all
$(MAKE) -C "$(APP_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(APP_BUILD_DIR)" \
GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" \
BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" \
BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" \
BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" \
$(SIM_APP_MAKE_ARGS) all
$(APP_FLASH_BIN): $(APP_ELF)
mkdir -p "$(FLASH_DIR)"
+9 -3
View File
@@ -24,7 +24,7 @@ GDB_HOST ?= localhost
GDB_PORT ?= 3333
OPENOCD_ADAPTER_SPEED ?= 1000
UART_PORT ?= auto
UART_BAUD ?= 115200
UART_BAUD ?= 460800
BOARD ?= genesys2
PART_NAME ?= xc7k325tffg900-2
BOARD_PART ?= digilentinc.com:genesys2:part0:1.1
@@ -69,6 +69,8 @@ FLASH_REGIONS ?= auto
FLASH_FORCE ?= 0
GPS_DEBUG ?= 1
GPS_DEBUG_LEVEL ?= 1
GPS_ESKF_ENABLE ?= 1
IMU_SENSOR ?= auto
FLASH_MCS ?= $(OUT_DIR)/flash/genesys2_rocket.mcs
FLASH_BIN ?= $(OUT_DIR)/flash/genesys2_rocket.bin
@@ -172,6 +174,8 @@ help:
' FLASH_FORCE=$(FLASH_FORCE) # 1 forces unchanged regions too' \
' APP=$(APP)' \
' APP_ELF=$(APP_ELF)' \
' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \
' IMU_SENSOR=$(IMU_SENSOR)' \
' UART_PORT=$(UART_PORT)' \
' ETH_RF_IFACE=$(ETH_RF_IFACE)' \
' ETH_RF_INPUT=$(ETH_RF_INPUT)' \
@@ -209,15 +213,17 @@ fpga-config:
' CFGMEM_PART=$(CFGMEM_PART)' \
' UART_PORT=$(UART_PORT)' \
' UART_BAUD=$(UART_BAUD)' \
' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \
' IMU_SENSOR=$(IMU_SENSOR)' \
' ETH_RF_IFACE=$(ETH_RF_IFACE)' \
' ETH_RF_INPUT=$(ETH_RF_INPUT)' \
' ETH_RF_SAMPLE_FORMAT=$(ETH_RF_SAMPLE_FORMAT)'
software:
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" bootloader flash-image
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" bootloader flash-image
$(APP_ELF): FORCE
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" app
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" app
chisel: software
@cd "$(REPO_DIR)"
+15 -2
View File
@@ -16,7 +16,7 @@ Varsayilanlar:
SoC/fabric clock : 50 MHz
GPS acquisition : 80 MHz
GPS tracking : 125 MHz
UART baud : 115200
UART baud : 460800
App flash offset : 0x01800000
QSPI flash : 32 MiB S25FL256S
RF input mode : pmod
@@ -181,7 +181,7 @@ make -C targets/fpga/genesys2 bitstream
make -C targets/fpga/genesys2 program-fpga
make -C targets/fpga/genesys2 program-flash
make -C targets/fpga/genesys2 program-app APP=gps_system
make -C targets/fpga/genesys2 uart-listen UART_PORT=/dev/ttyUSB1 UART_BAUD=115200
make -C targets/fpga/genesys2 uart-listen UART_PORT=/dev/ttyUSB1
```
Kok Makefile uzerinden:
@@ -190,12 +190,25 @@ Kok Makefile uzerinden:
make FPGA_BOARD=genesys2 fpga-config
make FPGA_BOARD=genesys2 fpga-bitstream
make FPGA_BOARD=genesys2 fpga-program
# TDK + GPS + ESKF, UART varsayilani 460800
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
# GPS-only; tracking, Doppler velocity WLS ve PPS aktif
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=0 fpga-mcs
```
`program-app APP=gps_system` yalniz application flash bolgesini derleyip
programlar. Tracking mailbox registerlari ve synchronizer RTL degisikligi
bitstream gerektirir; Doppler IIR katsayisi/yazilim degisikligi ise bitstream
gerektirmez, yalniz yeni `gps_system` uygulamasinin yuklenmesi yeterlidir.
`GPS_ESKF_ENABLE` verilmezse ESKF aciktir. ESKF kapali profilde IMU ve fusion
baslatilmaz; GPS acquisition/tracking, C/N0, Doppler velocity WLS, ham konum ve
PPS calismaya devam eder. Iki profil ayni `genesys2_rocket.mcs/.bin` cikti
yoluna yazdigi icin birlikte saklanacaksa build sonrasinda yeniden
adlandirilmalidir.
`debug-load APP=gps_system` ELF'i GDB ile DTIM/RAM'e yukler; hizli kart testi
icin uygundur fakat power-cycle/reset sonrasinda flash'taki eski uygulama geri
+10 -4
View File
@@ -24,7 +24,7 @@ GDB_HOST ?= localhost
GDB_PORT ?= 3333
OPENOCD_ADAPTER_SPEED ?= 1000
UART_PORT ?= /dev/ttyUSB2
UART_BAUD ?= 115200
UART_BAUD ?= 460800
BOARD ?= vcu118
PART_NAME ?= xcvu9p-flga2104-2L-e
BOARD_PART ?= xilinx.com:vcu118:part0:2.4
@@ -68,6 +68,8 @@ FLASH_REGIONS ?= auto
FLASH_FORCE ?= 0
GPS_DEBUG ?= 1
GPS_DEBUG_LEVEL ?= 4
GPS_ESKF_ENABLE ?= 1
IMU_SENSOR ?= auto
FLASH_MCS ?= $(OUT_DIR)/flash/vcu118_rocket.mcs
FLASH_BIN ?= $(OUT_DIR)/flash/vcu118_rocket.bin
@@ -171,6 +173,8 @@ help:
' FLASH_FORCE=$(FLASH_FORCE) # 1 forces unchanged regions too' \
' APP=$(APP)' \
' APP_ELF=$(APP_ELF)' \
' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \
' IMU_SENSOR=$(IMU_SENSOR)' \
' UART_PORT=$(UART_PORT)' \
' ETH_RF_IFACE=$(ETH_RF_IFACE)' \
' ETH_RF_INPUT=$(ETH_RF_INPUT)' \
@@ -207,13 +211,15 @@ fpga-config:
' FLASH_INTERFACE=$(FLASH_INTERFACE)' \
' CFGMEM_PART=$(CFGMEM_PART)' \
' UART_PORT=$(UART_PORT)' \
' UART_BAUD=$(UART_BAUD)'
' UART_BAUD=$(UART_BAUD)' \
' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \
' IMU_SENSOR=$(IMU_SENSOR)'
software:
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" bootloader flash-image
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" bootloader flash-image
$(APP_ELF): FORCE
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" app
@$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" app
chisel: software
@cd "$(REPO_DIR)"