tachibana/src/spi_regfile.v
2021-06-23 13:31:52 +02:00

85 lines
1.8 KiB
Verilog

`timescale 1ns / 1ps
module spi_regfile(
input clk, rst,
input sck, sdi, ncs,
output sdo,
input [15:0] spi_data_in,
output reg [15:0] spi_data_out,
input [15:0] spi_status_word,
output reg [15:0] spi_cmd_word,
output reg spi_cmd_begin,
output reg spi_cmd_active,
output reg spi_cmd_step,
output reg [19:0] spi_cmd_idx
);
wire spi_core_cs_rising, spi_core_cs_falling;
reg [15:0] spi_core_data_in;
reg spi_core_data_in_valid;
wire [15:0] spi_core_data_out;
wire spi_core_data_out_valid;
reg is_spi_cmd_word;
always @(posedge clk) begin
spi_core_data_in_valid <= 0;
spi_cmd_begin <= 0;
spi_cmd_step <= 0;
spi_core_data_in <= spi_status_word;
if (rst) begin
is_spi_cmd_word <= 1;
spi_cmd_active <= 0;
spi_cmd_idx <= 0;
end else begin
if (spi_core_cs_rising) begin
is_spi_cmd_word <= 1;
spi_cmd_active <= 0;
end
if (ncs) begin
/* constantly refresh status word */
spi_core_data_in_valid <= 1;
end
if (spi_core_data_out_valid) begin
spi_core_data_in <= spi_data_in;
spi_core_data_in_valid <= 1;
if (is_spi_cmd_word) begin
spi_cmd_word <= spi_core_data_out;
spi_cmd_idx <= 0;
spi_cmd_active <= 1;
spi_cmd_begin <= 1;
is_spi_cmd_word <= 0;
end else begin
spi_cmd_idx <= spi_cmd_idx + 1;
spi_cmd_step <= 1;
spi_data_out <= spi_core_data_out;
end
end
end
end
spi_core #(.WORDSIZE(16)) spi_core_dut (
.clk(clk), .rst(rst),
.sck(sck), .sdi(sdi), .sdo(sdo), .ncs(ncs),
.cs_rising(spi_core_cs_rising),
.cs_falling(spi_core_cs_falling),
.data_out(spi_core_data_out),
.data_out_valid(spi_core_data_out_valid),
.data_in(spi_core_data_in),
.data_in_valid(spi_core_data_in_valid)
);
endmodule