spi/spi_master_ss.v

127 lines
2.2 KiB
Coq
Raw Normal View History

2024-01-23 10:26:49 -05:00
/* (c) Peter McGoron 2022 v0.4
2024-01-23 14:05:26 -05:00
*
* This code is disjunctively dual-licensed under the MPL v2.0, or the
* CERN-OHL-W v2.
2023-04-20 15:10:45 -04:00
*/
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
/* spi master with integrated ability to wait a certain amount of cycles
* after activating SS.
*/
2024-01-23 10:26:49 -05:00
module spi_master_ss
2022-10-23 04:27:28 -04:00
#(
2024-01-23 10:26:49 -05:00
parameter SS_WAIT = 1, /* Amount of cycles to wait for SS
to enable */
parameter SS_WAIT_TIMER_LEN = 2, /* Amount of bits required to
store the SS wait time */
parameter ENABLE_MISO = 1,
parameter ENABLE_MOSI = 1,
2022-10-23 04:27:28 -04:00
parameter WID = 24,
parameter WID_LEN = 5,
parameter CYCLE_HALF_WAIT = 1,
2022-10-23 12:37:07 -04:00
parameter TIMER_LEN = 3,
2022-10-23 04:27:28 -04:00
parameter POLARITY = 0,
parameter PHASE = 0
2024-01-23 10:26:49 -05:00
) (
2022-10-23 04:27:28 -04:00
input clk,
2023-04-20 15:10:04 -04:00
input rst_L,
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
output [WID-1:0] from_slave,
input miso,
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
input [WID-1:0] to_slave,
2024-01-27 19:30:37 -05:00
output mosi,
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
output sck_wire,
output finished,
output ready_to_arm,
2022-10-23 04:27:28 -04:00
output ss_L,
input arm
);
reg ss = 0;
reg arm_master = 0;
2022-10-23 12:37:07 -04:00
assign ss_L = !ss;
2022-10-23 04:27:28 -04:00
2024-01-23 10:26:49 -05:00
spi_master #(
.ENABLE_MISO(ENABLE_MISO),
.ENABLE_MOSI(ENABLE_MOSI),
2022-10-23 04:27:28 -04:00
.WID(WID),
.WID_LEN(WID_LEN),
.CYCLE_HALF_WAIT(CYCLE_HALF_WAIT),
2022-10-23 12:37:07 -04:00
.TIMER_LEN(TIMER_LEN),
2022-10-23 04:27:28 -04:00
.POLARITY(POLARITY),
.PHASE(PHASE)
) master (
.clk(clk),
2023-04-20 15:10:04 -04:00
.rst_L(rst_L),
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
.from_slave(from_slave),
.miso(miso),
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
.to_slave(to_slave),
.mosi(mosi),
2024-01-23 10:26:49 -05:00
2022-10-23 04:27:28 -04:00
.sck_wire(sck_wire),
.finished(finished),
.ready_to_arm(ready_to_arm),
2022-10-23 04:27:28 -04:00
.arm(arm_master)
);
localparam WAIT_ON_ARM = 0;
localparam WAIT_ON_SS = 1;
localparam WAIT_ON_MASTER = 2;
localparam WAIT_ON_ARM_DEASSERT = 3;
reg [2:0] state = WAIT_ON_ARM;
2022-10-23 12:37:07 -04:00
reg [SS_WAIT_TIMER_LEN-1:0] timer = 0;
2022-10-23 04:27:28 -04:00
2022-10-23 04:56:56 -04:00
task master_arm();
arm_master <= 1;
state <= WAIT_ON_MASTER;
endtask
2022-10-23 04:27:28 -04:00
always @ (posedge clk) begin
2023-04-20 15:10:04 -04:00
if (!rst_L) begin
state <= WAIT_ON_ARM;
timer <= 0;
arm_master <= 0;
ss <= 0;
end else case (state)
2022-10-23 04:27:28 -04:00
WAIT_ON_ARM: begin
if (arm) begin
timer <= 1;
2022-10-23 04:56:56 -04:00
if (SS_WAIT == 0) begin
master_arm();
end else begin
timer <= 1;
state <= WAIT_ON_SS;
end
2022-10-23 04:27:28 -04:00
ss <= 1;
end
end
WAIT_ON_SS: begin
if (timer == SS_WAIT) begin
2022-10-23 04:56:56 -04:00
master_arm();
end else begin
timer <= timer + 1;
2022-10-23 04:27:28 -04:00
end
end
WAIT_ON_MASTER: begin
if (finished) begin
state <= WAIT_ON_ARM_DEASSERT;
2022-10-23 12:37:07 -04:00
ss <= 0;
2022-10-23 04:27:28 -04:00
end
end
WAIT_ON_ARM_DEASSERT: begin
if (!arm) begin
state <= WAIT_ON_ARM;
arm_master <= 0;
end
end
2022-10-23 12:37:07 -04:00
endcase
2022-10-23 04:27:28 -04:00
end
endmodule