Forum: FPGA, VHDL & Co. String als Konstante definieren


von Uwe B. (derexponent)


Lesenswert?

Hallo,

-hier eine Frage zu einer String Definition :

dieser Codeabschnitt :
1
architecture Verhalten of Test1 is
2
3
  signal c_str : STRING(1 to 16):="abcdefghijklmnop";
4
  signal v_chr : character;
5
  signal chr_pos : integer range c_str'range := c_str'left;
6
  signal data : std_logic_vector(7 downto 0);  
7
  
8
begin
9
  v_chr <= c_str(chr_pos);
10
  data <= std_logic_vector(to_unsigned(character'pos(v_chr),8));
11
end Verhalten;

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
architecture Verhalten of Test1 is
2
3
  constant c_str : STRING(1 to 16):="abcdefghijklmnop";
4
  signal v_chr : character;
5
  signal chr_pos : integer range c_str'range := c_str'left;
6
  signal data : std_logic_vector(7 downto 0);  
7
  
8
begin
9
  v_chr <= c_str(chr_pos);
10
  data <= std_logic_vector(to_unsigned(character'pos(v_chr),8));
11
end Verhalten;

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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?

von Uwe B. (derexponent)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von H..M. (Gast)


Lesenswert?

Deine beiden Beispiele in einen TestBench umgewandelt
ergeben bei mir immer 'a'. (verwende 13.2).
Am "constant"/"signal" liegt's also (auch offensichtlich)
nicht.

von Uwe B. (derexponent)


Lesenswert?

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
signal chr_pos : integer range c_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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Uwe B. schrieb:
> -werd heut abend auch ne Testbench schreiben
Da fällt mir der Beitrag "Re: ISim: String-Darstellung im Waveplot" 
wieder ein...

Und: die Version 13 bringts auch noch nicht...
Das geht (unabhängig ob signal oder constant):
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity StringToSLV is
6
    Port ( clk  : in  STD_LOGIC;
7
           dout : out  STD_LOGIC_VECTOR (7 downto 0));
8
end StringToSLV;
9
10
architecture Behavioral of StringToSLV is
11
constant txt : string(1 to 4) := "azby";
12
-- signal txt : string(1 to 4) := "abcd";
13
signal ch  : character := 'o';
14
signal cnt : integer range txt'range := txt'left;
15
16
begin
17
   process begin
18
      wait until rising_edge(clk);
19
      if cnt < txt'right then  cnt <= cnt+1;
20
      else                     cnt <= txt'left;
21
      end if;
22
   end process;
23
24
   ch   <= txt(cnt);
25
  
26
   process (ch) begin
27
      dout <= std_logic_vector(to_unsigned(character'pos(ch),8));
28
   end process;
29
end Behavioral;

Aber das geht nicht:
1
   : -- alles gleich wie oben
2
   :
3
   ch   <= txt(cnt);
4
 
5
   dout <= std_logic_vector(to_unsigned(character'pos(ch),8));
6
7
end Behavioral;

Und das obwohl die Concurrent-Beschreibung
1
   dout <= std_logic_vector(to_unsigned(character'pos(ch),8));
eigentlich 1:1 in den Prozess überführbar sein müsste!
1
   process (ch) begin
2
      dout <= std_logic_vector(to_unsigned(character'pos(ch),8));
3
   end process;

Und wie schon gesagt: der ModelSim kanns, der ISIM nicht!

von Uwe B. (derexponent)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Klaus (Gast)


Lesenswert?

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.

von Uwe B. (derexponent)


Angehängte Dateien:

Lesenswert?

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
1
entity Test_Prj8_VHDL is
2
  port(
3
    CLK_50MHZ_IN : in std_logic;
4
    LED_OUT : out std_logic_vector(7 downto 0)
5
  );
6
end Test_Prj8_VHDL;
7
8
architecture Verhalten of Test_Prj8_VHDL is
9
10
11
  
12
13
  constant c_str : STRING(1 to 16):="abcdefghijklmnop";
14
  signal v_chr : character;
15
  signal chr_pos : integer range 0 to 17:=1;
16
  
17
  
18
begin
19
20
  P1 : process(CLK_50MHZ_IN) begin
21
    if rising_edge(CLK_50MHZ_IN) then
22
      v_chr <= c_str(chr_pos);
23
      LED_OUT <= std_logic_vector(to_unsigned(character'pos(v_chr),8));
24
    end if;
25
  end process P1;
26
  
27
    
28
29
end Verhalten;

...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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Uwe B. (derexponent)


Lesenswert?

Hi nochmal,

-hier der Text von der Synthese bei "signal c_str : STRING(1 to 16)"

1
=========================================================================
2
*                           HDL Synthesis                               *
3
=========================================================================
4
5
Performing bidirectional port resolution...
6
7
Synthesizing Unit <Test_Prj8_VHDL>.
8
    Related source file is "F:/Data_Temp_Ordner/Xilinx/Projekte/Test_Prj8/Test_Prj8/Test_Prj8_VHDL.vhd".
9
WARNING:Xst:1780 - Signal <chr_pos<4>> is never used or assigned. This unconnected signal will be trimmed during the optimization process.
10
WARNING:Xst:653 - Signal <chr_pos<3:0>> is used but never assigned. This sourceless signal will be automatically connected to value 0001.
11
WARNING:Xst:1781 - Signal <c_str> is used but never assigned. Tied to default value.
12
    Found 16x8-bit ROM for signal <$varindex0000> created at line 52.
13
    Found 8-bit register for signal <LED_OUT>.
14
    Found 8-bit register for signal <v_chr>.
15
    Summary:
16
  inferred   1 ROM(s).
17
  inferred  16 D-type flip-flop(s).
18
Unit <Test_Prj8_VHDL> synthesized.
19
20
21
=========================================================================
22
HDL Synthesis Report
23
24
Macro Statistics
25
# ROMs                                                 : 1
26
 16x8-bit ROM                                          : 1
27
# Registers                                            : 2
28
 8-bit register                                        : 2
29
30
=========================================================================
31
32
=========================================================================
33
*                       Advanced HDL Synthesis                          *
34
=========================================================================
35
36
37
Synthesizing (advanced) Unit <Test_Prj8_VHDL>.
38
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.
39
Unit <Test_Prj8_VHDL> synthesized (advanced).
40
41
=========================================================================
42
Advanced HDL Synthesis Report
43
44
Macro Statistics
45
# ROMs                                                 : 1
46
 16x8-bit ROM                                          : 1
47
# Registers                                            : 16
48
 Flip-Flops                                            : 16
49
50
=========================================================================


und hier bei "constant c_str : STRING(1 to 16)"

1
=========================================================================
2
*                           HDL Synthesis                               *
3
=========================================================================
4
5
Performing bidirectional port resolution...
6
7
Synthesizing Unit <Test_Prj8_VHDL>.
8
    Related source file is "F:/Data_Temp_Ordner/Xilinx/Projekte/Test_Prj8/Test_Prj8/Test_Prj8_VHDL.vhd".
9
WARNING:Xst:1780 - Signal <chr_pos<4>> is never used or assigned. This unconnected signal will be trimmed during the optimization process.
10
WARNING:Xst:653 - Signal <chr_pos<3:0>> is used but never assigned. This sourceless signal will be automatically connected to value 0001.
11
    Found 16x8-bit ROM for signal <v_chr$rom0000> created at line 52.
12
    Found 8-bit register for signal <LED_OUT>.
13
    Found 8-bit register for signal <v_chr>.
14
    Summary:
15
  inferred   1 ROM(s).
16
  inferred  16 D-type flip-flop(s).
17
Unit <Test_Prj8_VHDL> synthesized.
18
19
20
=========================================================================
21
HDL Synthesis Report
22
23
Macro Statistics
24
# ROMs                                                 : 1
25
 16x8-bit ROM                                          : 1
26
# Registers                                            : 2
27
 8-bit register                                        : 2
28
29
=========================================================================
30
31
=========================================================================
32
*                       Advanced HDL Synthesis                          *
33
=========================================================================
34
35
36
Synthesizing (advanced) Unit <Test_Prj8_VHDL>.
37
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.
38
Unit <Test_Prj8_VHDL> synthesized (advanced).
39
40
=========================================================================
41
Advanced HDL Synthesis Report
42
43
Macro Statistics
44
# ROMs                                                 : 1
45
 16x8-bit ROM                                          : 1
46
# Registers                                            : 16
47
 Flip-Flops                                            : 16
48
49
=========================================================================



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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.