El tiempo de salida es impar en VHDL

1

Está bien, he estado creando cosas geniales en VHDL pero me he encontrado con un problema peculiar.

Estoy creando una ALU e intentando escribir un banco de pruebas para ella, pero por alguna razón, el tiempo está apagado y mis señales no se actualizan correctamente.

Cuando pruebo algunas funciones lógicas, funcionan correctamente, pero cuando llego a un punto adicional, falla. Mis entradas se actualizan, pero la adición de las dos entradas no se actualiza hasta el próximo ciclo.

Aquí hay un fragmento del código: "0010" es la señal de control para la adición.

Aquíestánlosvaloresdelasseñalesduranteeseciclo:A_extestáenazul,yB_extestáenrojo,peroelvectordesuma(flechamarrón)tieneunvalorincorrecto.SuvaloresenrealidadlasumadeA_extyB_extdelcicloanterior.

Y aquí está la transición al siguiente ciclo. Puede ver en la flecha marrón que ahora la suma se ha actualizado al valor correcto del ciclo anterior.

Asíqueestoyunpococonfundido.¿Esestounproblemaconlaformaenqueseescribemicódigo,oestetiemponormalenVHDLynohayformadecambiarlo?

Editar

Comodijeenelcomentarioacontinuación,algunosdeloscasosdepruebaparecenactualizarsealmismotiempo,sinembargo,estánenelmismoprocesoydeclaracióndecasoqueelcasodepruebadeadición,¡loscasosdebancodepruebaestántodoscodificadosdelamismamanera!

Observalasiguienteimagen.Laflecharojaapuntaalprimercasodeprueba,quees:

11111111(topsignal)AND00000000(2ndsignal)

Elresultadoescorrectamente00000000(señalinferior).

Elsegundocasodeprueba(flechamarrón)es

1001100010011000....OR1000100110001001...

quedacomoresultadocorrectamente1001100110011001...

SilasalidaseactualizabaenelsiguientecicloparaelcasodepruebaCADA,entonceslaseñaldesalidasobrelaflechamarrónseríalasalidaparaelprimercasodeprueba,00000000...,peronoloes.

Aquí hay un segmento más grande del código. He estado usando señales de 33 bits, A_ext y B_ext, para agregar las señales de 32 bits, A y B porque, para ser honesto, no conozco ninguna otra forma de hacerlo y capturar el bit de transferencia, pero si alguien Sabe de una mejor manera, estoy a favor!

    
pregunta krb686

1 respuesta

1

Como dice David, si está usando este estilo sin reloj, es CRÍTICO que obtenga la lista de sensibilidad correcta. Las actualizaciones inmediatas provienen de entradas que ESTÁN en la lista de sensibilidad; los retrasos misteriosos provienen de entradas que no lo son, por lo tanto, el proceso se detiene hasta que otra cosa lo despierte.

Esta Q & A y esta página web proporciona los fundamentos de cómo y por qué la asignación de señales se produce en los ciclos delta; entender esto es ABSOLUTAMENTE CLAVE para entender VHDL y se pasa por alto muy a menudo.

Alternativamente, si su simulador es compatible con VHDL-2008, active ese soporte y reemplace process(ALUctrl,A,B) con process(all) y deje que las herramientas creen la lista de sensibilidad correcta para usted.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas