aboutsummaryrefslogtreecommitdiffstats
path: root/spi_slave.v
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2022-10-23 14:03:19 -0400
committerGravatar Peter McGoron 2022-10-23 14:03:19 -0400
commit9bbe1407bae7b4aeca46dbba30814a9962cce670 (patch)
treececd07b7289e84afa02f9b7e146ca0a6103148d9 /spi_slave.v
parenttest master with SS (diff)
add metastability workaround
Diffstat (limited to 'spi_slave.v')
-rw-r--r--spi_slave.v15
1 files changed, 13 insertions, 2 deletions
diff --git a/spi_slave.v b/spi_slave.v
index 83ab335..c4f7a7c 100644
--- a/spi_slave.v
+++ b/spi_slave.v
@@ -24,7 +24,7 @@ spi_slave
input ss_L,
`ifndef SPI_SLAVE_NO_READ
output reg [WID-1:0] from_master,
- input reg mosi,
+ input mosi,
`endif
`ifndef SPI_SLAVE_NO_WRITE
input [WID-1:0] to_master,
@@ -35,6 +35,17 @@ spi_slave
output reg err
);
+`ifndef SPI_SLAVE_NO_READ
+/* MOSI is almost always an external wire, so buffer it. */
+reg mosi_hot = 0;
+reg read_mosi = 0;
+
+always @ (posedge clk) begin
+ read_mosi <= mosi_hot;
+ mosi_hot <= mosi;
+end
+`endif
+
wire ss = !ss_L;
reg sck_delay = 0;
reg [WID_LEN-1:0] bit_counter = 0;
@@ -48,7 +59,7 @@ reg [WID-1:0] send_buf = 0;
task read_data();
`ifndef SPI_SLAVE_NO_READ
from_master <= from_master << 1;
- from_master[0] <= mosi;
+ from_master[0] <= read_mosi;
`endif
endtask