151 lines
5.8 KiB
Systemverilog
151 lines
5.8 KiB
Systemverilog
// Generated by CIRCT firtool-1.151.0
|
|
module TLFpgaSPI(
|
|
input clock,
|
|
reset,
|
|
output auto_in_a_ready,
|
|
input auto_in_a_valid,
|
|
input [2:0] auto_in_a_bits_opcode,
|
|
input [1:0] auto_in_a_bits_size,
|
|
input [5:0] auto_in_a_bits_source,
|
|
input [28:0] auto_in_a_bits_address,
|
|
input [7:0] auto_in_a_bits_mask,
|
|
input [63:0] auto_in_a_bits_data,
|
|
input auto_in_d_ready,
|
|
output auto_in_d_valid,
|
|
output [2:0] auto_in_d_bits_opcode,
|
|
output [1:0] auto_in_d_bits_size,
|
|
output [5:0] auto_in_d_bits_source,
|
|
output [63:0] auto_in_d_bits_data,
|
|
output [3:0] auto_dq_oe_out,
|
|
auto_dq_out_out,
|
|
input [3:0] auto_dq_in_in,
|
|
output auto_csn_out,
|
|
auto_sck_out
|
|
);
|
|
|
|
wire _out_back_front_q_io_deq_valid;
|
|
wire _out_back_front_q_io_deq_bits_read;
|
|
wire [8:0] _out_back_front_q_io_deq_bits_index;
|
|
wire [63:0] _out_back_front_q_io_deq_bits_data;
|
|
wire [7:0] _out_back_front_q_io_deq_bits_mask;
|
|
reg csn;
|
|
reg sck;
|
|
reg quad;
|
|
reg cpol;
|
|
reg cpha;
|
|
reg [31:0] txShift;
|
|
reg [31:0] rxShift;
|
|
reg [5:0] bitsLeft;
|
|
reg busy;
|
|
reg [2:0] div;
|
|
wire _out_out_bits_data_WIRE_1 =
|
|
_out_back_front_q_io_deq_bits_index[8:1] == 8'h0;
|
|
wire out_woready_1 =
|
|
_out_back_front_q_io_deq_valid & auto_in_d_ready & ~_out_back_front_q_io_deq_bits_read
|
|
& ~(_out_back_front_q_io_deq_bits_index[0]) & _out_out_bits_data_WIRE_1;
|
|
always @(posedge clock) begin
|
|
if (reset) begin
|
|
csn <= 1'h1;
|
|
sck <= 1'h0;
|
|
quad <= 1'h0;
|
|
cpol <= 1'h0;
|
|
cpha <= 1'h0;
|
|
txShift <= 32'h0;
|
|
rxShift <= 32'h0;
|
|
bitsLeft <= 6'h0;
|
|
busy <= 1'h0;
|
|
div <= 3'h0;
|
|
end
|
|
else begin
|
|
automatic logic _GEN;
|
|
automatic logic _sampleEdge_T = sck != cpol;
|
|
automatic logic sampleEdge;
|
|
automatic logic advanceEdge;
|
|
automatic logic [5:0] _GEN_0;
|
|
automatic logic _GEN_1;
|
|
automatic logic _GEN_2;
|
|
automatic logic _out_T_6;
|
|
automatic logic _out_T_19 =
|
|
out_woready_1
|
|
& (&{{8{_out_back_front_q_io_deq_bits_mask[7]}},
|
|
{8{_out_back_front_q_io_deq_bits_mask[6]}},
|
|
{8{_out_back_front_q_io_deq_bits_mask[5]}},
|
|
{8{_out_back_front_q_io_deq_bits_mask[4]}}}) & ~busy;
|
|
_GEN = ÷
|
|
sampleEdge = cpha ? _sampleEdge_T : sck == cpol;
|
|
advanceEdge = cpha ? _sampleEdge_T : ~sampleEdge;
|
|
_GEN_0 = {3'h0, quad ? 3'h4 : 3'h1};
|
|
_GEN_1 = bitsLeft <= _GEN_0;
|
|
_GEN_2 = advanceEdge & _GEN_1;
|
|
_out_T_6 =
|
|
out_woready_1
|
|
& (&{{8{_out_back_front_q_io_deq_bits_mask[3]}},
|
|
{8{_out_back_front_q_io_deq_bits_mask[2]}},
|
|
{8{_out_back_front_q_io_deq_bits_mask[1]}},
|
|
{8{_out_back_front_q_io_deq_bits_mask[0]}}}) & ~busy;
|
|
if (_out_T_6) begin
|
|
csn <= _out_back_front_q_io_deq_bits_data[1];
|
|
quad <= _out_back_front_q_io_deq_bits_data[2];
|
|
cpol <= _out_back_front_q_io_deq_bits_data[3];
|
|
cpha <= _out_back_front_q_io_deq_bits_data[4];
|
|
end
|
|
if (_out_T_19) begin
|
|
sck <= cpol;
|
|
txShift <= _out_back_front_q_io_deq_bits_data[63:32];
|
|
rxShift <= 32'h0;
|
|
bitsLeft <= quad ? 6'h20 : 6'h8;
|
|
div <= 3'h0;
|
|
end
|
|
else begin
|
|
if (_out_T_6)
|
|
sck <= _out_back_front_q_io_deq_bits_data[3];
|
|
else if (busy & _GEN)
|
|
sck <= _GEN_2 ? cpol : ~sck;
|
|
if (busy & _GEN & advanceEdge) begin
|
|
txShift <= quad ? {txShift[27:0], 4'h0} : {txShift[30:0], 1'h0};
|
|
bitsLeft <= _GEN_1 ? 6'h0 : bitsLeft - _GEN_0;
|
|
end
|
|
if (busy & _GEN & sampleEdge)
|
|
rxShift <=
|
|
quad ? {rxShift[27:0], auto_dq_in_in} : {rxShift[30:0], auto_dq_in_in[1]};
|
|
if (busy)
|
|
div <= _GEN ? 3'h0 : div + 3'h1;
|
|
end
|
|
busy <= _out_T_19 | ~(busy & _GEN & _GEN_2) & busy;
|
|
end
|
|
end // always @(posedge)
|
|
Queue1_RegMapperInput_i9_m8 out_back_front_q (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_enq_ready (auto_in_a_ready),
|
|
.io_enq_valid (auto_in_a_valid),
|
|
.io_enq_bits_read (auto_in_a_bits_opcode == 3'h4),
|
|
.io_enq_bits_index (auto_in_a_bits_address[11:3]),
|
|
.io_enq_bits_data (auto_in_a_bits_data),
|
|
.io_enq_bits_mask (auto_in_a_bits_mask),
|
|
.io_enq_bits_extra_tlrr_extra_source (auto_in_a_bits_source),
|
|
.io_enq_bits_extra_tlrr_extra_size (auto_in_a_bits_size),
|
|
.io_deq_ready (auto_in_d_ready),
|
|
.io_deq_valid (_out_back_front_q_io_deq_valid),
|
|
.io_deq_bits_read (_out_back_front_q_io_deq_bits_read),
|
|
.io_deq_bits_index (_out_back_front_q_io_deq_bits_index),
|
|
.io_deq_bits_data (_out_back_front_q_io_deq_bits_data),
|
|
.io_deq_bits_mask (_out_back_front_q_io_deq_bits_mask),
|
|
.io_deq_bits_extra_tlrr_extra_source (auto_in_d_bits_source),
|
|
.io_deq_bits_extra_tlrr_extra_size (auto_in_d_bits_size)
|
|
);
|
|
assign auto_in_d_valid = _out_back_front_q_io_deq_valid;
|
|
assign auto_in_d_bits_opcode = {2'h0, _out_back_front_q_io_deq_bits_read};
|
|
assign auto_in_d_bits_data =
|
|
_out_out_bits_data_WIRE_1
|
|
? (_out_back_front_q_io_deq_bits_index[0]
|
|
? {31'h0, ~busy, rxShift}
|
|
: {59'h0, cpha, cpol, quad, csn, busy})
|
|
: 64'h0;
|
|
assign auto_dq_oe_out = csn | ~busy ? 4'h0 : quad ? 4'hF : 4'h1;
|
|
assign auto_dq_out_out = quad ? txShift[31:28] : {3'h0, txShift[31]};
|
|
assign auto_csn_out = csn;
|
|
assign auto_sck_out = sck;
|
|
endmodule
|
|
|