Project: Project Constellation (Z-Modem) Status: LOCKED (설계 확정)
본 프로젝트의 모든 내부 모듈은 데이터 무결성을 보장하기 위해 Ready/Valid Handshake 프로토콜을 표준으로 사용한다.
- Valid (Source → Sink): 데이터가 유효함을 알림. Sink가 받을 때까지(
Ready=1) 데이터를 유지해야 함. - Ready (Sink → Source): 데이터를 받을 준비가 되었음을 알림.
- Transaction:
Valid와Ready가 동시에 High(1)인 클럭 상승 에지에서 데이터 이동 발생. - Exception:
UART RX와QPSK Demod같은 외부/스트림 입력은 흐름 제어가 불가능하므로 Valid Only (Push) 방식을 사용한다.
각 구간별 속도 차이(Mismatch)에 따른 흐름 제어 정책을 확정한다.
- PC → FPGA (Ingress): UART 속도(11.5KB/s)가 매우 느리므로, FPGA 내부 로직은 항상 여유가 있음. 별도 Back-pressure 불필요.
- Internal Logic (AES ↔ Buffers): AES(0.5µs)가 Serializer/UART TX보다 훨씬 빠를 수 있음.
- 결정: 후단 모듈(Serializer, Unpacker)이 꽉 차면 AES는 연산을 멈추거나 결과를 Hold 해야 함. (Reverse Ready 신호 필수)
- Rx Front-end: 무선 신호는 멈출 수 없음.
- 결정:
De-serializer는 들어오는 데이터를 무조건 받아야 함. 만약AES Decryptor가 막혀서 버퍼가 넘치면 데이터 유실(Drop)을 허용함. (Phase 1 기준)
- 결정:
Type: Valid-Only Source Desc: 비동기 시리얼 입력을 받아 1바이트 병렬 데이터로 변환.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | 100MHz System Clock |
| reset | 1 | Input | Active High Synchronous Reset |
| rx_serial | 1 | Input | External Pin (UART RX) |
| rx_data | 8 | Output | 수신된 8-bit 데이터 |
| rx_valid | 1 | Output | 1 Clock Pulse (Data Valid) |
Type: Simple Sink / Handshake Source Desc: 8비트 스트림을 128비트 블록으로 변환 (Accumulator).
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| rx_data | 8 | Input | From UART RX |
| rx_valid | 1 | Input | From UART RX |
| batch_data | 128 | Output | 16 Bytes 누적 데이터 |
| batch_valid | 1 | Output | Start Trigger (To AES) |
| aes_ready | 1 | Input | AES가 Idle 상태인지 확인 |
Type: Handshake Sink / Handshake Source Desc: 128비트 평문을 암호화. 후단(Serializer) 상태 확인 기능 포함.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| key | 128 | Input | Master Key (From Top) |
| plaintext | 128 | Input | From Batcher |
| start | 1 | Input | = batch_valid |
| ready | 1 | Output | Idle 상태 알림 (To Batcher) |
| ciphertext | 128 | Output | 암호화 결과 데이터 |
| done | 1 | Output | 완료 알림 (To Serializer) |
| out_ready | 1 | Input | Serializer가 수신 가능한지 확인 |
Type: Handshake Sink / Valid Source Desc: 128비트 암호문을 버퍼링하고 2비트씩 QPSK 모듈로 공급.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| cipher_data | 128 | Input | From AES Encrypt |
| load_en | 1 | Input | = done (AES 완료) |
| buffer_ready | 1 | Output | 버퍼 수신 가능 알림 (To AES) |
| symbol_data | 2 | Output | 2-bit 심볼 (To Modem) |
| symbol_valid | 1 | Output | 1=Modulate, 0=Carrier Only |
| mod_req | 1 | Input | Modem의 데이터 요청 신호 |
Type: Stream Sink / PDM Source Desc: I/Q 매핑, 반송파 변조 및 PDM 변환. 능동적으로 데이터를 요청함.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| fcw | 32 | Input | Frequency Control Word (1MHz) |
| symbol_in | 2 | Input | From Serializer |
| symbol_en | 1 | Input | = symbol_valid |
| mod_req | 1 | Output | "다음 심볼 내놔" (To Serializer) |
| pdm_out | 1 | Output | To Antenna (1-bit PDM) |
Type: ADC Source / Valid Source Desc: ADC 입력을 복조. Sync가 맞았을 때만 Valid 출력.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| rx_in | 16 | Input | From ADC (Signed) |
| demod_symbol | 2 | Output | 복원된 2-bit 심볼 |
| demod_valid | 1 | Output | Sync 완료 및 데이터 유효 알림 |
Type: Valid Sink / Handshake Source Desc: 2비트 심볼을 128비트 블록으로 변환 (SIPO).
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| symbol_in | 2 | Input | From Demodulator |
| symbol_valid | 1 | Input | From Demodulator |
| cipher_block | 128 | Output | 16 Bytes 누적 암호문 |
| block_valid | 1 | Output | Start Trigger (To AES) |
| dec_ready | 1 | Input | AES Decryptor 상태 확인 |
Type: Handshake Sink / Handshake Source Desc: 128비트 암호문을 평문으로 복호화. Unpacker 상태 확인 필수.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| key | 128 | Input | Master Key (Tx와 동일) |
| ciphertext | 128 | Input | From De-serializer |
| start | 1 | Input | = block_valid |
| ready | 1 | Output | Idle 상태 알림 (To De-serializer) |
| plaintext | 128 | Output | 복호화 결과 데이터 |
| done | 1 | Output | 완료 알림 (To Unpacker) |
| unpack_ready | 1 | Input | Unpacker가 수신 가능한지 확인 |
Type: Handshake Sink / Handshake Source Desc: 128비트 평문을 1바이트씩 쪼개어 UART TX로 전달.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| plain_block | 128 | Input | From AES Decrypt |
| load_en | 1 | Input | = done |
| buffer_ready | 1 | Output | 버퍼 수신 가능 알림 (To AES) |
| tx_data | 8 | Output | 1 Byte 데이터 |
| tx_start | 1 | Output | 전송 요청 (To UART TX) |
| uart_busy | 1 | Input | UART 전송 중인지 확인 |
Type: Handshake Sink / Serial Source Desc: 1바이트 데이터를 PC로 직렬 전송.
| Signal Name | Width | Direction | Description |
|---|---|---|---|
| clk | 1 | Input | System Clock |
| reset | 1 | Input | System Reset |
| tx_data | 8 | Input | From Unpacker |
| tx_start | 1 | Input | 전송 시작 요청 |
| tx_busy | 1 | Output | "전송 중" 알림 (Back-pressure) |
| tx_serial | 1 | Output | External Pin (To PC) |