Pregunta

Tengo un sencillo programa de Verilog que se incrementa un contador de 32 bits, convierte el número a una cadena ASCII usando $ sformat y luego empuja la cadena en el host de máquina 1 byte a la vez utilizando un FT245RL FTDI.

Desafortunadamente Xilinx XST se sigue optimizando el vector de distancia registro cadena. He intentado rededor diversas rutinas de inicialización y de acceso sin éxito. Me parece que no puede apagar la optimización, y todos los ejemplos que encuentro en línea difieren muy poco de mis rutinas de inicialización. ¿Qué estoy haciendo mal?

module counter(CK12, TXE_, WR, RD_, LED, USBD);

   input CK12;
   input TXE_;
   output WR;
   output RD_;
   output [7:0] LED;
   inout [7:0] USBD;

   reg [31:0] count = 0;

   reg [7:0] k;
   reg wrf  = 0;
   reg rd   = 1;
   reg [7:0] lbyte = 8'b00000000;   

   reg td              = 1;
   parameter MEM_SIZE  = 88;
   parameter STR_SIZE  = 11;
   reg [MEM_SIZE - 1:0] str;
   reg [7:0] strpos = 8'b00000000;

   initial
     begin
        for (k = 0; k < MEM_SIZE; k = k + 1)
          begin
             str[k]    = 0;
          end
     end

   always @(posedge CK12)
     begin
        if (TXE_ == 0 && wrf == 1)
          begin
             count    = count + 1;
             wrf         = 0;
          end


        else if (wrf == 0)  // If we've already lowered the strobe, latch the data
          begin
             if(td)
               begin
                  $sformat(str, "%0000000000d\n", count);
                  strpos = 0;
                  td     = 0;
               end

             str      = str << 8;
             wrf         = 1;
             strpos      = strpos + 1;       

             if(strpos == STR_SIZE)
               td        = 1;

          end       
     end

   assign RD_             = rd;
   assign WR              = wrf;
   assign USBD            = str[87:80];
   assign LED             = count[31:24];

endmodule 
  

dispositivo de carga para aplicación   Rf_Device de archivo '3s100e.nph' en   /opt/Xilinx/10.1/ISE ambiente.   ADVERTENCIA: Xème: 1293 - FF / Latch str_0   tiene un valor constante de 0 en el bloque   . Esta FF / bloqueo será   recortado durante la optimización   proceso.

     

ADVERTENCIA: Xème: 1896 - Debido a la otra   FF / Latch recorte, FF / Latch str_1   tiene un valor constante de 0 en el bloque   . Esta FF / bloqueo será   recortado durante la optimización   proceso.

     

ADVERTENCIA: Xème: 1896 - Debido a la otra   FF / Latch recorte, FF / Latch Str_2   tiene un valor constante de 0 en el bloque   . Esta FF / bloqueo será   recortado durante la optimización   proceso.

¿Fue útil?

Solución

La tarea $ sformat es poco probable que sea synthesisable - tener en cuenta el tipo de hardware necesitaría el compilador para producir implementar esta función! Esto significa que su 'str' Nunca registro se actualiza, por lo que el compilador cree que puede optimizar la basura. Considere un contador BCD, y tal vez una tabla de búsqueda para convertir los códigos BCD a los códigos ASCII.

bloques 'iniciales' yo sepa no son synthesisable. Para inicializar los fracasos, utilice una señal de reset. Recuerdos necesitan un 'para' bucle como que tiene, pero que se dispara sólo después de un reinicio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top