Verilog - conectando múltiples buses bidireccionales

0

He estado diseñando una computadora retro en verilog como un ejercicio y hasta ahora tengo una CPU simple de 8 bits que se comunica directamente con un solo chip RAM a través de un puerto de datos bidireccional. Esto funciona muy bien en mis pruebas, sin embargo, ha surgido la necesidad de incluir una segunda RAM en un bus diferente, como RAM de video con la que tanto la CPU como el procesador de gráficos pueden interactuar. Para lograr esto, implementé un módulo controlador de memoria. Este módulo se conecta directamente a ambos chips de RAM en buses separados, y las lecturas / escrituras en / desde la CPU ahora tienen que pasar por este módulo.

Conexiones de módulo simplificadas:

module memcontroller(inout[7:0] CPUdataBus, inout[7:0] RAMdataBUS, inout[7:0] VRAMdataBus)

Al conectar la CPU directamente con la RAM, solo configuraría el bus de datos en Hi-Z para usarlo como entrada y leer datos de la RAM. Sin embargo, ahora hago esto en el puerto "RAMdataBUS" y necesito una forma de "conectar" la entrada al puerto CPUdataBus, que no puedo entender.

Quizás ingenuamente, pensé que algo como esto funcionaría:

assign CPUdataBus = write ? CPUdataBus : RAMdataBUS;
assign RAMdataBUS = write ? CPUdataBus : 8'hZZ;

Lo que produce durante la síntesis:

RAMdataBus[7]" has multiple drivers due to the always-enabled I/O buffer "CPUdataBus[7]"

para cada bit

Es probable que haya una razón realmente obvia para que esto no sea válido, pero no obstante, no puedo encontrar una solución al problema o no entiendo el error por completo.

    
pregunta Triforcer

1 respuesta

1

Piense en esto en términos de hardware. RAMdataBUS genera datos o es de tres estados. Pero CPUdataBus es un mux. No puedes conectar una tristate a un mux. Puede conectar un bus tri-sate a otro bus tri-state.

Suponiendo que write es la CPU que escribe el bus de la CPU debe manejarse cuando escribe, pero tri-state cuando lee:

assign CPUdataBus = write ? CPUdataOut : 8'hZZ;

El bus de memoria debe ser manejado (por la memoria) al leer, pero tri-state al escribir:

assign RAMdataBUS = !write ? memory_data_out :  8'hZZ;

Pero eso no es correcto si tienes varios recuerdos. Entonces se convierte en:

assign RAMdataBUS = !write && this_mem_selected ? memory_data_out :  8'hZZ;
    
respondido por el Oldfart

Lea otras preguntas en las etiquetas