Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module SPI_slave #(
- parameter data_width = 16
- )(
- input wire clk, // Тактовая частота, относительно высокочастотная.
- input wire n_cs, // Выбор ведомого SPI
- input wire mosi, // Вход данных SPI
- output reg miso, // Выход данных SPI
- input wire sclk, // Тактовый сигнал SPI
- input wire [data_width - 1:0] data_tx, // Это то что модуль будет выдавать в SPI.
- output reg [data_width - 1:0] data_rx, // Это то что принялось SPI.
- output reg data_valid = 1'b0 // Это сигнал того что принялось целое слово по SPI, импульс в 1 период.
- );
- reg sclk_perv = 1'b0;
- reg [$clog2(data_width) - 1:0] cnt = 'b0;
- always @(posedge clk) begin
- if (n_cs) begin
- sclk_perv <= 1'b0;
- cnt <= 'b0;
- data_valid <= 1'b0;
- end else begin
- sclk_perv <= sclk;
- data_valid <= 1'b0;
- if (sclk_perv == 0 && sclk == 1) begin
- miso <= data_tx[data_width - cnt - 1'b1];
- end
- if (sclk_perv == 1 && sclk == 0) begin
- data_rx <= {data_rx[data_width - 2:0], mosi};
- if (cnt == data_width - 1) begin
- cnt <= 'b0;
- data_valid <= 1'b1;
- end else begin
- cnt <= cnt + 1'b1;
- end
- end
- end
- end
- endmodule
- module SPI_slave_tb;
- reg clk = 1'b0;
- reg n_cs = 1'b1;
- reg mosi = 1'b0;
- reg sclk = 1'b0;
- wire [15:0] data_out;
- wire data_valid;
- integer i;
- always
- #10 clk = !clk;
- task send_bit(input data);
- begin
- mosi = data;
- sclk = 1'b1;
- #100 sclk = 1'b0;
- #100;
- end
- endtask
- task send_word(input [15:0] data);
- begin
- for (i = 15; i >= 0; i = i - 1) begin
- send_bit(data[i]);
- end
- end
- endtask
- initial begin
- #200;
- n_cs = 1'b0;
- send_word(16'hF00F);
- n_cs = 1'b1;
- end
- SPI_slave SPI_slave_inst (
- .clk(clk),
- .n_cs(n_cs),
- .mosi(mosi),
- .miso(miso),
- .sclk(sclk),
- .data_tx(16'hF00F),
- .data_rx(data_out),
- .data_valid(data_valid)
- );
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement