SRAM funciona con ciclos de lectura cortos, falla con ciclos más largos

Observo un comportamiento bastante extraño de un chip SRAM IS62WV51216BLL-55TLI conectado a un FPGA. Cuando lo ejecuto con los ciclos de lectura más cortos posibles, funciona como se esperaba:

ingrese la descripción de la imagen aquí (aquí, leo el valor esperado 0xCF9C3063. Un tic es 6,25 ns)

Sin embargo, cuando trato de usar ciclos de lectura más largos, falla misteriosamente: (aquí, leo el valor 0x136000D0 en lugar de 0x1360EC9F. Una marca es 6,25 ns)ingrese la descripción de la imagen aquí

Como puede ver, los datos correctos aparecen en el bus de datos en algún momento, pero se reemplazan rápidamente por un valor falso. Esto sucede esporádicamente en una dirección diferente cada vez, y volver a leer la misma dirección por segunda vez funciona bien:

ingrese la descripción de la imagen aquí (aquí, leo el valor 0x18E06439 la primera vez y el valor esperado 0x18E0E71F la segunda vez)

¿Alguien tiene una explicación razonable para esto? ¿Hay algún problema con mi ciclo de lectura? Aquí está el ciclo de lectura de la hoja de datos anterior, como referencia:ingrese la descripción de la imagen aquí

Todos mis diagramas se realizaron con SignalTap (analizador lógico integrado en FPGA) funcionando a 160 MHz. Todos los pines de salida del controlador SRAM están registrados:

// ** Output Pin tcm_address_out 

reg                       tcm_address_outen_reg;     

always@(posedge clk) begin
 if( reset ) begin
   tcm_address_outen_reg <= 'b0;
 end
 else begin
   tcm_address_outen_reg <= 'b1;
 end
 end             


reg [ 19 : 0 ] tcm_address_out_reg;   

 always@(posedge clk) begin
 tcm_address_out_reg   <= tcs_tcm_address_out[ 19 : 0 ];
  end


assign  tcm_address_out[ 19 : 0 ] = tcm_address_outen_reg ? tcm_address_out_reg : 'z ;

Luego, la tcm_address_outseñal se conecta a los sram_addrpines que se ven en los diagramas anteriores, que a su vez están conectados a los pines A0- A18del SRAM IC. Otros pines están conectados de manera similar. La longitud de los cables/pistas entre un pin FPGA y un pin SRAM es de unos 10 cm. El SRAM IC tiene tapas de cerámica de 1uF + 100nF entre los pines GND y VDD de ambos lados.

PD. he tratado de mantener C S ¯ afirmó todo el tiempo, lo que no mejoró las cosas. También he intentado una modificación donde O mi ¯ se afirma 12.5ns después C S ¯ y se anula durante 12,5 ns entre lecturas consecutivas (manteniendo C S ¯ ). Eso no ayudó:

ingrese la descripción de la imagen aquí

Muéstranos el código. Tuve dificultades con cosas similares, resuelto con múltiples búferes. En cualquier caso, no confíe en el toque de la señal, probablemente haya más líneas de las que ve.
No sé, lo que sea relevante (y no demasiado largo).
¿Por qué OE viene al mismo tiempo que CS?
Pruebe CS primero (no todo el tiempo) y luego oe. Como en la hoja de datos.
El punto es muy simple. Si no funciona, haz exactamente lo que dicen. Si todavía no funciona, busque un error mayor. La basura en la salida de la memoria puede ser un síntoma de la falta del condensador de desacoplamiento, mal voltaje, componentes falsos, lo que sea. Pero para ir a investigarlo de esa manera, primero debe hacer todo al pie de la letra. No olvide, a veces, la hoja de datos puede no estar completa al 100%, especialmente para la memoria que normalmente se usa con una CPU, por lo que solo una pequeña minoría de ingenieros lee su hoja de datos
Bueno... en primer lugar, las capturas de forma de onda NO son como el diagrama de tiempo del chip de la hoja de datos en el que está cambiando los valores de dirección durante el ciclo de selección del chip. Solo señalo eso como una diferencia a pesar del hecho de que los ciclos de lectura de SRAM deberían funcionar bien con solo cambiar la dirección a datos válidos después del tiempo de acceso de tAA. Estoy más o menos en la página con Gregory aquí en que el problema es probablemente algo que no se muestra en estas capturas de tiempo. Podría ser una sobrecarga o caída de energía en el chip SRAM, un rebote a tierra o incluso algún tipo de contención transitoria en los pines SRAM_DATA.
Hace muchos años, trabajé durante semanas en un problema de lectura de SRAM en una placa que tenía un banco de SRAM que se almacenaban en un bus de datos 8085 a través de un búfer de bus bidireccional de 8 bits. Resultó que el problema se debía al control de dirección del búfer que apuntaba hacia las SRAM en unos 2-3 nseg al final del ciclo, justo antes de que los datos del ciclo de lectura pasaran a tres estados.
@MichaelKaras Soy reacio a copiar toda la hoja de datos en mi pregunta, pero si observa la página 8, verá un diagrama donde la dirección cambia durante el ciclo de lectura. Y, por cierto, mi problema nunca se produce durante la segunda lectura (que se realiza sin ciclos C S ¯ ), solo durante la primera lectura, cuando O mi ¯ acaba de afirmarse.
Estaba respondiendo a lo publicado. Dije que las lecturas desde el cambio de dirección también deberían funcionar. ¿Es posible que tenga problemas de integridad de la señal en sus líneas de dirección? Los rastros del analizador lógico tenderán a ocultar eso.
Hay muy poca información para continuar. Ha omitido el circuito y la interfaz de bus HDL... cosas que pueden ser incuestionables para usted pero que están en duda para personas ajenas como nosotros. SignalTap es solo datos muestreados por reloj, no intermedios más rápidos, por lo que no sirve de mucho. Lo siento, pero allí está.
@MichaelKaras Lo extraño es que el problema ocurre durante los ciclos de lectura lentos, que tardan ~ 150 ns. Eso es solo alrededor de 6-7 MHz. Los cables entre el FPGA y el SRAM IC tienen quizás 10 cm de largo, creo que los transitorios tienen mucho tiempo para asentarse.
@TonyM No publiqué ninguno de los HDL porque creo que he aislado el problema en la interfaz SRAM. Si tuviera un problema con mi código Verilog, ¿no aparecería en los diagramas? El circuito es trivial: cada sram_xseñal está conectada al xpin correspondiente en la SRAM. ¿Y no se asentarían los transitorios durante esos 150 ns?
Permíteme darte un pequeño consejo experimentado, con tu indulgencia entonces. El problema tiene tanta probabilidad de estar en el bit que sabes que no es donde radica el problema. Los bits en los que confías son los bits para desconfiar. ¿Ha comprobado la configuración de pin-out de FPGA? Primer puerto de escala. Además de eso, nadie puede adivinarlo si tiene partes en las que confía y partes en las que no. Buena suerte con eso, te dejaré.
@TonyM Lo siento, no pude entender eso. ¿Quiere decir que hay muchas posibilidades de que mi SRAM funcione bien y que el problema esté en otra parte?
Como experimento, haga la transición de CS y OE en diferentes momentos (un reloj interno aparte debería hacerlo); He tenido resultados inusuales de algunos dispositivos (tanto SRAM como FPGA) en los que esas señales hicieron la transición al mismo tiempo.
@PeterSmith Gracias por la sugerencia. Mira el último diagrama, creo que esto es exactamente lo que he intentado. Mismo resultado, por desgracia.
¿Por qué estás cambiando de dirección a mitad del ciclo de todos modos? Realmente no estoy convencido de que este no sea tu problema.
¿Es posible adivinar de qué otras ubicaciones (direcciones) de la SRAM provienen los datos leídos incorrectamente? Como en su último diagrama donde aparece el 0x620. ¿Alguna idea de qué ubicación viene?
También dice que las huellas de FPGA a SRAM tienen 10 cm de largo. Eso es lo suficientemente largo y las salidas FPGA tienen tiempos de transición que son lo suficientemente rápidos donde probablemente y realmente debería tener resistencias de 22 a 33 ohmios en serie con cada línea en las salidas FPGA. Tenga en cuenta que la vista SignalTap de las señales SRAM está "aislada" de lo que esté sucediendo en el nivel de la placa física y es probable que necesite usar un osciloscopio normal para investigar las señales en sí mismas en la SRAM para evaluar el SI (integridad de la señal) que aludí antes.
También estaría mirando los niveles de señal. Lo que Signaltap piensa que es un 1 o 0 puede ser diferente de lo que SRAM piensa que es un 1 o 0. Los analizadores incorporados solo lo llevan hasta cierto punto y solo le brindan una vista desde dentro del chip. Si todo lo demás funciona como crees que es bueno, si no es así, pueden llevarte por el camino equivocado.
Continúa: Ingeniero de barcos "No lo entiendo capitán, el motor va a toda velocidad pero no nos movemos"... Contramaestre... "Oiga capitán. ¿Qué quiere que haga con esta hélice que descubrí? atrás.."
Sospecharía mucho de un porro seco en algún lugar del bus de direcciones. Pin solo acoplado capacitivamente a la línea de señal...
A pesar del nombre, las RAM estáticas de alta densidad utilizan generadores de tiempo internos para controlar cosas como la precarga del amplificador de detección, etc. Estos son impulsados ​​por los bordes de las líneas de control. Tenga en cuenta que la hoja de datos establece que las condiciones de prueba asumen tiempos de transición de 5 ns o menos. Esto es algo que querrá verificar en su configuración: los bordes lentos o los bordes con mucho timbre podrían producir los síntomas que está viendo.
@Trevor, OP está cambiando la dirección durante el ciclo porque es una lectura de 2 tiempos, es decir, el bus de datos RAM tiene la mitad del ancho de su ancho de datos de lectura. Eso está bien. Solo creo que, como solo podemos ver una pequeña parte de la imagen aquí, la atención está en un dato en particular y hay muchas incógnitas. Si fuera yo, llego a esta etapa y verifico todo: asignaciones de pines de FPGA, hoja de datos de RAM contra símbolo, reloj, rieles, todos los tiempos de los autobuses, etc. Esta verificación de cordura lleva una hora y puede ahorrar mucho tiempo. (Lo siento, la publicación anterior fue contundente aunque precisa, OP, escrita desde un castillo muy soleado :-))
@TonyM Dado que la SRAM funciona con diferentes configuraciones de tiempo, diría que las asignaciones de pines ciertamente están bien. Desafortunadamente, no tengo un osciloscopio lo suficientemente rápido en casa para mirar las señales reales, pero parece que Dave tiene razón: esto puede ser un problema técnico debido al timbre. Lástima que mi FPGA no tiene configuraciones de velocidad de respuesta.
@DmitryGrigoryev, su prueba publicada mostró lecturas a diferentes velocidades desde diferentes direcciones; la única diferencia no fue la velocidad. Podría repetirlo todo el día, pero no importa: es valioso estar seguro, absolutamente seguro, de la línea de base, tome eso de una larga experiencia :-) (¡rara vez juego la línea del 'viejo soldado'!) Toma poco tiempo, descarta lo malo en la crítica: las suposiciones. Por cierto, el timbre sería peor con lecturas rápidas que con lecturas lentas, no al revés. Publique la respuesta cuando la encuentre, buena suerte para un trabajo rápido :-)
@TonyM Oh, estoy totalmente de acuerdo contigo, solo estaba señalando que tiene las características de una mala articulación y que el analizador interno no lo ayudará con eso.
@Trevor Revisé todos los pines con mi multímetro y también probé una segunda muestra de IC, con los mismos resultados.
@DaveTweed Tenía razón: ayudó agregar resistencias de terminación de fuente a los pines que impulsan la SRAM. ¡Gracias de nuevo!

Respuestas (1)

Dmitry, para obtener la solución a su problema, necesitará solucionarlo sistemáticamente. TonyM, Trevor, Dave, Michael y Gregory proporcionaron varias conjeturas, que deben calificarse sistémicamente dentro de su diseño. A continuación le proporcionaré un resumen:

  • su placa tiene algo de FPGA, con el chip IS62WV51216BLL-55TLI conectado a través de pistas de 10 centímetros de largo;
  • no hay información disponible sobre enrutamiento de energía o desacoplamiento de energía;
  • mostró el código seleccionando la dirección, no hay información disponible sobre cómo muestrear los datos en el diseño de FPGA.
  • no hay imágenes de tablero disponibles, no podemos ver el diseño de su tablero y cómo está hecho.

Veamos la configuración:

always@(posedge clk) begin
 if( reset ) begin

A las lecturas de su analizador les falta la señal de reinicio. Tendrá que demostrar que resetla señal siempre es baja cuando se presenta el problema.

Ahora echemos un vistazo a los diagramas. Como notó, los cambios de valor E0A0 -> ECA0 -> EC9F -> 00D0, con el cambio a 00D0 ocurriendo dentro del ciclo de lectura, y siendo un problema que informa. Esta SRAM no está registrada en sus pines de entrada y E/S, por lo tanto, si comienza a emitir algunas señales incorrectas, pueden ocurrir varios problemas:

  • cuestión de poder Si hubiera un problema de energía intermitente, el chip RAM terminaría leyendo el valor correcto ya que tiene entradas no registradas. Puede intentar aumentar el ciclo de lectura aún más, para ver si el valor cambia nuevamente de 00D0 a EC9F. Si la energía fallara por completo, habría corrupción de datos en el contenido de la RAM, como no sucede (y la segunda vez puede leer los datos correctos), no creo que sea un problema de energía.
  • Problema con la señal de control o dirección. ¿Tiene pull-ups en las líneas de datos? Si los tuviera, la inactividad se leerá como FFFF; de lo contrario, se puede leer cualquier cosa. Recomendaría activar pull-ups débiles en el lado de FPGA. Es realmente difícil decir qué puede pasar con las líneas de control/dirección, ya que los comentaristas señalaron que lo que tienes es cómo FPGA ve la situación, y no lo que realmente sucede en la interconexión entre FPGA y SRAM.

Te recomendaría lo siguiente:

  • encienda pull-ups débiles en las líneas de datos para asegurarse de que si tiene problemas de activación de salida/selección de chip, se vea como FFFF en el bus;
  • captura el ciclo de lectura con errores y detiene el sistema, utilizando la sonda lógica para ver los niveles lógicos en los pines. Para esto, puede llenar la RAM con algún contenido predefinido (por ejemplo, 0001 - 0203 - 0405 - ...), y leer direcciones en bucle hasta que obtenga un valor inesperado y detener el reloj cuando suceda. Usando un multímetro/sonda lógica, mida los voltajes de todas las señales (control, datos y dirección) para averiguar cómo se ve desde el exterior de la FPGA.
  • como la gente ya dijo en los comentarios, verifique las conexiones físicas. Toma una lupa y mira cada unión de PCB, usa una aguja colocándola entre los pines del chip (si no es BGA sino TSOP) con algo de fuerza para asegurarse de que cuando aplica una fuerza pequeña, los pines no se rasguen de las almohadillas (sea muy ¡Tenga cuidado de no doblar los alfileres ni rasgar las almohadillas!).
Gracias, probaré esas cosas que mencionas (todavía no probé dominadas débiles y deteniendo el reloj). El principal sospechoso, en mi opinión, es el timbre que ha mencionado Dave, por lo que mi próximo paso sería llevar la placa proto a un laboratorio con un alcance decente. Sin embargo, si eso no produce resultados, repasaré toda la lista.