Advertisement
Guest User

Untitled

a guest
Jan 11th, 2021
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module SPI_slave #(
  2.     parameter data_width = 16
  3.   )(
  4.     input wire clk,  // Тактовая частота, относительно высокочастотная.
  5.     input wire n_cs, // Выбор ведомого SPI
  6.     input wire mosi, // Вход данных SPI
  7.     output reg miso, // Выход данных SPI
  8.     input wire sclk, // Тактовый сигнал SPI
  9.    
  10.     input wire [data_width - 1:0] data_tx, // Это то что модуль будет выдавать в SPI.
  11.     output reg [data_width - 1:0] data_rx, // Это то что принялось SPI.
  12.     output reg data_valid = 1'b0 // Это сигнал того что принялось целое слово по SPI, импульс в 1 период.
  13.   );
  14.  
  15.   reg sclk_perv = 1'b0;
  16.   reg [$clog2(data_width) - 1:0] cnt = 'b0;
  17.  
  18.   always @(posedge clk) begin
  19.     if (n_cs) begin
  20.       sclk_perv <= 1'b0;
  21.       cnt <= 'b0;
  22.       data_valid <= 1'b0;
  23.     end else begin
  24.       sclk_perv <= sclk;
  25.       data_valid <= 1'b0;
  26.      
  27.       if (sclk_perv == 0 && sclk == 1) begin
  28.         miso <= data_tx[data_width - cnt - 1'b1];
  29.       end
  30.      
  31.       if (sclk_perv == 1 && sclk == 0) begin
  32.         data_rx <= {data_rx[data_width - 2:0], mosi};
  33.         if (cnt == data_width - 1) begin
  34.           cnt <= 'b0;
  35.           data_valid <= 1'b1;
  36.         end else begin
  37.           cnt <= cnt + 1'b1;
  38.         end
  39.       end
  40.     end
  41.   end
  42. endmodule
  43.  
  44. module SPI_slave_tb;
  45.   reg clk = 1'b0;
  46.  
  47.   reg n_cs = 1'b1;
  48.   reg mosi = 1'b0;
  49.   reg sclk = 1'b0;
  50.   wire [15:0] data_out;
  51.   wire data_valid;
  52.  
  53.   integer i;
  54.  
  55.   always
  56.     #10 clk = !clk;
  57.  
  58.   task send_bit(input data);
  59.   begin
  60.     mosi = data;
  61.     sclk = 1'b1;
  62.     #100 sclk = 1'b0;
  63.     #100;
  64.   end
  65.   endtask
  66.  
  67.   task send_word(input [15:0] data);
  68.   begin
  69.     for (i = 15; i >= 0; i = i - 1) begin
  70.       send_bit(data[i]);
  71.     end
  72.   end
  73.   endtask
  74.  
  75.   initial begin
  76.     #200;
  77.     n_cs = 1'b0;
  78.     send_word(16'hF00F);
  79.     n_cs = 1'b1;
  80.   end
  81.  
  82.   SPI_slave SPI_slave_inst (
  83.     .clk(clk),
  84.     .n_cs(n_cs),
  85.     .mosi(mosi),
  86.     .miso(miso),
  87.     .sclk(sclk),
  88.     .data_tx(16'hF00F),
  89.     .data_rx(data_out),
  90.     .data_valid(data_valid)
  91.   );
  92.  
  93. endmodule
  94.  
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement