¿Cómo diseñar un Árbitro Sincrónico justo?

0

El problema al que me enfrento es el siguiente: necesito un circuito de hardware que decida de manera equitativa entre, por ejemplo, las solicitudes de bus que ocurren al mismo tiempo.

Ejemplo: A y B son los dos componentes que hacen las solicitudes de memoria:

si A solo hace una Solicitud, se acepta de inmediato. si B hace solo una Solicitud, también es aceptado inmediatamente.

La parte difícil viene cuando hacen una solicitud al mismo tiempo, por lo que debería ser que ganen en la misma proporción.

¿Cómo diseñar tal algoritmo? ¿Qué libros enseñan sobre esas cosas? Existe allí algunos algoritmos estándar que hacen lo que necesito (no necesita ser específico del hardware, pero debería ser fácil convertirlos en hardware)

Editar 1

¿Cómo necesito cambiar el algoritmo si tengo > 2 componentes? ¿Habría un contador para cada componente de energía que cuento si hubiera revisado el componente, de modo que pueda decidir fácilmente cuál servir si hay carreras?

    
pregunta Quonux

1 respuesta

1

Cada vez que A y B solicitan al mismo tiempo, procesa la solicitud desde A. La próxima vez que esto suceda, procesa la solicitud desde B. Esto parece justo. No es difícil almacenar la ocasión anterior.

Alternativamente, procese la solicitud A si la solicitud anterior no colisionable provino de B y viceversa.

Siempre espere lo inesperado y podría valer la pena mantener un registro de los servicios A y B. Supongamos que crea un número de 8 bits donde 127d es el punto neutro que significa que A y B han recibido el mismo servicio en el pasado. Podría aumentar esto cuando A recibe servicio y disminuirlo cuando B recibe servicio. De esta manera, podría examinar cómo funcionaban las cosas: si el número fuera demasiado bajo, sesgaría las solicitudes en colisión en favor de A.

Esto supone que A y B solicitan a la misma tasa, por supuesto, pero se podría hacer un registro más detallado para verificar que las tasas relativas de servicio estén a la altura de las expectativas de diseño.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas