FPGA. Slave-модуль интерфейса SPI

Serial Peripheral Interface (SPI) замечателен тем, что позволяет подключать к микроконтроллеру периферийные устройства, при необходимости соединяя их в цепочку устройств, работающих как единый сдвиговый регистр. Подключение микроконтроллера к FPGA именно по интерфейсу SPI удобно с одной стороны небольшим числом используемых выводов, и с другой стороны большинство микроконтроллеров оснащены SPI-интерфейсом. Плюс, конечно же, высокая скорость передачи данных.

Slave-модуль интерфейса SPI

Написанный мною slave-модуль интерфейса SPI не поддерживает режим каскадирования (не имеет вывода SlaveOut), поддерживает режим передачи данных CPOL=0, CPHA=0, MSB first.

Вот его исходный код на языке Verilog (скачать):

// SPI Slave module

// CPOL=0, CPHA=0, MSB first

module SPIslave(

input wire nResetIN,

input wire clkIN,

input wire nSSIN,

input wire SCKIN,

input wire MOSIIN,

output wire MISOOUT,

output reg [7:0] dataOUT,

output reg byteReceivedOUT

);

reg [7:0] data;


assign MISOOUT = data[7];


always @ (negedge SCKIN)

if (nResetIN & ~nSSIN)

data <= { data[6:0], MOSIIN };


reg [3:0] count;


always @ (posedge SCKIN)

if (~nResetIN | nSSIN)

count <= 4'h0;

else

count <= count + 1'b1;


always @ (count[3])

dataOUT <= data;


reg state;


always @ (posedge clkIN)

if (~nResetIN | nSSIN) begin

state <= 1'b0;

byteReceivedOUT <= 1'b0;

end

else

if (~(count[2] | count[1] | count[0])) begin

if (state)

byteReceivedOUT <= 1'b1;

end

else begin

state <= 1'b1;

byteReceivedOUT <= 1'b0;

end


endmodule

В качестве тестового примера я подключил модуль к выводам светодиодов, которыми оснащена плата (скачать BDF):

Схема использования Slave-модуля интерфейса SPI (тест)

Подключив к FPGA плату микроконтроллера Olimexino-STM32, я успешно протестировал функционирование данного модуля на скорости передачи 18 МГц (частота тактирования CLK равнялась 48 МГц).

Автор: Андрей Шаройко <vanyamboe@gmail.com>