¿Cómo resolver ERROR Xst: 528 en ISE?

0
    'timescale 1ns / 1ps                    

    module Control(H, C, S, X, rst, clk);                   
    output reg[1:0] H, C;                   
    output [2:0] S;                 
    input X, rst, clk;                  

    reg[2:0] state, state_n;                    
    reg[4:0] cnt_12, cnt_34;                    
    reg[2:0] cnt_23, cnt_40;                    

    parameter   S0 = 3'd0,              
                    S1 = 3'd1,  
                    S2 = 3'd2,  
                    S3 = 3'd3,  
                    S4 = 3'd4;  
    parameter   green = 2'd0,               
                    yellow = 2'd1,  
                    red = 2'd2; 

    always @(posedge clk)                   
        if(rst) begin               
            state = S0;         
            cnt_12 = 5'd20;         
            cnt_23 = 3'd5;          
            cnt_34 = 5'd25;         
            cnt_40 = 3'd5;          
        end else                
            state = state_n;            

    always @(negedge clk)                   
        case(state)             
            S0 : begin if(X)            
                        state_n = S1;
                    else    
                        state_n = S0;
                  end       
            S1 : begin          
                    if(cnt_12 > 1) begin    
                        state_n = S1;
                        cnt_12 = cnt_12 - 1'd1;
                    end     
                    else begin  
                        state_n = S2;
                        cnt_12 = 5'd20;
                    end 
                  end       
            S2 : begin          
                    if(cnt_23 > 1) begin    
                        state_n = S2;
                        cnt_23 = cnt_23 - 1'd1;
                    end else begin  
                        state_n = S3;
                        cnt_23 = 3'd5;
                    end 
                    end 
            S3 : begin          
                    if(cnt_34 > 1) begin    
                        state_n = S3;
                        cnt_34 = cnt_34 - 1'd1;
                    end else begin  
                        state_n = S4;
                        cnt_34 = 5'd25;
                    end 
                    end 
            S4 : begin          
                    if(cnt_40 > 1) begin    
                        state_n = S4;
                        cnt_40 = cnt_40 - 1'd1;
                    end else begin  
                        state_n = S0;
                        cnt_40 = 3'd5;
                    end 
                    end 
            default : state_n = S0;         
        endcase             

    always @(posedge clk) begin                 
        H = green;              
        C = red;                
        case(state)             
            S0 : ;          
            S1 : ;          
            S2 : H = yellow;            
            S3 : begin H = red; C = green; end          
            S4 : begin H = red; C = yellow; end         
            default : ;         
        endcase             
    end                 
    assign S = state;                   
    endmodule                   

El código se puede simular correctamente y obtener la figura correcta

Perocuandointentoactivarmeunpocoyescribirloenmibasys2,recibíesteerror:

No comprendo la causa cuando cnt_12 u otro cambio de registro cuando el primer turno es alto en el registro de posición, también pueden asignarse en el registro de cobertura, ¿se mantendrán el tiempo de entrega y de reserva? ¿Cómo puedo resolver este problema o modificar mi código?

    
pregunta fgg1991

1 respuesta

1

Está asignando las señales cnt _ ## en más de un bloque siempre. Esto no está permitido y da como resultado un error de varios controladores.

El código en cuestión

always @(posedge clk)                   
    if(rst) begin               
        state = S0;         
        cnt_12 = 5'd20;         
        cnt_23 = 3'd5;          
        cnt_34 = 5'd25;         
        cnt_40 = 3'd5;          
    end else                
        state = state_n;            

always @(negedge clk) 

Siempre pone el comienzo y el final alrededor de las cosas, incluso si no es estrictamente necesario. Hace las cosas mucho más claras y detiene errores como este.

always @(posedge clk) begin                 
    if(rst) begin               
        state = S0;         
        cnt_12 = 5'd20;         
        cnt_23 = 3'd5;          
        cnt_34 = 5'd25;         
        cnt_40 = 3'd5;          
    end else begin              
        state = state_n;            
    end
end

always @(negedge clk) begin
...
        cnt_12 = 5'd20;
...
end

¿Observa cómo existe la variable en dos bloques siempre? Esto nunca está permitido.

Tampoco se le permite registrar un registro con un borde negativo y un borde positivo. Los flip-flops de doble borde no existen en la mayoría de los FPGA.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas