Red de conocimiento informático - Problemas con los teléfonos móviles - Programa Verilog para interfaz spi

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;=

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;

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

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;=

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

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;

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

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

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