Comunicación SPI basada en Verilog
reg byte_received; // Nivel alto cuando se recibe un byte
reg [7:0] byte_data_received
always @(posedge clk)
comenzar
if(~SSEL_active)
bitcnt lt;= 3'b000;
else
if (SCK_risingedge)
comenzar
bitcnt lt; = bitcnt 3'b001;
// Implementar el registro de desplazamiento a la izquierda (porque recibimos los datos MSB primero)
byte_data_received lt; = {byte_data_received[6:0], MOSI_data};
end
end
siempre @(posedge clk) byte_received <= SSEL_active amp; SCK_risingedge amp; (bitcnt==3 'b111);
// Usamos el LSB de los datos recibidos para controlar el LED
reg LED;
siempre @(posedge clk) if(byte_received) LED lt;=byte_ data_received[0];
La última es la parte de transmisión.
reg [7:0] byte_data_sent;
reg [7:0] cnt;
siempre @(posedge clk) if( SSEL_startmessage) cntlt;= cnt 8'h1; // cuenta los mensajes
siempre @(posedge clk)
if(SSEL_active)
begin
if (SSEL_ startmessage)
byte_data_sent lt; = cnt; // El primer byte enviado en el mensaje es el recuento de mensajes
else
if(SCK_fallingedge)
comenzar
if(bitcnt==3'b000)
byte_data_sent lt; = 8'h00 // Después de eso, enviamos 0s
else
byte_data_sent lt;= {byte_data_ sent[6:0], 1'b0};
fin
fin
assign MISO = byte_data_sent[7]; // Enviar MSB primero
// Suponemos que solo hay un esclavo en el bus SPI
//Entonces no lo necesitamos establecer tres para el búfer de estado MISO
//De lo contrario, necesitamos tres estados de MISO cuando SSEL no esté activado
endmodule
Hemos establecido entre ARM y ¡Comunicación FPGA!
Ejecutar el código
Cuando ejecutamos el código ARM, podemos
ver los cambios de estado del LED y los datos devueltos por la FPGA.