Danke Andreas, das hat mich erstmal auf die richtige Fährte geführt,
denke ich. Gut erklärt :) Aber '0' sollte doch immer ein std_logic
werden, oder nicht? Hinter die Typen bin ich noch nicht so wirklich
gestiegen. Ich finde auch, solche grundlegenden Dinge werden an kaum
einer Stelle erklärt, und nach sowas lässt sich auch eher schwerlich im
Internet suchen.
Nun bekomme ich jedoch
> Type mismatch of arguments in concatenation
für die dividend-Zuweisung.
Den rechten Teil der Gleichung noch gecasted und den äußeren
std_logic_vector-Cast entfernt:
1 | sdiv_dividend0 <= std_logic_vector( (sdiv_dividend0'length-1 downto v_fr'length => '1' ) ) & std_logic_vector( not(v_fr - bin_width(bin_width'length-1 downto 1))+1 ) ;
|
und ich bekomme
> Expression has ambiguous type
für den linken Term, also eine Mehrdeutigkeit. Aber ich habs
hinbekommen, siehe unten.
Lothar:
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 | use ieee.math_real.ceil;
|
5 | use ieee.math_real.log2;
|
6 |
|
7 | use work.pkg_sqrt.all;
|
sind eingebunden.
Die Seite mit den Qualifiern hab ich mir jetzt schon parallel
angeschaut, und erstmal Folgendes gemacht:
1 | sdiv_dividend0 <= std_logic_vector'(sdiv_dividend0'length-1 downto v_fr'length => '1') & std_logic_vector( not(v_fr - bin_width(bin_width'length-1 downto 1))+1 );
|
Und voilà, es funktioniert. Also hatte ich zwei Fehler: Einerseits waren
die Datentypen für die Concatenation zueinander nicht passend, und
zweitens war der zurückgegebene Datentyp des linken Terms nicht
eindeutig identifizierbar. Komisch, in meinem Buch "The Designer's Guide
to VHDL" findet man nichts zum Thema Qualifier im Stichwortverzeichnis,
gibt's da noch eine andere Bezeichnung?
Die Fehlermeldungen von der Division sind nun verschwunden. Aber :) Ich
meinte, ich hatte es verstanden, da poppt die gleiche Fehlermeldung in
einem anderen Teil auf:
> ERROR: (VHDL-1052) 2 definitions of operator "&" match here
1 | signal s_sd: unsigned (15 downto 0);
|
2 | [...]
|
3 | variable v_sum: signed (31 downto 0);
|
4 | constant cnt_size: integer := 9;
|
5 | [...]
|
6 | s_sd <= sqrt( unsigned( std_logic_vector'(cnt_size-2 downto 0 => '0') & (std_logic_vector(v_sum(v_sum'length-1 downto cnt_size))) ) ); -- divide by 512, sign can be ignored as value is always positive
|
Das ist ein Funktionsaufruf für SQRT
(http://vhdlguru.blogspot.de/2010/03/vhdl-function-for-finding-square-root.html).
Die Funktion erwartet als Parameter einen 32 Bit unsigned Wert und gibt
einen 16 Bit unsigned zurück.
Wie können hier bitte zwei Definitionen vom Operator vorkommen? Ist doch
nun alles eindeutig, oder nicht?