Conectado a varios controladores Verilog de problemas

0

Después de sintetizarlo, el error se produjo de esta manera:

Multi-source in Unit <BCDcountmod> on signal <BCD0<3>>; this signal is connected to multiple drivers.>

¿Alguna solución? ( Aquí está debajo de mi código )

module BCDcountmod(
  input Clock, Clear, up, down,
  output [3:0] BCD1_1, BCD0_0 );
reg [3:0] BCD1, BCD0;
//reg [3:0] BCD1_1, BCD0_0;
always @(posedge Clock) begin
  if (Clear) begin
    BCD1 <= 0;
    BCD0 <= 0;
    end
end


 always @(posedge up) begin
      if (BCD0 == 4'b1001) begin
        BCD0 <= 0;
        if (BCD1 == 4'b1001)
          BCD1 <= 0;
        else
          BCD1 <= BCD1 + 1;
      end
      else
        BCD0 <= BCD0 + 1;
    end


always @(posedge down) begin
      if (BCD0 == 4'b0000) begin
        BCD0 <= 4'b1001;
        if (BCD1 == 4'b1001)
          BCD1 <= 4'b1001;
        else
          BCD1 <= BCD1 - 1;
      end
      else
        BCD0 <= BCD0 - 1;
    end

 assign BCD1_1 = BCD1;
 assign BCD0_0 = BCD0;

endmodule
    
pregunta user2020598

1 respuesta

2

Aquí, a la señal BCD0 se le asignan valores en 3 procesos "siempre" separados. Por lo tanto, la síntesis está devolviendo error de controlador múltiple. Intente mover todas las asignaciones de señal BCD0 bajo un solo proceso 'siempre'. Eso resolverá el problema. Podría usar diferentes condiciones bajo el mismo bloque siempre para definir el comportamiento de la señal.

El contador BCD que está intentando implementar es sensible a los bordes del reloj, a las señales claras, arriba y abajo. Por lo tanto, el proceso debe ser sensible a los bordes del reloj y todas las demás señales pueden detectarse con los bordes del reloj. Una forma de reescribir el código es como:

always @(posedge Clock) begin  
  if (Clear) begin  
    BCD1 <= 0;  
    BCD0 <= 0;  
  else if (up == 1) begin  
    if (BCD0 == 4'b1001) begin  
        BCD0 <= 0;  
        if (BCD1 == 4'b1001)  
          BCD1 <= 0;  
        else  
          BCD1 <= BCD1 + 1;  
        end  
    else  
        BCD0 <= BCD0 + 1;  
    end  
  else if (down == 1) begin  
    if (BCD0 == 4'b0000) begin  
        BCD0 <= 4'b1001;  
        if (BCD1 == 4'b1001)  
          BCD1 <= 4'b1001;  
        else  
          BCD1 <= BCD1 - 1;  
        end  
    else  
        BCD0 <= BCD0 - 1;  
    end  
  end  
end  

Aquí, todas las condiciones de sensibilidad de la señal BCD0 y BCD1 se capturan en un solo bloque 'siempre' que lo sintetizará correctamente.

    
respondido por el Avin

Lea otras preguntas en las etiquetas