Pergunta

Eu tenho um simples verilog programa que incrementa um contador de 32 bits, converte o número para uma string ASCII usando $ sformat e depois empurra a corda para o host de máquina 1 byte de cada vez usando um FTDI FT245RL.

Infelizmente Xilinx XST continua otimizando afastado o vetor de strings registo. Eu tentei perder tempo com várias rotinas de inicialização e acesso sem sucesso. Eu não consigo desligar otimização, e todos os exemplos que eu encontrar on-line diferem muito pouco dos meus rotinas de inicialização. O que estou fazendo de errado?

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 

Carregando dispositivo para aplicação Rf_Device de arquivo '3s100e.nph' em ambiente /opt/Xilinx/10.1/ISE. AVISO: Xst: 1293 - FF / Trava str_0 tem um valor constante de 0 no bloco . Este FF / Trava será aparadas durante a otimização processo.

AVISO: Xst: 1896 - Devido a outra FF / Trava rechego, FF / Trava str_1 tem um valor constante de 0 no bloco . Este FF / Trava será aparadas durante a otimização processo.

AVISO: Xst: 1896 - Devido a outra FF / Trava rechego, FF / Trava str_2 tem um valor constante de 0 no bloco . Este FF / Trava será aparadas durante a otimização processo.

Foi útil?

Solução

A tarefa sformat $ é improvável que seja synthesisable - considerar o que hardware o compilador seria necessário para produzir para implementar esta função! Isso significa que seu 'str' registo nunca é atualizado, para que o compilador acha que pode otimizá-lo afastado. Considere um contador BCD, e talvez uma tabela de pesquisa para converter os códigos BCD para códigos ASCII.

blocos AFAIK 'iniciais' não são synthesisable. Para inicializar-flops, use um sinal de reset. Memórias precisa de um 'para' loop como você tem, mas que gatilhos só depois reiniciado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top