Teilarray zuweisen - Frage zu Warnung

Gast #3696055
Lesenswert?

Hallo,

Ich mache gerade das hell-world2: die Hex Anzeige. Dabei versuche ich 
möglichst jetzt so akribisch vorzugehen wie es geht, um das ganze 
irgendwann auch wirklich zu verstehen. Darum möchte ich auch keine 
Vorschläge, das ganze in einen 10-Zeiler zu packen. Die 
Präfixschreibweise bei Signalen möchte ich gerne versuchen mir 
anzueignen, vielleicht ist das ein Grund für mich sorgfälig und mit 
Bedacht vorzugehen. Ansonsten bin ich ein etwas spontanerer 
c-Programmierer. Daraus darf geschlossen werden was will ;-) FPGA ist 
ein Interesse von mir, Hobby, und so ist der Anfang ja schon schwer 
genug, da möchte ich mir mit meiner Art nicht den Weg verbauen, ich habe 
in den letzten Wochen einige posts gelesen wo eher der schnelle Weg beim 
Einstieg gegangen werden sollte. Das krieg ich aber sowiso nicht 
gescheit hin...
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_MUX    : natural := 200);
8
    Port (     sl_CLK   : in  STD_LOGIC;
9
          slv_DATA : in  STD_LOGIC_VECTOR(4*DIGITS-1 downto 0);
10
               slv_NIBBLE:out STD_LOGIC_VECTOR(3 downto 0);
11
          slv_AN   : out STD_LOGIC_VECTOR(DIGITS-1 downto 0));
12
end digits_mux;
13

14
architecture Behavioral of digits_mux is  
15
signal si_clock_delay : integer range 0 to 50000000/F_MUX := 0;
16
signal si_digit       : integer range 0 to DIGITS-1;
17
begin
18

19
digit_select : process begin
20
  wait until rising_edge(sl_clk);
21
  if( si_clock_delay < 50000000/F_MUX ) then
22
    si_clock_delay <= si_clock_delay + 1;
23
  else
24
     si_clock_delay <= 0; 
25
    if( si_digit < DIGITS-1 ) then
26
      si_digit <= si_digit + 1;
27
    else 
28
      si_digit <= 0;
29
    end if;
30
  end if;
31
end process digit_select;
32

33
process(si_digit, slv_DATA) begin
34
   slv_NIBBLE       <= slv_DATA( (si_digit+1)*4-1 downto si_digit*4 );
35
  slv_AN         <= ( others=>'0');
36
  slv_AN(si_digit)   <= '1';
37
end process;
38

39
end Behavioral;

So. Das Problem:
ich habe keine Ahnung warum mir der Synteziser eine Warnung um die Ohren 
haut. "line 60: Width mismatch. <slv_NIBBLE> has a width of 4 bits but 
assigned expression is 16-bit wide." waaarum? Schneide ich nicht geade 
bei der Zuweisung
1
 slv_NIBBLE <= slv_DATA( (si_digit+1)*4-1 downto si_digit*4 );

4 bits aus dem 16-Bit Vektor aus? wenn ich für si_digit mal 0..3 
einsetze sehe ich (3 downto 0), (7 downto 4), (11 downto 8), (15 downto 
12). Für mich ist das doch richtig. Klar sonst hätte ich das ja auch 
nciht so hingeschrieben.


Danke
Gast #3696078
Lesenswert?

Also ich hatte mit Altera Quartus genau so ein Problem: Einen 
berechneten Array-Index (und nichts anderes beschreibst du da). Ich 
musste da auch drum rum programmieren/beschreiben...

Mit Lattice Diamond und Xilinx ISE gings ohne Probleme...
Gast #3696217
Lesenswert?

Bzw. wie würde ich hier das Problem umschreiben.
Alternativ könnte ich ja auch die Anoden immer shiften und 'left wieder 
unten rein...
Ich wollte es mal anders probieren als man es immer im Netz sieht.
Wie maht ihr es bei richtigen Projekten - wenn was nicht klappt? Problem 
umschiffen? Anders machen? Rumfragen?
#3696566
Lesenswert?

Peter Bierbach schrieb:
> Warnung oder Error?
> Warnungen kann man manchmal übergehen.

Ja, Warnungen kann man nach guter Prüfung teilweise ignorieren.

der Neue schrieb:
> "line 60: Width mismatch. <slv_NIBBLE> has a width of 4 bits but
> assigned expression is 16-bit wide."

Diese Warnung würde ich zuerst mal sehr ernst nehmen und z. B. in der 
RTL View nachsehen, was der Synthesizer daraus gebaut hat. Vielleicht 
hat er das gewünschte trotzdem gebaut oder irgendwas anderes :-)
#3697009
Lesenswert?

--------------------
> "line 60: Width mismatch. <slv_NIBBLE> has a width of 4 bits but
> assigned expression is 16-bit wide."
--------------------

Nach der Meldung nach dürfte das Ding gar nicht konstruiert werden, wenn 
ich so eine Meldung bei mir sehe mit Quartus13 wird sie als Fehler 
ausgeworfen und gar nicht zu ende compiliert.

Gruss
Moderator (Firma: Titel) Persönliche Seite #3697228
Lesenswert?

der Neue schrieb:
> if( si_clock_delay < 50000000/F_MUX ) then
>     si_clock_delay <= si_clock_delay + 1;
Du zählst hier wieder mal den berühmten Schritt zu viel...

Ich hatte genau solche Multiplexer mit Vektormanipulationen mal 
untersucht. Mal sehen, wo ich das finde...

Edit:
Da ists:
http://www.lothar-miller.de/s9y/archives/65-Vektormanipulation.html
Und hier gibt's einen Thread, der sich mit solchen Zugriffen 
beschäftigt:
Beitrag "Vektorinhalt variabel zuweisen"
Gast #3698029
Lesenswert?

Lothar, der Schritt zu viel (und manchmal zu wenig) ist ein permanenter 
Effekt in meinem Kopf - Fehlschaltung oder so.
Ich glaub das geht nie auf Anhieb gut. Danke für den Hinweis und die 
Links.
Gast #3698035
Lesenswert?

Nur zur Erklärung: ich hatte mir das so vorgestellt, dass ich mit 
anderer DIGIT anzahl an der Stelle nichts mehr ändern muss.
Wenn ich einen mux habe muss ich doch einen entsrechenden case anpassen 
oder ist das gar nicht so?
Gast #3700616
Lesenswert?

Ich möchte etwas präzser fragen: ich habe versucht aus Lothars Beispiel 
1:1 zu übernehmen, da ich dachte, dass die integer indizierung 
vielleicht nur bei unsigned ohne Warnung geht. (er benutzt ja 
to_unsigned)

daei ist noch ein signal
1
signal suv_data       : unsigned(4*DIGITS-1 downto 0);

dazu gekommen und ich mache die Indizierung  damit.
1
suv_data <= unsigned(slv_DATA);
2
process(si_digit, slv_DATA) begin
3
  slv_NIBBLE <= std_logic_vector(suv_data((si_digit+1)*4-1 downto si_digit*4));
4
  slv_AN     <= ( others=>'0');
5
  slv_AN(si_digit)   <= '1';
6
end process;

Meine Frage: ist das so korrekt oder handele ich mir mit einem 
zusätzlichen Signal nur zum indizieren des Eingangssignals irgendetwas 
unerwünschtes ein? Ohne Signal und nur einem unsigned(slv_DATA) direkt 
in der Zuweisung gibt es einen Fehler.

Danke
#3700871
Lesenswert?

Compilier doch einfach.. und schau dir mal im RTL Viewer das Resultat 
an.

-----------
 Fehler.....
-----------

Meinst du ein Error oder eine Warnung?

Es gibt Compiler für ca 900 Euro und höher die dir daraus das richtige 
compilieren, aber unsere Compiler für arme Leute die nichts kosten  die 
bringen Warnungen raus. So ist das im Leben.

Ohne eine gekauften Compiler wirst du nie die Wahrheit erfahren über die 
wirklichen Fehler noch nicht einmal bei einer lauen Testbench.

Das kann nur Miller , der hat alles Profisoftware.

Gruss
Moderator (Firma: Titel) Persönliche Seite #3700993
Lesenswert?

Peter Bierbach schrieb:
> Das kann nur Miller , der hat alles Profisoftware.
Soll ich da einfach nur "Schmarrn" dazu sagen, oder braucht jemand 
deutlichere Worte? Ich mache die Beispiele auf meiner HP ganz bewusst 
nur mit freier Software.

der Neue schrieb:
> Ohne Signal und nur einem unsigned(slv_DATA) direkt in der Zuweisung
> gibt es einen Fehler.
Welchen? Ich würde gern den kompletten Dreizeiler dazu sehen...

BTW: eine VHDL Beschreibung beginnt mit den verwendeten Bibliotheken...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren