Waarom optimaliseer XST my registers en hoe stop ek dit?
Vra
Ek het 'n eenvoudige verilog-program wat 'n 32-bis-teller verhoog, die nommer na 'n ASCII-string omskakel met $sformat en dan die string na die gasheermasjien 1 byte op 'n slag met 'n FTDI FT245RL stoot.
Ongelukkig hou Xilinx XST aan om die stringregistervektor weg te optimaliseer.Ek het probeer om met verskeie inisialiserings- en toegangsroetines rond te spoel sonder sukses.Ek kan blykbaar nie optimalisering afskakel nie, en al die voorbeelde wat ek aanlyn vind verskil baie min van my inisialiseringsroetines.Wat doen ek verkeerd?
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
Laai toestel vir toepassing Rf_Device uit lêer '3s100e.nph' in omgewing /opt/Xilinx/10.1/ISE.WAARSKUWING:Xst:1293 - VF/Grendel str_0 het 'n konstante waarde van 0 in blok .Hierdie VF/Grendel sal wees afgewerk tydens die optimalisering Proses.
WAARSKUWING:Xst:1896 - As gevolg van ander VF/Grendel snoei, VF/Grendel str_1 het 'n konstante waarde van 0 in blok .Hierdie VF/Grendel sal wees afgewerk tydens die optimalisering Proses.
WAARSKUWING:Xst:1896 - As gevolg van ander VF/Grendel snoei, VF/Grendel str_2 het 'n konstante waarde van 0 in blok .Hierdie VF/Grendel sal wees afgewerk tydens die optimalisering Proses.
Oplossing
Die $sformat-taak sal waarskynlik nie sintetiseerbaar wees nie - oorweeg watter hardeware die samesteller sal moet produseer om hierdie funksie te implementeer!Dit beteken jou 'str'-register word nooit opgedateer nie, so die samesteller dink dit kan dit weg optimaliseer.Oorweeg 'n BCD-teller, en miskien 'n opsoektabel om die BCD-kodes na ASCII-kodes om te skakel.
AFAIK 'aanvanklike' blokke is nie sintetiseerbaar nie.Gebruik 'n terugstelsein om flops te inisialiseer.Herinneringe het 'n 'vir'-lus nodig soos jy het, maar wat eers na terugstelling aktiveer.