www.mikrocontroller.net

Forum: FPGA, VHDL & Co. LUT mit for loop: Synthesefehler


Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin grad dabei, einen Umsetzer zu bauen. Der soll einen 20 bit
breiten Vector, der 5 Integerzahlen enthält, in einen 40 bit breiten
Vector, der diese Zahlen als Ascii Code enthält, umsetzen. Dieser soll
dann als Datenlieferant für ein Textdisplay dienen.

Ich habe folgenden Code unten geschrieben, der syntaktisch dorch
richtig sein sollte, oder? Trotzdem kommt bei der Synthese mit dem
Webpack immer:

ERROR:HDLParsers:839 - ".../LCD_TREIBER/lcd_dec_int_to_ascii.vhd"
Line 20. Selector (Slice name of type std_logic_vector) is an
unconstrained array.

Liegt das daran, dass bei der select-Anweisung kein statischer Wert
drin steht? Oder dass er nicht weiss, ob ich überhaupt die Länge von
data_in einhalte? Eigentlich müsste es ja funzen... Vielleicht hat ja
jemand eine Idee. Habe keine Lust, die case Anweisung 5 mal zu
schreiben, das würde zwar das Probelm wohl lösen, aber das kanns ja
wohl nicht sein.
entity lcd_dec_int_to_ascii is
Port (data_in:   in  std_logic_vector(19 downto 0);
      data_out:   out std_logic_vector(39 downto 0));
end lcd_dec_int_to_ascii;

architecture Verhalten of lcd_dec_int_to_ascii is
begin

LUT: process(data_in)
begin
for index in 1 to 5 loop
  case data_in(4*index-1 downto 4*index-4) is
    when  x"1" => data_out(8*index-1  downto 8*index-8) <= x"31";
    when  x"2" => data_out(8*index-1  downto 8*index-8) <= x"32";
    when  x"3" => data_out(8*index-1  downto 8*index-8) <= x"33";
    when  x"4" => data_out(8*index-1  downto 8*index-8) <= x"34";
    when  x"5" => data_out(8*index-1  downto 8*index-8) <= x"35";
    when  x"6" => data_out(8*index-1  downto 8*index-8) <= x"36";
    when  x"7" => data_out(8*index-1  downto 8*index-8) <= x"37";
    when  x"8" => data_out(8*index-1  downto 8*index-8) <= x"38";
    when  x"9" => data_out(8*index-1  downto 8*index-8) <= x"39";
    when  others => data_out(8*index-1  downto 8*index-8) <= x"30";
  end case;
end loop;
end process;

end Verhalten;

Danke schonmal.

T.M.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das ganze jetzt mit if/elsif/else gelöst, da geht es. Bei case muss
wohl der Kontrollausdruck statisch sein... Nun müssten zwar die
Gatterlaufzeiten unterschiedlich lang sein für jeden Zweig, weil ja ein
Prioritätsencoder synthetisiert wird laut Literatur, aber das stört in
meinem Design nicht...
LUT: process(data_in)
begin
for index in 1 to 5 loop
  if data_in(4*index-1 downto 4*index-4) = x"1" then
    data_out(8*index-1  downto 8*index-8) <= x"31";
  elsif data_in(4*index-1 downto 4*index-4) = x"2" then
   data_out(8*index-1  downto 8*index-8) <= x"32";
  elsif data_in(4*index-1 downto 4*index-4) = x"3" then
   data_out(8*index-1  downto 8*index-8) <= x"33";
  elsif data_in(4*index-1 downto 4*index-4) = x"4" then
   data_out(8*index-1  downto 8*index-8) <= x"34";
  elsif data_in(4*index-1 downto 4*index-4) = x"5" then
   data_out(8*index-1  downto 8*index-8) <= x"35";
  elsif data_in(4*index-1 downto 4*index-4) = x"6" then
   data_out(8*index-1  downto 8*index-8) <= x"36";
  elsif data_in(4*index-1 downto 4*index-4) = x"7" then
   data_out(8*index-1  downto 8*index-8) <= x"37";
  elsif data_in(4*index-1 downto 4*index-4) = x"8" then
   data_out(8*index-1  downto 8*index-8) <= x"38";
  elsif data_in(4*index-1 downto 4*index-4) = x"9" then
   data_out(8*index-1  downto 8*index-8) <= x"39";
  else
   data_out(8*index-1  downto 8*index-8) <= x"30";
  end if;
end loop;
end process;

Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso machst du nicht sowas?

for index in 1 to 5 loop
  data_out(8*index-1 downto 8*index-4) <= x"3";
  data_out(8*index-5 downto 8*index-8) <= data_in(4*index-1 downto
4*index-4);
end loop;

(fehlt noch die Überprüfung, falls andere werte reinkommen)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.