Bronco schrieb:
> Ich hab da was von "nur für bit_vector" im Hinterkopf...
Klar: weil du nie einen bit_vector verwendest... ;-)
task schrieb:
> nur aus welchen Grund kann man nicht /2 oder srl einsetzen?
Weil die Rechnung /2 für std_logic_vector offenbar nicht nicht
definiert ist. Dafür müsstest du die std_logic_arith verwenden, aber wie
gesagt: man rechnet nicht mit uneingeschränkten Vektoren!
Aber es ist ein Lichtstreifen am Horizont:
die numeric_std kann wenigstens mal unsigned und signed schieben:
1 | --===============================================================
|
2 | -- Shift and Rotate Functions
|
3 | --===============================================================
|
4 | -- Id: S.1
|
5 | function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;
|
6 | -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0)
|
7 | -- Result: Performs a shift-left on an UNSIGNED vector COUNT times.
|
8 | -- The vacated positions are filled with '0'.
|
9 | -- The COUNT leftmost elements are lost.
|
10 | -- Id: S.2
|
11 | function SHIFT_RIGHT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;
|
12 | -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0)
|
13 | -- Result: Performs a shift-right on an UNSIGNED vector COUNT times.
|
14 | -- The vacated positions are filled with '0'.
|
15 | -- The COUNT rightmost elements are lost.
|
Und mit std_logic wäre dann das möglich:
1 | line_rate_own <= std_logic_vector( shift_right(unsigned(line_rate_1),1) );
|
> Eine Division ist i.a.R. nicht synthetisierbar (ggf. ist die Synthese
> aber so schlau, zu erkennen, daß es durch einen Shift ersetzt werden
> kann).
Das kann die schon lange, denn eine Division eines unsigned durch eine
Zweierpotenz ist kein Schieben, sondern einfach ein Umverdrahten. Es
werden einfach die Bits anders weiterverbunden.
Und damit gings natürlich auch so:
1 | line_rate_own <= std_logic_vector( unsigned(line_rate_1)/2 );
|