Forum: FPGA, VHDL & Co. indizierter Zugriff auf std_logic_vector


von Christian F (Gast)


Lesenswert?

Hallo ich brauche noch einmal Hilfe. Es ist mir ein Rätsel.

Ich habe
1
islv_data   : in  STD_LOGIC_VECTOR(4*DIGITS-1 downto 0);
2
oslv_nibble  : out STD_LOGIC_VECTOR(3 downto 0); 
3
(...)
4
signal i_digit       : integer range 0 to DIGITS-1;


Wenn ich in einem Process aus den Eingangsdaten ein Nibble rauspicken 
möchte, verweigert sich der Syntaxcheck.
1
oslv_NIBBLE <= islv_DATA( (i_digit+1)*4-1 downto i_digit*4 );

Woher kann das kommen? Wenn ich für i_digit die möglcihen 0,1,2,3 
einsetze ist doch alles in Ordnung. Und wenn ich mal oslv_NIBBLE <= 
islv_DATA(3 downto 0) hinschreibe gibt es den Fehler nicht. Der Fehler 
behauptet ich würde dem 4 bit Vektor nibble einen 16 bit Vektor zuweisen 
wollen.
Aber rechne ich für i_digit die Zuweiseung aus:

0: (3 downto 0)
1: (7 downto 4)
2: (11 downto 8)
3: (15 downto 12)

Was mache ich denn da schon wieder falsch. :-(

von Sigi (Gast)


Lesenswert?

Der Syntax ist eigentlich ok, der Synthesizer akzeptiert
aber keine dynamische Indizierung, die muss immer statisch
sein. Dagegen müsste es in der Simulation klappen.

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


Lesenswert?

Christian F schrieb:
> verweigert sich der Syntaxcheck
Der Syntaxcheck welcher Toolchain bringt da welche Fehlermeldung?

Die Xilinx ISE kann das schon länger. Siehe dort den voutC:
http://www.lothar-miller.de/s9y/archives/65-Vektormanipulation.html

: Bearbeitet durch Moderator
von Christian F (Gast)


Lesenswert?

hi,
Ich habe Xilinx ise 14.7. tschuldigung, vergessen zu sagen. D.h. es 
sollte eigentlich funktionieren? Ich bin nicht am Rechner, poste morgen 
mal die ganze entity, vielleicht ist das ja ein kollateralschaden und 
ich hab noch einen anderen Bock? Habe noch einige Stunden weiter 
probiert und jetzt erst mal in Frust aufgegeben...

von Christian F (Gast)


Lesenswert?

Link gelesen, wird probiert. Bin optimistisch das ist ja genau mein 
Problem.
Super Homepage hast du (ist doch deine?) wenn man das Thema findet super 
reduziert.
Ich glaube bei vhdl macht sich ein Maschinenkunde bezahlt, man castet ja 
anscheinend eine Menge.

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


Lesenswert?

Christian F schrieb:
> Link gelesen, wird probiert. Bin optimistisch das ist ja genau mein
> Problem.
Sehe ich auch so. Und wie gesagt: die Fehlermeldung im exakten 
Wortlaut sagt oft mehr als man denkt...

> Super Homepage hast du (ist doch deine?)
Ja, danke. Das sollte ursprünglich mal ein Nachschlagewerk für mich 
selbst sein...

> wenn man das Thema findet
Auf der HP ist nur ein kleiner Teil der vielen großen und kleinen VHDL 
Projekten und VHDL Dreizeilern auf meinem Rechner. Und ich finde so 
einen Codeschnipsel meist nur deshalb, weil ich weiß, dass es ihn 
gibt... :-/


> Ich glaube bei vhdl macht sich ein Maschinenkunde bezahlt
Zuerst muss man sich im Klaren Wein, dass VHDL keine Programmiersprache 
ist (denn sonst hieße sie ja VHPL).
Man braucht also zerst mal eine Vorstellung, ein Bild von der Hardware, 
die man mit der Hardwarebeschreibungssprache VHDL beschreibt.

> man castet ja anscheinend eine Menge.
VHDL hat eine strenge Typverwaltung und es wird nichts implizit bzw. 
"automatisch" umgewandelt. Bei C kann man ja sogar einen Float einem 
Chat zuweisen ohne irgendetwas umzuwandeln. Das geht in VHDL nicht, man 
muss jedesmal extra hinschreiben, wie irgenwas umgewandelt werden soll.
Aber soooo arg viel muss man sich da auch nicht merken. Man nimmt 
einfach die numeric_std und prägt sich dieses Bild ein:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

: Bearbeitet durch Moderator
von Christian F (Gast)


Lesenswert?

Kurzen guten Morgen,

die Fehlermeldung im exakten Wortlaut lautet:

"WARNING:Xst:1610 - "E:/Documents/Nexys2/nexys2_disp/nexys2_disp.vhd" 
line 246: Width mismatch. <oslv_nibble> has a width of 4 bits but 
assigned expression is 16-bit wide."

Ist mir überhaupt nicht logisch, wieso die Indizierung angeblich 16 bit 
breit sind.

von Christian F (Gast)


Lesenswert?

Vielleicht sieht jemand das Problem. Ich habe den Schnipsel von Lothar 
übernommen und die selbe Warning bekommen.
Ich würde auch einfach die 4 Stellen auf dem Board fix einbauen, aber 
irgendwie wird das Problem bestimmt sowiso früher oder später 
zurückkommen und ich sollte das verstehen und hinbekommen.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity digits_mux is
6
    Generic(   DIGITS     : natural := 4;
7
               F_CLK      : natural := 50000000;
8
            F_MUX      : natural := 200);
9
    Port (     isl_clk     : in  STD_LOGIC;
10
               islv_data   : in  STD_LOGIC_VECTOR(4*DIGITS-1 downto 0);
11
               oslv_nibble  : out STD_LOGIC_VECTOR(3 downto 0); 
12
               oslv_an     : out STD_LOGIC_VECTOR(DIGITS-1 downto 0)); 
13
end digits_mux;
14
15
architecture Behavioral of digits_mux is  
16
signal i_clock_delay : integer range 0 to 50000000/F_MUX-1 := 0;
17
signal i_digit       : natural range 0 to DIGITS-1;
18
19
signal i : integer range 0 to 2**(4*DIGITS)-1;--Beispiel Lothar Miller HP
20
begin
21
22
digit_select : process 
23
begin
24
  wait until rising_edge(isl_clk);
25
  if( i_clock_delay < F_CLK/F_MUX-1 ) then
26
    i_clock_delay <= i_clock_delay + 1;
27
  else
28
     i_clock_delay <= 0;         --Eingangstakt auf mux Frequenz geteilt
29
    if( i_digit < DIGITS-1 ) then 
30
      i_digit <= i_digit + 1;
31
    else 
32
      i_digit <= 0;
33
    end if;
34
  end if;
35
end process digit_select;
36
37
38
process(i_digit, islv_DATA) 
39
begin
40
   i <= to_integer(unsigned(islv_data));
41
  --oslv_NIBBLE <= islv_DATA( (i_digit+1)*4-1 downto i_digit*4 );
42
  oslv_NIBBLE <= std_logic_vector(to_unsigned(i,16)(((i_digit+1)*4-1) downto (i_digit*4)));
43
  oslv_AN     <= ( others=>'0');
44
  oslv_AN(i_digit)   <= '1';
45
end process;
46
47
end Behavioral;

von Duke Scarring (Gast)


Lesenswert?

Ich habe soeben Deine Datei durch die ISE 14.6 geschickt:
1
...
2
3
=========================================================================
4
*                            HDL Elaboration                            *
5
=========================================================================
6
7
Elaborating entity <digits_mux> (architecture <Behavioral>) with generics from library <work>.
8
WARNING:HDLCompiler:92 - "bitslices.vhd" Line 42: i should be on the sensitivity list of the process
9
10
=========================================================================
11
*                           HDL Synthesis                               *
12
=========================================================================
13
14
Synthesizing Unit <digits_mux>.
15
    Related source file is "bitslices.vhd".
16
        DIGITS = 4
17
        F_CLK = 50000000
18
        F_MUX = 200
19
    Found 2-bit register for signal <i_digit>.
20
    Found 18-bit register for signal <i_clock_delay>.
21
    Found 6-bit subtractor for signal <n0026> created at line 42.
22
    Found 18-bit adder for signal <i_clock_delay[17]_GND_4_o_add_1_OUT> created at line 26.
23
    Found 3-bit adder for signal <n0032[2:0]> created at line 42.
24
    Found 4-bit 4-to-1 multiplexer for signal <oslv_nibble> created at line 5.
25
Found 18-bit comparator greater for signal <i_clock_delay[17]_PWR_4_o_LessThan_1_o> created at line 25
26
    Found 2-bit comparator lessequal for signal <i_digit[1]_PWR_4_o_LessThan_3_o> created at line 29
27
    Summary:
28
  inferred   3 Adder/Subtractor(s).
29
  inferred  20 D-type flip-flop(s).
30
  inferred   2 Comparator(s).
31
  inferred   1 Multiplexer(s).
32
Unit <digits_mux> synthesized.
33
34
=========================================================================
35
HDL Synthesis Report
36
37
Macro Statistics
38
# Adders/Subtractors                                   : 3
39
 18-bit adder                                          : 1
40
     3-bit adder                                           : 1
41
 6-bit subtractor                                      : 1
42
# Registers                                            : 2
43
 18-bit register                                       : 1
44
 2-bit register                                        : 1
45
# Comparators                                          : 2
46
 18-bit comparator greater                             : 1
47
 2-bit comparator lessequal                            : 1
48
# Multiplexers                                         : 1
49
 4-bit 4-to-1 multiplexer                              : 1
50
...
Bis zum Bitfile alles gut, nur die Warnung in Zeile 42 solltest Du 
beachten.

Für welchen Chip willst Du das ganze Synthetisieren?
Je nach Chip verwendet die ISE ggf. andere Synthesizer.

Duke

von Christian F (Gast)


Lesenswert?

Mein Board ist Nexys2 von Digilent. Da ist ein Spartan-3E drauf.

von Christian F (Gast)


Lesenswert?

Aber hochinteressant ist, dass mein design keine Probleme macht, wenn 
ich auf Spartan 6 umschalte. Guter Tip! Bloß ich habe ja einen S3E. :-( 
Da kann ich dann so gar nichts ändern, richtig?

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


Lesenswert?

Christian F schrieb:
> Aber hochinteressant ist, dass mein design keine Probleme macht, wenn
> ich auf Spartan 6 umschalte. Guter Tip! Bloß ich habe ja einen S3E. :-(
> Da kann ich dann so gar nichts ändern, richtig?
Doch, den neuen Parser verwenden:
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html

von Duke Scarring (Gast)


Lesenswert?

Probier mal den -new_parser switch aus:
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html

Duke

von Christian F (Gast)


Lesenswert?

Super! Vielen Dank. Gut dass ich so blöd gefragt habe.
Ich nehme an die Warnung: "WARNING:Xst:3152 - You have chosen to run a 
version of XST which is not the default solution for the specified 
device family." ist geflissentlich zu ignorieren, sie ist anscheinend 
eine Folge des o.g. switches.

Lässt sich diese Einstellung dauerhaft aktivieren oder muss das dann bei 
jedem Projekt zu Fuß gemacht werden?

von berndl (Gast)


Lesenswert?

du koenntest auch mal versuchen, den  Index vorher in einer Variablen 
zu berechnen und dann die Signalzuweisung (die Indizierung) mit dieser 
Variablen machen. Ich meine ich hatte mit GHDL auch mal so ein 
Problem...

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


Lesenswert?

Christian F schrieb:
> Ich nehme an die Warnung: "WARNING:Xst:3152 - You have chosen to run a
> version of XST which is not the default solution for the specified
> device family." ist geflissentlich zu ignorieren
Ja, Xilinx will sich da offenbar in alle Richtungen absichern...

> Lässt sich diese Einstellung dauerhaft aktivieren oder muss das dann bei
> jedem Projekt zu Fuß gemacht werden?
Nein und Ja.

Duke Scarring schrieb:
> Elaborating entity <digits_mux> (architecture <Behavioral>) with
> generics from library <work>.
> WARNING:HDLCompiler:92 - "bitslices.vhd" Line 42: i should be on the
> sensitivity list of the process
Das bedeutet einfach und pauschal: "Simulation falsch! Simulation psst 
nicht zur Hardware!"
Denn hier wäre ausnahmsweise mal eine Variable das richtige Instrument, 
weil i ja nur ein lokaler Wert ist, der nur in dem einen Prozess 
verwendet wird.
Und zudem werden in diesem einen Prozess zuviel Dinge verknüpft, die 
eigentlich nichts miteinander zu tun haben...

berndl schrieb:
> du koenntest auch mal versuchen, den  Index vorher in einer Variablen zu
> berechnen und dann die Signalzuweisung (die Indizierung) mit dieser
> Variablen machen.
Ich würde das ohne diesen kombinierten kombinatorischen Prozess und den 
Umweg über i machen:
1
      :
2
      :
3
      end if;
4
    end if;
5
  end process digit_select;
6
7
  -- das müsste doch auch ohne Umweg gehen:
8
  oslv_NIBBLE <= islv_DATA(i_digit*4+3 downto i_digit*4);
9
10
  -- und dann so:
11
  process(i_digit) 
12
  begin
13
    oslv_AN          <= (others=>'0');
14
    oslv_AN(i_digit) <= '1';
15
  end process;
16
  
17
  -- oder sogar so:
18
  oslv_AN  <= std_logic_vector(to_unsigned(2**i_digit,DIGITS));
19
  
20
end Behavioral;

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.