no puede resolver los pestillos

1

Me gustaría preguntar si alguien podría ayudarme con algunos cierres en mi diseño. Estoy trabajando con un núcleo de cifrado aes tomado de los sistemas de apertura y he descrito en vhdl el sistema circundante para introducir y obtener los datos en el núcleo. Cuando lo simulo, mi diseño funciona correctamente, pero cuando programo mi FPGA con el flujo de bits del sistema y me comunico con él a través del hiperterminio, no me devuelve los datos cifrados correctos. He intentado muchas cosas para resolverlo, pero no consigo encontrar el error, estaba pensando que tal vez algunos problemas que hay en el sistema podrían ser el problema. Publico aquí solo las líneas donde están los cierres.

PD: el núcleo se comunica con zynq a través de axi y estoy usando un kit de evaluación y desarrollo ZedBoard Zynq (xc7z020clg484-1)

control de estado: cierre en next_state

  begin  
    if (rising_edge(S_AXI_ACLK)) then
    if (S_AXI_ARESETN='0')then
      actual_state <= wait_state;
   else 
      actual_state <= next_state;
    end if;
  end if;
end process;

habilitación de entrada de datos: enclavamiento en un < = Avalid_data_I; y b < = Avalid_key_I;

process (S_AXI_ARESETN, S_AXI_ACLK) 
        begin  
            if (rising_edge(S_AXI_ACLK)) then
                 if (S_AXI_ARESETN='0')then
                    a<=  '0';
                    a1<= '0';
                    b <= '0';
                    b1 <= '0';
                 else
                    a<=Avalid_data_I;
                    a1<= a;
                    b <= Avalid_key_I;
                    b1 <= b;
                    c <= valid_data;
                    c1 <=c;
                 end if;
            end if;
    end process;

finalmente tengo un pestillo cuando compilo la salida: dat_encrip es la salida del núcleo de encriptación tomado de los opencores y out_encrypt es un registro interno que se leerá desde el zynq.

      out_encrypt (31 downto 24) <= dat_encrip when (cnt=0 and    dato_valido= '1');
      out_encrypt (23 downto 16) <= dat_encrip when (cnt=1 and valid_data= '1');   
      out_encrypt (15 downto 8)  <= dat_encrip when (cnt=2 and valid_data= '1');
      out_encrypt (7 downto 0)   <= dat_encrip when (cnt=3 and valid_data= '1'); 

Gracias por su ayuda y perdón. Si le resulta difícil entenderme, porque mi inglés no es lo suficientemente bueno.

    

2 respuestas

1

No estoy seguro de si los pestillos son realmente tu problema, pero esas líneas terminan en pestillos:

out_encrypt (31 downto 24) <= dat_encrip when (cnt=0 and dato_valido= '1');
out_encrypt (23 downto 16) <= dat_encrip when (cnt=1 and valid_data= '1');   
out_encrypt (15 downto 8)  <= dat_encrip when (cnt=2 and valid_data= '1');
out_encrypt (7 downto 0)   <= dat_encrip when (cnt=3 and valid_data= '1');

Eche un vistazo a la primera línea, por ejemplo:

out_encrypt (31 downto 24) <= dat_encrip when (cnt=0 and dato_valido= '1');

Esto asignará un nuevo valor a out_encrypt(31 downto 24) , pero solo cuando cnt=0 and dato_valido= '1' . Si esta expresión se evalúa como falsa, no hay nada nuevo que asignar a out_encrypt(31 downto 24) : la herramienta de síntesis no tendrá más remedio que crear un cierre para almacenar el valor anterior. En otras palabras, necesitará una cláusula else para asignar un valor ilegal o hacer las asignaciones en un proceso cronometrado (es decir, asignar a un registro).

Más generalmente, cualquier asignación que no esté dentro de un proceso cronometrado y que no especifique un nuevo valor para cada combinación de entrada terminará como un pestillo.

    
respondido por el rainer
0

Algo no es bueno con su proceso, está escrito en una forma mixta de proceso con reinicio asíncrono y reinicio de sincronización. También falta reinicio para c y c1. Creo que, para el reinicio de sincronización que recomienda Xilinx, debería ser:

process (S_AXI_ACLK) 
    begin  
        if (rising_edge(S_AXI_ACLK)) then
             if (S_AXI_ARESETN='0')then
                a<=  '0';
                a1<= '0';
                b <= '0';
                b1 <= '0';
                c <= '0';
                c1 <= '0';
             else
                a<=Avalid_data_I;
                a1<= a;
                b <= Avalid_key_I;
                b1 <= b;
                c <= valid_data;
                c1 <=c;
             end if;
        end if;
end process;
    
respondido por el Claudio Avi Chami

Lea otras preguntas en las etiquetas