Embedded 为什么XST优化了我的寄存器,如何阻止它?

Embedded 为什么XST优化了我的寄存器,如何阻止它?,embedded,verilog,fpga,xilinx,Embedded,Verilog,Fpga,Xilinx,我有一个简单的verilog程序,它递增一个32位计数器,使用$sformat将数字转换为ASCII字符串,然后使用FTDI FT245RL将字符串一次推送到主机1字节 不幸的是,Xilinx XST一直在优化字符串寄存器向量。我尝试过各种初始化和访问例程,但都没有成功。我似乎无法关闭优化,我在网上找到的所有示例与我的初始化例程几乎没有什么不同。我做错了什么 module counter(CK12, TXE_, WR, RD_, LED, USBD); input CK12; in

我有一个简单的verilog程序,它递增一个32位计数器,使用$sformat将数字转换为ASCII字符串,然后使用FTDI FT245RL将字符串一次推送到主机1字节

不幸的是,Xilinx XST一直在优化字符串寄存器向量。我尝试过各种初始化和访问例程,但都没有成功。我似乎无法关闭优化,我在网上找到的所有示例与我的初始化例程几乎没有什么不同。我做错了什么

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 
模块计数器(CK12、TXE、WR、RD、LED、USBD);
输入CK12;
输入TXE;
输出功率;
输出RD_;
输出[7:0]发光二极管;
inout[7:0]USBD;
reg[31:0]计数=0;
reg[7:0]k;
reg wrf=0;
reg-rd=1;
reg[7:0]lbyte=8'b0000000;
reg td=1;
参数MEM_SIZE=88;
参数STR_SIZE=11;
注册[MEM_SIZE-1:0]str;
reg[7:0]strpos=8'b00000000;
最初的
开始
对于(k=0;kSTR=STR<P>$sFrand任务不太可能是可合成的——考虑编译器需要什么硬件来实现这个函数!这意味着你的“str”寄存器永远不会更新,所以编译器认为它可以优化它。考虑一个BCD计数器,也许是一个查找表,把BCD码转换成ASCII码。< /P>

AFAIK“初始”块不可合成。要初始化触发器,请使用复位信号。内存需要一个“你的”循环,但只有在重置后才会触发。

$sFrasy任务不太可能是可合成的——考虑编译器需要什么硬件来实现这个功能!这意味着你的“str”寄存器永远不会更新,所以编译器认为它可以优化它。考虑一个BCD计数器,也许是一个查找表,把BCD码转换成ASCII码。< /P>
AFAIK“初始”块不可合成。要初始化触发器,请使用复位信号。记忆需要像你一样的“for”循环,但只有在重置后才会触发。

好吧!起初我对你说的话半信半疑,但我花了最后几分钟查找什么是BCD,它看起来和我想要的一模一样。我现在只需要弄清楚如何做查找表。我怀疑$sformat,但编译器没有抱怨,它在模拟中工作得很好,但我想我现在知道了。谢谢查找表很简单-它们是
case
语句!在模拟中,您可以做任何事情—它将代码视为一个程序。对于你想要合成的东西,你必须记住你是在描述硬件,而不是编程。好吧!起初我对你说的话半信半疑,但我花了最后几分钟查找什么是BCD,它看起来和我想要的一模一样。我现在只需要弄清楚如何做查找表。我怀疑$sformat,但编译器没有抱怨,它在模拟中工作得很好,但我想我现在知道了。谢谢查找表很简单-它们是
case
语句!在模拟中,您可以做任何事情—它将代码视为一个程序。对于你想要合成的东西,你必须记住你是在描述硬件,而不是编程。