Forum: FPGA, VHDL & Co. Teilarray zuweisen - Frage zu Warnung


von der Neue (Gast)


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

von Duke Scarring (Gast)


Lesenswert?

der Neue schrieb:
> Für mich ist das doch richtig.
Für mich auf den ersten Blick auch.
Welchen Synthesizer und welches FPGA verwendest Du?

Ich könnte mir vorstellen, das XST für den Spartan3/Spartan3E sowas 
nicht richtig versteht.

Duke

von berndl (Gast)


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

von der Neue (Gast)


Lesenswert?

Ja das habe ich vergessen zu schreiben.
Es handelt sich m ein Nexys2 Board mit ise 14.3.

von der Neue (Gast)


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?

von Peter B. (funkheld)


Lesenswert?

Warnung oder Error?
Warnungen kann man manchmal übergehen.

Bei mir unter Quartus13 kommen zwar übliche Warnungen, ansonsten 
funktioniert dein VHDL auf meinem DE1.

Gruss

von Christoph Z. (christophz)


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 :-)

von Peter B. (funkheld)


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

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


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"

: Bearbeitet durch Moderator
von Peter B. (funkheld)


Lesenswert?

Hmm.. , ihr solltet mal unterscheiden zwischen einer Fehlermeldung bei 
deiner Beschreibung und oben ist es nur eine Warnung.

GRuss

: Bearbeitet durch User
von der Neue (Gast)


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.

von der Neue (Gast)


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?

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


Lesenswert?

der Neue schrieb:
> Wenn ich einen mux habe muss ich doch einen entsrechenden case anpassen
> oder ist das gar nicht so?
Aus aus dieser Beschreibung muss der Synthesizer einen Mux machen, 
denn das ist das einzige Hardwarebauelement, das eine 1:n oder n:1 
Zuordnung machen kann.

von der Neue (Gast)


Lesenswert?

Wie würde ich alternativ einen 1:n mux beschreiben mit generic n, so 
dass keine Warnung generiert wird?

von der Neue (Gast)


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

von Peter B. (funkheld)


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

: Bearbeitet durch User
von Matthias (Gast)


Lesenswert?

Du könntest in dem getakteten process einen mux einbauen indem du zb 
case benutzt.

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


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

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.