Warum wird das SATA ALIGN-Grundelement auf den RXDATA-Ausgang des GTXE2-Transceivers der 7er-Serie verschoben oder vertauscht?

Ich verwende einen GTXE2-Transceiver der Xilinx 7-Serie, der als SATA-Host-PHY konfiguriert ist. Dieser Transceiver ist mit einem SATA-Host-Controller und einem SATA-Gen1-Gerät verbunden.

Während der Initialisierung kann ich COMRESET, COMINIT und COMWAKE von Host und Gerät sehen. Sie wurden auf RXDATA/TXDATA erfasst. TX/RXELECIDLE werden korrekt deaktiviert. Der Host-Controller ist in der Lage, eine vollständige OOB-Sequenz zu empfangen und darauf zu antworten.

Danach sendet der Host D10.2mit 1,5 Gbit/s, um die Geschwindigkeitsaushandlung zu starten. Das Gerät antwortet mit A L ICH G N P Primitive, die mit 1,5 Gbit/s gesendet werden.

Von RXDATA kann ich jedoch nur D27.3 D10.2 D10.2 K28.5Symbole sehen, die nur für einen Taktzyklus erscheinen, nämlich 20'haaaaa, gefolgt von 20'h5f0e4. Danach sehe ich 20'h55555, gefolgt von 20'h5f0e4. Das D27.3und K28.5Zeichen schien korrekt zu sein. D10.2schien entweder vertauscht oder verschoben zu sein. Weil der GTXE2-Transceiver nicht decodieren kann A L ICH G N P , die Geschwindigkeitsaushandlung ist fehlgeschlagen.

Ich habe RXCDR_CFGauf (72'h0380008BFF40100008) eingestellt. Das FPGA ist mit einem Gen1-Gerät verbunden.

Ich habe ein Steuersignal implementiert, das ausgelöst wird, RXCDRHOLDwenn ich 20'haaaaa finde, gefolgt von 20'h5f0e4 im Datenstrom. Nachdem ich das holdSignal losgelassen habe, wird es 20'h55555 und 20'h5f0e4. Wenn ich nicht freigebe RXCDRHOLD, sehe ich Müll an RXDATA. Es scheint also, dass das Freigeben RXCDRHOLDnur einen Teil der verbessert A L ICH G N P Figuren. K28.5und D27.3hatte recht. D10.2Bit getauscht oder verschoben wird.

Ich bin auf einen anderen Beitrag gestoßen, in dem der Autor möglicherweise ähnliche Probleme hatte. Er modifizierte RXCDR_CFG: Konfigurieren eines GTXE2-Transceivers der 7er-Serie für Serial-ATA (Gen1/2/3)

Ich habe mich gefragt, ob jemand dieses Problem mit GTXE2-Transceivern der Xilinx 7-Serie erlebt hat.

Könnten Sie bitte eine Wellenform posten RDXDATA, die RXELECIDLE, RXCDRHOLD, und enthält RXCOMWAKEDET.
Was ist das Gerät? (HDD, SSD, Hersteller, Baujahr). Haben Sie den Xilinx Core Generator oder das Äquivalent von Vivado verwendet, um die GTXE2-Instanz zu generieren? => Der generierte Code ist fehlerhaft und teilweise nicht korrekt für das SATA-Protokoll. Was ist dein Testboard? Wie schließen Sie Ihr FPGA an ein SATA-Kabel an: SFP-Adapter, SMA-Adapter, ...?
Wann genau veröffentlichst du RXCDRHOLD? Sie müssen warten, bis die vollständige OOB-Handshake-Phase vorbei ist, weil die OOB-Bursts gefüllt sind A L ICH G N P Symbole. Ich warte auch auf mindestens 63 aufeinanderfolgende erkannte ALIGN-Symbole. Der ALIGN-Stream vom Gerät ist also stabil.
Wir haben ein anderes SATA-Laufwerk ausprobiert: Western Digital WD Green WD10EADS Ich sehe, dass die Ausgabe von rxdata_out von instant gtwizard_0_GT invertiert ist. gtwizard_0_GT ist der Wrapper von GTXE2_CHANNEL, generiert von vivado. Ich habe erwartet, wenn GTX ALIGN-Primitive sendet, es erscheint als Burst von: 0011100100 | 1010101010 | 1010101010 | 0101111100 D27.3 D10.2 D10.2 K28.5 Vom Chipscope sehe ich, dass das Bit invertiert ist: 1100011011 | 0101010101 | 0101010101 | 1010000011
Ich habe einen kleinen Hack @rxdata angewendet. weisen Sie rx_data_out_new = ~rxdata_out zu. Ich frage mich, ob Sie das schon einmal gesehen haben? Es scheint mir, dass ich von verschiedenen SATA-Laufwerken unterschiedliche Ergebnisse erhalten würde.
Endlich kann ich das Laufwerk mit dem Hack verbinden.

Antworten (1)

Ich habe noch einmal über dein Inversionsproblem nachgedacht. Das Problem ist, dass Sie oder Ihre Platine oder Ihr Gerät die RX+ und RX- Drähte für den Transceiver-Eingang vertauscht haben.

Ihre GTXE2 ist für einen 20-Bit-Bus und keine 8B/10B-Codierung konfiguriert, sodass die direkte Inversion jedes Bits, das in Ihrer Messung angezeigt wird, durch die falsche Polarität an den Eingangspins verursacht wird. Sie können die Polaritätsumkehrung ( RXPOLARITY) für RX im Transceiver aktivieren. Die Option wird verwendet, um die Pins zu tauschen, da PCB-Designer die Drähte tauschen könnten, um Sprünge und Vias zu reduzieren.

Sie sollten auch in Ihrem Platinenschaltplan nachsehen, ob es einen Hinweis auf vertauschte Drähte gibt.

Ich habe die xdc-Datei für RXN/P geändert, indem ich von set_property PACKAGE_PIN AN3 [get_ports MOCARXN] set_property PACKAGE_PIN AN4 [get_ports MOCARXP] zu: set_property PACKAGE_PIN AN3 [get_ports MOCARXP] set_property PACKAGE_PIN AN4 [get_ports MOCARXN] geändert hat. Laut Chipscope sehe ich RXDATA als 20'hA0F1B, gefolgt von 20'h55555. Es ist das gleiche Ergebnis, wenn ich den RXP/N-Standort nicht ändere.
Sie können die Pins nicht über XDC ändern. Die XDC-Einstellung wird vom Mapping-Schritt benötigt, um den richtigen Ort zu finden, mehr nicht. Transceiver-Pins sind fest und können daher nicht von XDC getauscht werden. Sie müssen 1) bestätigen, ob der PCB-Designer die P- und N-Drähte vertauscht hat, und wenn ja, 2) müssen Sie ändern/aktivieren RXPOLARITY. Es ist ein Transceiver-Generikum.
@sunni Hast du nach dem RXPOLARITYParameter und deinem Schaltplan gesucht? Habe ich recht?