Tengo las siguientes dos señales A y B
__________ __________
_____| |_________________________________________| |_____
__ __ __ __ __ __ __ __
| |_________________| |__| |__| |__| |__| |__| |________________|
Tenga en cuenta que:
- No hay un reloj común entre ellos disponible
- La señal B siempre cambia cuando A es baja y A siempre cambia cuando B es baja
Me gustaría crear un contador de 6 bits que incremente su valor en cada flanco negativo de la señal A y luego emita su valor a nivel de bits en el medio, exactamente en los bordes positivos de la señal B.
El problema es que tengo que compartir un estado entre estos dos, por ejemplo:
wire bit_output;
reg [5:0] counter;
reg [5:0] current_value;
always @(posedge signalA) begin
counter <= counter + 1;
current_value <= counter;
end
always @(posedge signalB) begin
current_value <= { current_value[4:0], 1'b0 };
end
assign bit_value = current_value[5];
Desafortunadamente, este no es un código de Verilog válido, por ejemplo, en Xilinx ISE obtengo:
Signal current_value[5] in unit test is connected to following multiple drivers:
Intenté colocarlos en una declaración always
pero esto tampoco es posible:
Assignment under multiple single edges is not supported for synthesis
Si tuviera un reloj común, podría usar una máquina de estados convencional, pero en este caso solo tengo estas dos señales independientes.
No importa con qué solución surja, siempre necesito compartir datos de alguna manera.
No quiero ejecutar ambas rutas de forma independiente; por ejemplo, si tiene un contador para SignalB y si es cero, inicialice con datos de A porque la condición inicial sería indefinida. Me gustaría asegurarme de que los datos que se escupen en los bordes positivos de la señal B siempre se inicialicen correctamente en el borde descendente de la señal A incluso si , por ejemplo, solo aparecen 3 bordes de señal B positivos .
¿Cuál es la forma más fácil de implementar esto?
(esto es solo un ejemplo simplificado para mantener las cosas compactas; la tarea real es más complicada)