Line 39... |
Line 39... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
|
|
`include "spi_defines.v"
|
`include "spi_defines.v"
|
`include "timescale.v"
|
`include "timescale.v"
|
|
|
module spi_shift (clk, rst, latch, len, lsb, go,
|
module spi_shift (clk, rst, latch_h, latch_l, len, lsb, go,
|
pos_edge, neg_edge, rx_negedge, tx_negedge,
|
pos_edge, neg_edge, rx_negedge, tx_negedge,
|
tip, last,
|
tip, last,
|
p_in, p_out, s_clk, s_in, s_out);
|
p_in, p_out, s_clk, s_in, s_out);
|
|
|
parameter Tp = 1;
|
parameter Tp = 1;
|
|
|
input clk; // system clock
|
input clk; // system clock
|
input rst; // reset
|
input rst; // reset
|
input latch; // latch signal for storing the data in shift register
|
input latch_h; // latch_h signal for storing the data in shift register
|
|
input latch_l; // latch_l signal for storing the data in shift register
|
input [`SPI_CHAR_LEN_BITS-1:0] len; // data len in bits (minus one)
|
input [`SPI_CHAR_LEN_BITS-1:0] len; // data len in bits (minus one)
|
input lsb; // lbs first on the line
|
input lsb; // lbs first on the line
|
input go; // start stansfer
|
input go; // start stansfer
|
input pos_edge; // recognize posedge of sclk
|
input pos_edge; // recognize posedge of sclk
|
input neg_edge; // recognize negedge of sclk
|
input neg_edge; // recognize negedge of sclk
|
input rx_negedge; // s_in is sampled on negative edge
|
input rx_negedge; // s_in is sampled on negative edge
|
input tx_negedge; // s_out is driven on negative edge
|
input tx_negedge; // s_out is driven on negative edge
|
output tip; // transfer in progress
|
output tip; // transfer in progress
|
output last; // last bit
|
output last; // last bit
|
input [`SPI_MAX_CHAR-1:0] p_in; // parallel in
|
input [31:0] p_in; // parallel in
|
output [`SPI_MAX_CHAR-1:0] p_out; // parallel out
|
output [`SPI_MAX_CHAR-1:0] p_out; // parallel out
|
input s_clk; // serial clock
|
input s_clk; // serial clock
|
input s_in; // serial in
|
input s_in; // serial in
|
output s_out; // serial out
|
output s_out; // serial out
|
|
|
Line 124... |
Line 125... |
// Receiving bits from the line
|
// Receiving bits from the line
|
always @(posedge clk or posedge rst)
|
always @(posedge clk or posedge rst)
|
begin
|
begin
|
if (rst)
|
if (rst)
|
data <= #Tp {`SPI_MAX_CHAR{1'b0}};
|
data <= #Tp {`SPI_MAX_CHAR{1'b0}};
|
else if (latch && !tip)
|
`ifdef SPI_MAX_CHAR_64
|
data <= #Tp p_in;
|
else if (latch_l && !tip)
|
|
data[31:0] <= #Tp p_in[31:0];
|
|
else if (latch_h && !tip)
|
|
data[63:32] <= #Tp p_in[31:0];
|
|
`else
|
|
else if (latch_l && !tip)
|
|
data <= #Tp p_in[`SPI_MAX_CHAR-1:0];
|
|
`endif
|
else
|
else
|
data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]] <= #Tp rx_clk ? s_in : data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]];
|
data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]] <= #Tp rx_clk ? s_in : data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]];
|
end
|
end
|
|
|
endmodule
|
endmodule
|