Estoy intentando crear un SPI entre el convertidor de termopar a digital MAX31855 y mi FPGA - DE0.
Comprendo la esencia de SPI y los requisitos de tiempo del MAX31855. Mi problema es el hash en verilog.
INFORMACIÓN DE FONDO MAX31855: Cuando CS (selección de esclavo) es baja, los datos se envían a través de MISO, para una lectura completa de la temperatura y la temperatura de la unión de referencia, deben pasar 32 cc. Se requieren 14 cc solo para la lectura de temperatura.
HOJA DE DATOS enlace
Entiendo que para obtener una lectura de temperatura, la señal de control, CS, debe establecerse en un nivel bajo y en qué punto los datos ingresarán en serie a través del MISO.
Mi plan de ataque era tener dos relojes, uno para SCK (5 mhz) y otro para CS. CS sería 1/14 de SCK. La razón es que los datos para la temperatura provienen de los primeros 14 bits a través de MISO. Por lo tanto, establezco CS bajo para 14 ciclos de reloj SCK para obtener mi lectura de temperatura. Los datos que llegan a través de MISO irían a un registro de desplazamiento de 14 bits de serie en paralelo a salida.
Hice los separadores de reloj, e hice el registro de desplazamiento. Estoy teniendo dificultades para escribir el código verilog ... al menos en mi mente. Soy sospechoso de que funcione.
Estoy pensando que si en el borde negativo de CS, envío cero bytes a la entrada de CS del MAX31855, debería hacerlo.
Tengo este código, pensamientos? CREO que esto es correcto, pero mi intuición dice que no, porque todo lo que he leído sobre SPI dice que necesito un módulo MASTER y un módulo ESCLAVO.
NOTA: cualquier espacio en blanco que vea en las instancias del módulo es para RESET, simplemente no lo voy a usar.
//MASTER module for seriel peripheral interface of MAX31855
module SPI_MASTER(CLOCK_50,GPIO0_D[21],GPIO0_D[19],GPIO0_D[15],Temperature);
input CLOCK_50;
input GPIO0_D[19]; //MISO
output reg [13:0] Temperature;
output GPIO0_D[21]; //SCK
output GPIO0_D[15]; //CS i.e. slave select
assign GPIO0_D[15] = 1'b1;
//##########################################################################//
//########################CLOCKS############################################//
//##########################################################################//
/*DE0 clock (CLOCK_50) goes into ADC_CLOCK. ADC_CLOCK outputs a 5 mhz clock
that goes to SCK, and to CS_CLOCK. CS_CLOCK outputs a clock, whose 1 cycle is
the length of 32 of ADC_CLOCK's.*/
ADC_CLOCK SCK_CLOCK(CLOCK_50,,SCK_WIRE);
wire SCK_WIRE;
assign GPIO0_D[21] = SCK_WIRE;
CS_CLOCK CS_SIGNAL(SCK_WIRE,,CS);
wire CS;
//##########################################################################//
//##########################MISO############################################//
//##########################################################################//
/*MISO takes the input from MAX31855 through GPIO0_D[19], goes into shift register
after 14 clock cycles the shift register outputs Temperature. Temperature goes to
comparator of thermostat state machine, and state machine of LCD*/
SR Temp_Readings(GPIO0_D[19],SCK_WIRE,,Temperature);
/* @negedge of CS, send signal to GPIO0_D[15] (the slave select) for temperature to
be read and data be send through MISO*/
always @(negedge CS)
begin
GPIO0_D[15] => 1'b0;
end
endmodule