Entity: spi_host_fsm

Diagram

int NumCS clk_i rst_ni en_i command_t command_i command_valid_i sr_wr_ready_i sr_rd_ready_i sw_rst_i command_ready_o sck_o [NumCS-1:0] csb_o [3:0] sd_en_o cmd_end_o wr_en_o rd_en_o sample_en_o shift_en_o [1:0] speed_o full_cyc_o rx_stall_o tx_stall_o active_o

Description

Copyright lowRISC contributors. Licensed under the Apache License, Version 2.0, see LICENSE for details. SPDX-License-Identifier: Apache-2.0

Core Implemenation module for Serial Peripheral Interface (SPI) Host IP.

Generics

Generic name Type Value Description
NumCS int 1

Ports

Port name Direction Type Description
clk_i input
rst_ni input
en_i input
command_i input command_t
command_valid_i input
command_ready_o output
sck_o output
csb_o output [NumCS-1:0]
sd_en_o output [3:0]
cmd_end_o output
wr_en_o output
sr_wr_ready_i input
rd_en_o output
sr_rd_ready_i input
sample_en_o output
shift_en_o output
speed_o output [1:0]
full_cyc_o output
rx_stall_o output
tx_stall_o output
active_o output
sw_rst_i input

Signals

Name Type Description
isIdle logic
clkdiv logic [15:0]
clkdiv_q logic [15:0]
clk_cntr_q logic [15:0]
clk_cntr_d logic [15:0]
clk_cntr_en logic
csid logic [CSW-1:0]
csid_q logic [CSW-1:0]
csnidle logic [3:0]
csntrail logic [3:0]
csnlead logic [3:0]
csnidle_q logic [3:0]
csntrail_q logic [3:0]
csnlead_q logic [3:0]
full_cyc logic
cpha logic
cpol logic
full_cyc_q logic
cpha_q logic
cpol_q logic
cmd_speed logic [1:0]
cmd_speed_q logic [1:0]
cmd_wr_en logic
cmd_wr_en_q logic
cmd_rd_en logic
cmd_rd_en_q logic
cmd_len logic [8:0] cmd_len needs no data latching as it is only used at the very start of a command. The corresponding register, cmd_len_q, would create a warning at synthesis
csaat logic
csaat_q logic
bit_cntr_d logic [2:0]
bit_cntr_q logic [2:0]
byte_cntr_d logic [8:0]
byte_cntr_q logic [8:0]
lead_cntr_d logic [3:0]
idle_cntr_d logic [3:0]
trail_cntr_d logic [3:0]
lead_cntr_q logic [3:0]
idle_cntr_q logic [3:0]
trail_cntr_q logic [3:0]
last_bit logic
last_byte logic
state_changing logic
byte_starting logic
byte_starting_cpha0 logic
byte_starting_cpha1 logic
bit_shifting logic
bit_shifting_cpha0 logic
bit_shifting_cpha1 logic
byte_ending logic
byte_ending_cpha0 logic
byte_ending_cpha1 logic
lead_starting logic
trail_starting logic
idle_starting logic
sample_en_d logic
sample_en_q logic
sample_en_q2 logic
switch_required logic
fsm_en logic
new_command logic
csb_single_d logic
csb_q logic [NumCS-1:0]
sck_d logic
sck_q logic
wr_en_internal logic
rd_en_internal logic
sample_en_internal logic
shift_en_internal logic
stall logic
stall_q logic
prestall_st_q spi_host_st_e
prestall_st_d spi_host_st_e
actual_st_d spi_host_st_e
actual_st_q spi_host_st_e
stall_resolve logic All register updates freeze when a stall is detected. The definition of the stall signal looks ahead to determine whether a conflict is looming. Thus stall depends on actual_st_d. Making the actual state depend on stall would create a circular logic loop, and lint errors. Therefore stall is applied here, not in the previous always_comb block;
shift_size logic [2:0]
start_bit logic [2:0]

Types

Name Type Description
spi_host_st_e enum logic [2:0] {
Idle,
WaitLead,
InternalClkLow,
InternalClkHigh,
WaitTrail,
WaitIdle,
CSBSwitch,
IdleCSBActive }

Processes

Type: always_comb

Type: always_ff

Type: always_comb

Description
FSM main body: Controls state transitions and command_ready_o signaling
command_ready_o Note: New commands should may be acknowled as we enter into the idle condition with two subtle exceptions: 1. During stall conditions the FSM does not actually perform transitions and so command_ready_o should be held low during stalls regardless of the current state 2. In cases where the next segment is for a different CSID, command_ready_o is held explicitly low to enforce CSNTRAIL, CSIDLE requirements for the previous segment. Holding command_ready_o low in this case defers updates of the internal state variables

Type: always_ff

Type: always_ff

Description
We can calculate byte transitions for CHPA=1 by noting that in this implmentation, the sck edges have a 1-1 correspondence with FSM transitions. New bytes are loaded exactly one state transition behind the time when they would be loaded if CPHA=0

Type: always_comb

Type: always_ff

Type: always_ff

Type: always_comb

Type: always_comb