
The PCS Link Controller LITE is a compact, area-optimized Physical Coding Sublayer (PCS) block designed to mimic high-speed serial communication. It implements an 8b/10b encoding/decoding pipeline, asynchronous clock domain crossing (CDC) FIFOs, and a Link Training and Status State Machine (LTSSM) arbiter that manages a half-duplex, bidirectional shared data bus. The system operates across two asynchronous clock domains: a faster 66 MHz Link Clock for higher-speed serial transmission and a slower 10 MHz System Clock for parallel data handling.
Clock Configuration
Before physical testing, the user must first program the demoboard's RP2040 microcontroller (using pcs_lite_clocks.py) to configure a 2nd clock: the slower 10 MHz System Clock (clk_sys) on the ui_in[0] pin.
Testing
Option A: Standalone Functional Test (MicroPython Script)
Users can validate the functional logic using the demoboard without external hardware by flashing the provided post_sil_test.py and encoder.py scripts to the onboard RP2040. The script manually drives the clocks to bit-bang a continuous sequence of random test vectors. It defaults to TX mode, generating parallel data and verifying the 10-bit serialized output. Sending m in the console will command the LTSSM to flip the bus to RX mode, streaming 10-bit symbols into the ASIC and checking the decoded parallel output.
(Note: Due to the GPIO execution limits of MicroPython, this script operates in the low kHz range to validate functional logic. True 66 MHz at-speed validation requires the FPGA setup in Option B).
Option B: At-Speed Validation (FPGA Integration) To physically validate the bidirectional link at the target 66 MHz, the demoboard can be interfaced with a 3.3V FPGA.
ui_in[2] and uo_out[1]) are required for the rx_req and rx_ack handshaking during mode-switching.Optional: 3.3V FPGA and 5 jumper wires for hardware validation.
| # | Input | Output | Bidirectional |
|---|---|---|---|
| 0 | clk_sys (10MHz) | serial_out | data_bus[0] |
| 1 | serial_in | rx_ack | data_bus[1] |
| 2 | rx_req | link_lock_out | data_bus[2] |
| 3 | tx_valid | occupied | data_bus[3] |
| 4 | rx_valid | data_bus[4] | |
| 5 | data_bus[5] | ||
| 6 | data_bus[6] | ||
| 7 | data_bus[7] |