Domanda

Ho un semplice programma Verilog che incrementa un contatore a 32 bit, converte il numero in una stringa ASCII utilizzando $ sformat e poi spinge la stringa per l'host macchina 1 byte alla volta utilizzando un FTDI FT245RL.

Purtroppo Xilinx XST mantiene ottimizzando via il vettore registro stringa. Ho provato a gingillarsi con i vari inizializzazione e di accesso routine senza successo. Non riesco a disattivare l'ottimizzazione, e tutti gli esempi che ho trovato on-line differiscono pochissimo da mia routine di inizializzazione. Che cosa sto facendo di sbagliato?

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 di caricamento per l'applicazione   Rf_Device da file '3s100e.nph' in   ambiente /opt/Xilinx/10.1/ISE.   ATTENZIONE: Xst: 1293 - FF / Latch str_0   ha un valore costante di 0 nel blocco   . Questo FF / Latch sarà   rifilato durante l'ottimizzazione   processo.

     

ATTENZIONE: Xst: 1896 - A causa di altri   FF / Latch rifilatura, FF / Latch str_1   ha un valore costante di 0 nel blocco   . Questo FF / Latch sarà   rifilato durante l'ottimizzazione   processi.

     

ATTENZIONE: Xst: 1896 - A causa di altri   FF / Latch rifilatura, FF / Latch str_2   ha un valore costante di 0 nel blocco   . Questo FF / Latch sarà   rifilato durante l'ottimizzazione   processo.

È stato utile?

Soluzione

Il compito $ sformat è improbabile che sia sintetizzabile - in considerazione ciò che l'hardware del compilatore avrebbe bisogno di produrre per implementare questa funzione! Questo significa che il 'str' Registra non viene mai aggiornato, in modo che il compilatore pensa di poter ottimizzare la via. Si consideri un contatore BCD, e forse una tabella di ricerca per convertire i codici BCD ai codici ASCII.

AFAIK blocchi 'iniziali' non sono sintetizzabile. Per inizializzare flop, utilizzare un segnale di reset. I ricordi hanno bisogno di un 'per' ciclo come avete, ma che innesca solo dopo il reset.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top