Question

J'ai un programme simple Verilog qui incrémente un compteur 32 bits, convertit le nombre en une chaîne ASCII à l'aide de sformat $ et pousse alors la chaîne à la machine hôte 1 octet à la fois à l'aide d'un FTDI FT245RL.

Malheureusement Xilinx XST maintient l'optimisation de loin le vecteur de registre de chaîne. J'ai essayé de bidouiller avec diverses routines d'initialisation et d'accès sans succès. Je ne peux pas sembler désactiver l'optimisation, et tous les exemples que je trouve en ligne diffèrent très peu de mes routines d'initialisation. Qu'est-ce que je fais 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 
  

Dispositif de chargement pour l'application   Rf_Device de fichier « 3s100e.nph » en   environnement /opt/Xilinx/10.1/ISE.   AVERTISSEMENT: Xème: 1293 - FF / Latch str_0   a une valeur constante de 0 à bloc   . Cette FF / Latch sera   parés lors de l'optimisation   processus.

     

AVERTISSEMENT: Xème: 1896 - En raison d'autres   FF / parage Loquet, FF / Latch Str_1   a une valeur constante de 0 à bloc   . Cette FF / Latch sera   parés lors de l'optimisation   processus.

     

AVERTISSEMENT: Xème: 1896 - En raison d'autres   FF / parage Loquet, FF / Latch str_2   a une valeur constante de 0 à bloc   . Cette FF / Latch sera   parés lors de l'optimisation   processus.

Était-ce utile?

La solution

La tâche sformat de $ est peu susceptible d'être synthétisable - considérer ce matériel le compilateur aurait besoin de produire pour mettre en œuvre cette fonction! Cela signifie que votre « str » registre n'est mis à jour, de sorte que le compilateur pense qu'il peut optimiser l'écart. Considérons un compteur BCD, et peut-être une table de consultation pour convertir les codes BCD aux codes ASCII.

blocs 'initial' ne sont pas afaik synthétisable. Pour initialiser flops, utilisez un signal de réinitialisation. Les souvenirs ont besoin d'un « pour » la boucle comme vous avez, mais qui déclenche uniquement après la réinitialisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top