liefert als Ergebnis in "data" die Zahl 61Hex = 'a'
das ist das erste Zeichen im String...so wie es sein soll
ABER !
wenn ich jetzt nur eine Zeile ändere und
aus dem "signal c_str" ein "constant c_str" mache,
kommt als Ergebnis die Zahl 62Hex = 'b' raus !!
Das ist das zweite Zeichen im String !!
1. Wie kommt es zu diesem "Fehler"
2. Muss ich einen String (den ich nicht mehr verändern will)
nicht als "constant" definieren ?
und was ich jetzt noch gesehen habe :
der "Fehler" tritt nicht auf, wenn der String
kleiner als 16 Zeichen lang ist !?!
Danke und Gruss Uwe
> STRING(1 to 16)
Was kommt raus, wenn du das so änderst:
STRING(0 to 15)
Uwe B. schrieb:> der "Fehler" tritt nicht auf, wenn der String> kleiner als 16 Zeichen lang ist !?!
WO tritt der Fehler denn überhaupt auf?
Im Simulator? Welcher?
Oder auf der Hardware?
Hi Lothar,
-der "Fehler" (wenn ich den mal so nennen darf...
er kann ja auch bei mir liegen)
habe ich auf der Zielhardware (Xilinx, Spartan-3, ISE 13.1)
-ich lasse mir das erste Zeichen eines Strings
auf den 8Bit LEDs ausgeben und sehe das es
einen Unterschied macht, ob ich den String
als "signal" oder als "constant" definiert habe
P.S. als Ausgangsbasis habe ich dein Beispiel
von hier benutzt :
Link zu Artikel "Beitrag "ISim: String-Darstellung im Waveplot";
...im Simulator hab ich es noch nicht getestet
Nachtrag :
bei "STRING(0 to 15)" meckert die ISE von Xilinx
das "0" nicht im Index-Range von "1" bis "2147484347"
eines "array STRING" liegt...das geht also nicht
Gruss Uwe
Uwe B. schrieb:> -ich lasse mir das erste Zeichen eines Strings> auf den 8Bit LEDs ausgeben und sehe das es> einen Unterschied macht, ob ich den String> als "signal" oder als "constant" definiert habe
Lass dir mal die RTL-Schaltpläne anzeigen. Unterscheiden die sich?
Deine beiden Beispiele in einen TestBench umgewandelt
ergeben bei mir immer 'a'. (verwende 13.2).
Am "constant"/"signal" liegt's also (auch offensichtlich)
nicht.
Danke ihr beiden für die Hilfe,
-ich hab gestern mal noch in einem "Qick&Dirty" Test
das Signal "chr_pos" gegen eine feste Zahl getauscht :
1
v_chr<=c_str(1);
so geht es komischerweise auch immer (egal op signal/constant)
@Lothar,
-werd heut abend auch ne Testbench schreiben
und danach versuchen noch die RTL-Schaltpläne zu vergleichen
Nachtrag...
...und P.S. er 'verschiebt' nicht nur die Position (1)
sondern alle Positionen um eine stelle nach rechts :
also wenn ich die 3te Stelle auslesen will :
1
signalchr_pos:integerrangec_str'range:=3;
2
v_chr<=c_str(chr_pos);
kommt einmal der Buchstabe 'c' (signal)
und einmal der Buchstabe 'd' (constant) raus
Gruss Uwe
Hi Lothar,
-mal eine generelle Frage...das Synthesetool erkennt ja anscheinend
(wie ich aus den Screenshots von deinem anderen Beitrag erkennen kann)
welche Signal-Bits sich ändern und welche fest verdrahtet (GND,VCC)
werden können
...warum (bzw. welcher Zweck) hat dann bei der VHDL-Beschreibung
der Unterschied signal/constant
...würde es nicht ausreichen einfach "ALLES" als "signal" zu definieren
?
Gruss Uwe
Uwe B. schrieb:> ...würde es nicht ausreichen einfach "ALLES" als "signal" zu definieren
Es läuft mehr oder weniger aufs Gleiche raus... ;-)
Wenn die Synthese sieht, dass ein Signal nur gelesen wird, dann ist es
automatisch konstant. Sowas wie volatile in C gibt es nicht...
Lothar Miller schrieb:> Uwe B. schrieb:>> ...würde es nicht ausreichen einfach "ALLES" als "signal" zu definieren> Es läuft mehr oder weniger aufs Gleiche raus... ;-)> Wenn die Synthese sieht, dass ein Signal nur gelesen wird, dann ist es> automatisch konstant. Sowas wie volatile in C gibt es nicht...
Das hat wohl eher dokumentarische Funktion. Wenn ich mir fremden VHDL
Code anschaue und ein constant sehe, dann weiß ich, dass dieses signal
nie beschrieben wird, und dieser Wert eine besondere Bedeutung hat.
Hi nochmal,
-hab jetzt noch etwas rumprobiert ... hier das Ergebnis :
1. mit einer Testbench und ModelSim sieht man keinen
Unterschied zwischen "signal/constant" und es kommt
immer der richtige Wert raus
2. auf der Zielhardware macht es einen Unterschied
(bei signal = ok, bei constant = fehler)
3. ich hab dann mal den VHDL-Code abgeändert, das ganze
in einen Prozess gepackt und mir das RTL-Schema
anzeigen lassen
...die Bilder seht ihr ja
-warum ISE bei der Synthese diesen "Fehler" macht
verstehe ich nicht...aber ich nehme es jetzt halt so hin,
und definiere Strings ab jetzt immer als "signal" und gut ist
...man muss vielleicht nicht alles verstehen :-)
Danke trotzdem für die Hilfe
@Klaus,
"Wenn ich ein constant sehe, dann weiß ich, dass dieses signal
nie beschrieben wird"
genau aus dem Grund habe ich bei meinem String
ein "constant" davorgesetzt...es soll ein Text
für ein LCD-Display werden der sich nicht ändert
Gruss Uwe
Uwe B. schrieb:> -warum ISE bei der Synthese diesen "Fehler" macht> verstehe ich nicht...
Das sieht wirklich urig aus... :-o
Welche Meldungen bekommst du bei der Synthese bei den beiden Fällen
bzgl. RAM/ROM?
Was passiert, wenn du den "neuen" Parser verwendest:
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html
Evtl. versteht der besser, was du willst...
INFO:Xst:3034 - In order to maximize performance and save block RAM resources, the small ROM <Mrom__varindex0000> will be implemented on LUT. If you want to force its implementation on block, use option/constraint rom_style.
INFO:Xst:3034 - In order to maximize performance and save block RAM resources, the small ROM <Mrom_v_chr_rom0000> will be implemented on LUT. If you want to force its implementation on block, use option/constraint rom_style.
nach der Umstellung auf den "neuen" Parser
legt er alle Signale fest auf Lo-Potential
(egal ob signal oder constant) !!
1
WARNING:HDLCompiler:871 - "F:\Data_Temp_Ordner\Xilinx\Projekte\Test_Prj8\Test_Prj8\Test_Prj8_VHDL.vhd" Line 45: Using initial value 1 for chr_pos since it is never assigned
2
WARNING:HDLCompiler:1127 - "F:\Data_Temp_Ordner\Xilinx\Projekte\Test_Prj8\Test_Prj8\Test_Prj8_VHDL.vhd" Line 50: Assignment to v_chr ignored, since the identifier is never used
3
WARNING:HDLCompiler:634 - "F:\Data_Temp_Ordner\Xilinx\Projekte\Test_Prj8\Test_Prj8\Test_Prj8_VHDL.vhd" Line 44: Net <v_chr[7]> does not have a driver.
4
WARNING:Xst:2935 - Signal 'v_chr', unconnected in block 'Test_Prj8_VHDL', is tied to its initial value (00000000).
5
WARNING:Xst:2404 - FFs/Latches <LED_OUT<7:0>> (without init value) have a constant value of 0 in block <Test_Prj8_VHDL>.
6
WARNING:Xst:3152 - You have chosen to run a version of XST which is not the default solution
7
for the specified device family. You are free to use it in order to take
8
advantage of its enhanced HDL parsing/elaboration capabilities. However,
9
please be aware that you may be impacted by language support differences.
10
This version may also result in circuit performance and device utilization
11
differences for your particular design. You can always revert back to the
12
default XST solution by setting the "use_new_parser" option to value "no"
13
on the XST command line or in the XST process properties panel.
...ich lass es damit gut sein und mach einfach mit dem
"Walkaround" weiter
Gruss Uwe