FPGA Tabanlı Otonom Park Simülatörü - İrem Karakurt
← Ana Sayfaya Dön
Dijital Donanım Tasarımı Verilog HDL ADAS Mimarisi

RTL Seviyesinde Otonom Park Simülatörü: FSM, SIPO ve Register File Entegrasyonu

Geliştirme: Intel Quartus Prime
FPGA Geliştirme Ortamı

Sistem Mimarisine Genel Bakış

Modern Gelişmiş Sürücü Destek Sistemleri (ADAS), sensör verilerini işlemek için genellikle yüksek performanslı mikroişlemciler kullanır. Ancak bu projenin temel mühendislik hedefi, park algoritmalarını yazılımsal bir işlemci (CPU) kullanmadan, doğrudan Register Transfer Level (RTL) donanım lojiği ile sentezlemektir.

Sistem; ultrasonik mesafe sensörlerinden gelen asenkron verileri senkronize eden bir veri yolu (datapath), dinamik araç parametrelerini tutan bir bellek bloğu (Register File) ve tüm manevra kinematiğini yöneten bir ana kontrolcüden (FSM) oluşmaktadır.

Datapath: Veri Edinimi ve Parametre Yönetimi

1. SIPO Shift Register ile Veri Serileştirmesi

Sensörlerden okunan veriler, FPGA'in saat frekansına (clock domain) göre çok daha yavaş bir seri formatta ulaşır. Gelen bu asenkron palslar, önce 2-stage flip-flop synchronizer devresinden geçirilerek metastabilite (metastability) riskine karşı korunur. Ardından tasarlanan SIPO (Serial-In Parallel-Out) Shift Register modülüne beslenerek, FSM'in tek bir saat vuruşunda işleyebileceği 16-bitlik paralel mesafe vektörlerine dönüştürülür.

2. Register File (Yazmaç Dosyası) Mimarisi

Aracın boyutları, direksiyon tam tur açısı, güvenli çarpışma mesafesi ve minimum paralel park alanı uzunluğu gibi kritik parametreler hard-coded (sabit) değildir. Bu değerler, sisteme entegre edilen çok portlu bir Register File içerisinde tutulur. Kontrol ünitesi, ihtiyaç duyduğu parametrenin adresini Register File'a gönderir ve okunan eşik değeri, ALU benzeri bir karşılaştırıcıda SIPO'dan gelen anlık sensör verisiyle kıyaslanır.

Kontrol Ünitesi: Otonom Manevra FSM'i

Sistemin ana denetleyicisi, sensör girdilerine ve Register File'dan alınan eşik değerlerine göre durumlar arası geçiş yapan senkron bir Moore/Mealy melez Durum Makinesidir (Finite State Machine). Sistem state'leri şu şekilde kodlanmıştır:

  • ST_IDLE: Sistem hazırda bekler. Sensör kalibrasyonları yapılır.
  • ST_SCAN_SLOT: Araç ileri hareket ederken SIPO'dan gelen paralel veri, Register File'daki MIN_PARK_LENGTH ile kıyaslanır. Yeterli boşluk bulunduğunda bir sonraki state tetiklenir.
  • ST_ALIGN: Geri manevra için doğru kinematik başlangıç noktasına ulaşılana kadar araç hizalanır.
  • ST_REVERSE_STEER: Direksiyon tam açıya kilitlenir, arka sensörler sürekli taranır.
  • ST_STRAIGHTEN: Araç kaldırıma paralel hale geldiğinde direksiyon toplanır.
  • ST_DONE: Manevra tamamlanır, sistem kendini güvenli konuma alır.

Verilog RTL Implementasyonu Örneği

Aşağıdaki kod bloğu, FSM'in SIPO modülünden gelen paralel veriyi ve Register File'dan okunan eşik değerini değerlendirerek park alanı arama mantığını nasıl işlettiğini gösteren basitleştirilmiş bir kesittir:

`timescale 1ns / 1ps

module parking_fsm #(
    parameter DATA_WIDTH = 16
)(
    input wire clk,
    input wire rst_n,
    input wire park_enable,
    input wire [DATA_WIDTH-1:0] sipo_sensor_data, // SIPO'dan gelen paralel veri
    input wire [DATA_WIDTH-1:0] reg_threshold,    // Register File'dan okunan eşik
    
    output reg [2:0] motor_ctrl,
    output reg [4:0] reg_read_addr,
    output reg park_success
);

    // FSM State Encoding
    localparam ST_IDLE         = 3'b000;
    localparam ST_SCAN_SLOT    = 3'b001;
    localparam ST_ALIGN        = 3'b010;
    localparam ST_REVERSE      = 3'b011;
    localparam ST_DONE         = 3'b100;
    
    // Register File Address Mapping
    localparam ADDR_MIN_LENGTH = 5'h01;
    localparam ADDR_CRASH_DIST = 5'h02;

    reg [2:0] current_state, next_state;

    // Sequential State Register (Senkron Reset)
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            current_state <= ST_IDLE;
        else
            current_state <= next_state;
    end

    // Combinational Next State Logic
    always @(*) begin
        // Default atamalar (Latch oluşumunu engellemek için)
        next_state = current_state;
        reg_read_addr = ADDR_MIN_LENGTH;
        
        case (current_state)
            ST_IDLE: begin
                if (park_enable) 
                    next_state = ST_SCAN_SLOT;
            end
            
            ST_SCAN_SLOT: begin
                // Register File'dan park uzunluğu eşiği okunur
                reg_read_addr = ADDR_MIN_LENGTH; 
                
                // SIPO'dan gelen anlık veri eşiği geçiyorsa manevraya başla
                if (sipo_sensor_data >= reg_threshold) begin
                    next_state = ST_ALIGN;
                end
            end
            
            ST_ALIGN: begin
                next_state = ST_REVERSE;
            end
            
            default: next_state = ST_IDLE; // Hata toleransı (Safe state)
        endcase
    end

    // Output Logic (Moore Type)
    always @(posedge clk) begin
        if (!rst_n) begin
            motor_ctrl <= 3'b000;
            park_success <= 1'b0;
        end else begin
            case (current_state)
                ST_SCAN_SLOT: motor_ctrl <= 3'b001; // İleri düşük hız
                ST_REVERSE:   motor_ctrl <= 3'b010; // Geri manevra
                ST_DONE: begin
                    motor_ctrl <= 3'b000; // Fren
                    park_success <= 1'b1;
                end
            endcase
        end
    end
endmodule

Sentez ve Optimizasyon Sonuçları

Tasarım Intel Quartus Prime üzerinde sentezlendiğinde, modüller arası sinyal gecikmeleri (propagation delay) Timing Analyzer ile optimize edilmiş ve FSM içerisindeki muhtemel Setup/Hold Time ihlalleri senkronizasyon katmanları eklenerek çözülmüştür. Bu mimari, mikrodenetleyici tabanlı yazılımsal döngülere (while/for loops) kıyasla çok daha düşük gecikme (latency) ve yüksek determinizm sunarak otomotiv güvenlik standartlarına göz kırpmaktadır.