Warum ist die Optimierung XST meine Register entfernt und wie ich sie stoppen?
Frage
Ich habe ein einfaches Verilog-Programm, das einen 32-Bit-Zähler erhöht, wandelt die Zahl in einem ASCII-Zeichenfolge $ sformat mit und drückt dann die Zeichenfolge an dem Host-Rechner 1 Byte zu einem Zeitpunkt eines FTDI FT245RL verwenden.
Leider hält Xilinx XST den String Registervektor Optimierung entfernt. Ich habe versucht, ohne Erfolg mit verschiedener Initialisierung und Zugriffsroutinen herumschlagen. Ich kann nicht abschalten Optimierung scheinen, und alle die Beispiele, die ich online zu finden unterscheiden sich nur wenig von meiner Initialisierungsroutinen. Was mache ich falsch?
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
Ladevorrichtung für die Anwendung Rf_Device aus der Datei '3s100e.nph' in Umwelt /opt/Xilinx/10.1/ISE. ACHTUNG: Xst: 1293 - FF / Latch str_0 einen konstanten Wert von 0 in Block . Diese FF / Latch wird bei der Optimierung getrimmt Prozess.
ACHTUNG: Xst: 1896 - Aufgrund anderer FF / Latch Trimmen, FF / Latch str_1 einen konstanten Wert von 0 in Block . Diese FF / Latch wird bei der Optimierung getrimmt Prozess.
ACHTUNG: Xst: 1896 - Aufgrund anderer FF / Latch Trimmen, FF / Latch str_2 einen konstanten Wert von 0 in Block . Diese FF / Latch wird bei der Optimierung getrimmt Prozess.
Lösung
Die $ sformat Aufgabe ist es unwahrscheinlich, synthetisierbaren zu sein - prüfen, welche Hardware der Compiler erzeugen müssen, wäre diese Funktion zu implementieren! Dies bedeutet, dass Ihre ‚str‘ Register nie aktualisiert wird, so dass der Compiler denkt, dass es es weg zu optimieren. Betrachten wir ein BCD-Zähler, und vielleicht eine Lookup-Tabelle die BCD-Codes in ASCII-Codes zu konvertieren.
AFAIK ‚Initiale‘ Blöcke sind nicht synthetisierbaren. So initialisieren Flops, verwenden Sie ein Reset-Signal. Erinnerungen brauchen ein ‚für‘ Schleife wie Sie haben, aber das löst nur nach Reset.