Programa Verilog para interfaz spi
Entrada
clk;
/señal de reloj
Entrada
rd;
/Recibir comando de datos
Entrada
wr;
1'b0)
amp;amp;
(rd
==
1'b1))
/Enviar conversión de datos
comenzar
spistate
lt;=
send_data;
dstate
lt;=
8'd0;
dsend
lt;=
datos;
end
else
si ((wr
==
1'b1)
amp;amp;
(rd
==
1'b0))
Recibir conversión de datos
comenzar
espistate
lt;=
receive_data;
dstate
lt;=
8'd0;
end
else
comenzar
spistate
lt;=
inactivo;
dstate
lt;=
8'd0;
fin
//
fin
//
otro
//
comenzar
//
cnt
lt;=
cnt
8'd1;
//
fin
fin
2'b01:
//Enviar estado de datos
comenzar
caso
(dstate)
8'd0:
// Generar una señal de selección de chip válida
Iniciar
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
spido
lt;=
1'b1;
dstate
lt;=
8'd1;
final
8'd1:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
spido
lt;=
1'b1;
dstate
lt;=
8'd2;
fin
8'd2:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b0;
spido
lt;=
1'b1;
dstate
lt;=
8' d3;
final
8'd3:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
spido
dstate
lt;=
8'd15;
fin
8'd15:
comenzar
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
spido
lt;=
dsend[1];
dstate
lt;=
8'd16;
fin
8'd16:
comienzo<
spics
lt;=
1'b0;
spiclk
lt;=
1' b0;
spido
lt;=
dsend[1];
dstate
lt;=
8'd17;
fin
8'd17:
comienzo
spics
lt ;=
1'b0;
spiclk
lt;=
1'b1;
/ /enviar datos de bits más bajos
spido
lt;=
dsend[0];
dstate
lt;=
8'd18;
fin
8'd18:
comenzar
espics
lt;=
1'b0;
spiclk
lt;=
1'b0;
spido
lt;=
dsend[0];
// El flanco descendente de spiclk permite la lectura del bit más bajo de datos
dstate
lt;=
8'd19;
end
8'd19:
//La señal de selección de chip no es válida
comenzar
spics
lt;=
1' b1 ;
spiclk
lt;=
1'b1;
spido
lt;= p>
1'b1;
dstate
lt;=
8'd20;
fin
8 'd20:
comenzar
spics
lt;=
1'b1;
spiclk
p>lt;=
1'b1;
spido
lt;=
1'b1;
spido
lt; p>
dstate
lt;=
1'b1; p>
dstate
lt;=
8'd0;
spistate
lt;=
inactivo;
fin
predeterminado
comenzar
spics
lt;=
lt;=
1'b1;
spiclk
lt;=
1'b1;
spido
lt;=
1'b1;
spistate
lt;=
inactivo;
end
endcase p>
fin
2'b10:
//Recibir estado de datos
comenzar
caso
(dstate)
/La señal de selección de chip es válida
8'd0:
begin
spics
lt ;=
1'b0;
spiclk
lt;=
1'b1;
spido
p>lt;=
1'b1;
dstate<
lt;=
8 'd1;
fin
8'd1:
comienzo
spics
lt;= p>
1'b0;
spiclk
lt;=
1'b1;
spido
lt ;=
1'b1;
dstate
lt;=
8'd2;
fin
8'd2:
comienzo
spics
lt;=
1' b0;
p>
spiclk
lt;=
1'b0;
spido
lt;=
1'b1;
dstate
lt;=
8'd3;
fin
8'd3:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd4;
fin
8'd4:
Inicio
spics
lt;=
1'b0 ;
spiclk
lt;=
1'b0;
/El flanco ascendente de los datos del flanco descendente se leen inmediatamente
dreceive[7]
lt;=
spidi;
//Recibir el más alto bit de datos
dstate
lt;=
8'd5;
end
8'd5 :
Inicio
p>
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd6 ;
Fin
8'd6:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b0
;
drecibir[6]
lt;=
spidi;
dstate
lt;=
8'd7;
fin
8'd7:
comienzo
espic
lt;=
1'b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd8;
end
8'd8:
comenzar
spics
lt;=
1'b0;<
spiclk
lt;=
1'b0;
dreceive[5]
lt;=
spidi;
dstate p>
lt;=
8'd9;
fin
8'd9:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd10;
fin
8' d10:
comenzar
spic
lt;=
1'b0;
spiclk
lt;=
1'b0;
drecibir[4]
lt;=
spidi; p>
dreceive[4] p>
dstate
lt;=
8'd11;
end
8'd11:
comenzar
spic
lt;=
1'b0;
spiclk;
lt; =
1'b1;
dstate
lt; =
8'd12;
final
8'd12:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b0;
drecibir[3]
lt;=
spidi;
dstate
lt;=
8'd13;
fin
8'd13:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd14;
final
8'd14:
comienzo
fotos
lt;=
1'b0;
spiclk
lt;=
1'b0;<
dreceive[2]
lt;=
spidi;
dstate
lt;=
8 'd15;
fin
8'd15:
comienzo
spics
lt;=
1' b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd16;
fin
8'd16:
comienza
spics
lt;=
1'b0;
spiclk
lt;=
1'b0;
dreceive[1]
lt;=
spidi;
dstate
lt;=
8'd17;
fin
8'd17:
comienzo
espic
lt;=
1'b0;
spiclk
lt;=
1'b1;
dstate
lt;=
8'd18;
fin
8'd18:
comienzo
spics
lt;=
1'b0;
spiclk
lt;=
1 'b0;
dreceive[0]
lt;=
spidi;
//Recibir el bit de datos más bajo p>
dstate
lt;=
8'd19;
fin
8'd19:
comenzar
spics
lt;=
1'b0;
spiclk
lt; =
1'b1;
spido
lt;=
1'b1;
dstate
lt;=
8'd20;
dataoutlt;=
recibir;
fin
8'd20:
comenzar
spics
lt;=
1'b1;
//señal de selección de chip no válida
spiclk
lt;=
1'b1;
spido
lt;=
1'b1;
dstate
lt;=
8'd0;
spistate
lt;=
inactivo;
end
endcase
end
predeterminado:
comenzar
spics
lt;=
1'b1;
spiclk p>
lt;=
1'b1;
spido
lt;=
1'b1;
spido
lt; p>
spistate
lt;=
inactivo;
fin
endcase
// /Corresponde al envío
escenario de datos arriba
fin
///Corresponde al escenario RST no presionado arriba
fin
//Corresponde al escenario siempre @(posedge) escenario anterior.
clk)
endmodule