Verilog: Signed Division durch Zweierpotenz

OP #3878997
Lesenswert?
• ▲
▼
Ich will in Verilog einen "Signed" Wert durch 2 (oder eine andere 
Zweierpotenz) teilen. Wenn ich das mit einem einfachen Rechts-Shift 
mache, ist die Arithmetik nicht symmetrisch.

Beispiel:
 11>>1 ergibt 5  ,
-11>>1 ergibt aber -6.

x=  11 = 0000001011     x>>1=   5 = 0000000101
x= -11 = 1111110101     x>>1=  -6 = 1111111010

Ich möchte eine Funktion, die symmetrisch arbeitet, bzw. der üblichen 
Divsion
entspricht. Gibt es eine etablierte Lösung in Verlog?
Moderator (Firma: Titel) Persönliche Seite #3879089
Lesenswert?
• ▲
▼
Martin O. schrieb:
> Beispiel:
>  11>>1 ergibt 5
Das ist mathematisch falsch. Denn eigentlich wird bei einer Zahl, die 
genau auf ",5000000..." endet, zur nächsten geraden Zahl hin gerundet.
Siehe http://de.wikipedia.org/wiki/Rundung unter "Mathematisches Runden"

> -11>>1 ergibt aber -6.
Was eigentlich korrekt ist...

Wenn du aber unbedingt zwangsweise in Richtung Null runden willst, dann 
addiere einfach bei einer negativen Zahl eins drauf und schiebe sie dann 
nach rechts...
#3879119
Lesenswert?
• ▲
▼
Lothar Miller schrieb:
> Der Synthesizer selber wird jede Division, die einfach mit "/2" dasteht
> durch eine "Schiebeoperation" ersetzen (in der Realität durch einfaches
> Ignorieren des LSB).

Gibts in Verilog überhaupt negative Zahlen im Zweierkomplement, oder ist 
das Sache des Anwenders und das Ergebnis folgt der alten Regel "Schrott 
rein Schrott raus"?

Aber die Lösung ist einfach: Für Zahlen mit Vorzeichen das 
Einerkomplement an Stelle des Zweierkomplements verwenden. ;-)
Persönliche Seite #3879192
Lesenswert?
• ▲
▼
Lothar Miller schrieb:
> Der Synthesizer selber wird jede Division, die einfach mit "/2" dasteht
> durch eine "Schiebeoperation" ersetzen (in der Realität durch einfaches
> Ignorieren des LSB).

"The integer division shall truncate any fractional part toward 0" (IEEE 
1800-2012)

Daraus folgt, dass ein Synthesewerkzeug, sofern es den Operator 
unterstützt, ihn auch entsprechend implementieren muss.

Erst schieben wollen, um vermeintlich "unnütze" Logik zu vermeiden und 
dann meckern, dass es nicht so funktioniert wie man es sich vorstellt. 
Wer Division meint, soll auch Division sagen und den Rest dem Tool 
überlassen.
Moderator (Firma: Titel) Persönliche Seite #3879244
Lesenswert?
• ▲
▼
Marcus Harnisch schrieb:
> Daraus folgt, dass ein Synthesewerkzeug, sofern es den Operator
> unterstützt, ihn auch entsprechend implementieren muss.
Ich nehme alles zurück und behaupte das Gegenteil!
Natürlich macht der Synthesizer die Signed Division so, dass er erst das 
Zweierkomplement bildet, dann abschneidet und dann wieder das 
Zweierkomplement bildet. Dementsprechend braucht er für die 
signed-Division 2 Addierer:
Macro Statistics
# Adders/Subtractors   : 2
 8-bit adder           : 2
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4

5
entity DivVsShift is
6
    port ( slv       : in  std_logic_vector (7 downto 0);
7

8
           uns_shift : out std_logic_vector (7 downto 0);
9
           uns_div   : out std_logic_vector (7 downto 0);
10
           sig_shift : out std_logic_vector (7 downto 0);
11
           sig_div   : out std_logic_vector (7 downto 0)
12
       );
13
end DivVsShift;
14

15
architecture Behavioral of DivVsShift is
16
begin
17
    uns_div   <= std_logic_vector( unsigned(slv) / 8);
18
    uns_shift <= std_logic_vector( shift_right( unsigned(slv), 3));
19
    sig_div   <= std_logic_vector(   signed(slv) / 8);
20
    sig_shift <= std_logic_vector( shift_right(   signed(slv), 3));
21
end Behavioral;
#3879304
Lesenswert?
• ▲
▼
Für Datentypen mit Vorzeichen:
>>> oder <<<

Wird in Verilog einfacher geregelt, nicht so kompliziert wie in VHDL.

http://www.asic-world.com/verilog/verilog2k1.html
(bis zur Mitte scollen)

---------------------------
Und was wird dann tatsächlich daraus gemacht?
---------------------------

Natürlich bleibt es eine Signed.....

Natürlich muss sie vorher  so deklariert werden :
reg signed [7:0] a;

so ist es immer eine unsigned:
reg signed [7:0] a;

Gruss
#3879378
Lesenswert?
• ▲
▼
-----------------------------------
Der erwähnte Dreizack als arithmetischer Shift ist zwar tricky, aber
nicht unbedingt intuitiv...
-----------------------------------
Es geht auch ohne Textromane.... um etwas auszuführen.

Damals hat man in "C" so gedacht als es erfunden wurde.
Und einige Befehle von  "C" sind danach in vielen anderen Sprachen
übernommen worden...,...

Gruss
Moderator (Firma: Titel) Persönliche Seite #3879522
Lesenswert?
• ▲
▼
Peter Bierbach schrieb:
> -----------------------------------
> Der erwähnte Dreizack als arithmetischer Shift ist zwar tricky, aber
> nicht unbedingt intuitiv...
> -----------------------------------
> Es geht auch ohne Textromane.... um etwas auszuführen.
Und was genau ist an "/2" wesentlich länger oder gar unverständlicher 
als an ">>>"?
Gast #3880409
Lesenswert?
• ▲
▼
------------------------
berndl (Gast)
-----------------------

So ist es nun, einige Veriloger nehmen an , das sie einfach :
reg [7:] test=-23 ; setzen können.

Natürlich geht das , es wird eine -23 draus wenn ich die Bits 
arithmetisch betrachte. Wird aber bei jeder Benutzung als unsigned 
genommen.
Gast #3880421
Lesenswert?
• ▲
▼
---------------------------------------
Der Unterschied ist, dass /2 für den gegebenen Fall das richtige
Ergebnis erzeugt ;)
---------------------------------------
Hier wird mehr Platz verschwendet im FPGA , beim VERILOG  weniger.

Nur probieren....dann sieht man das Ergebnis.

Gruss
Gast #3882513
Lesenswert?
• ▲
▼
------------------------------
Kommt denn bei der vereinfachten Verilog Beschreibung auch das richtige
Ergebnis raus?
-------------------------------


Wenn ich den weg :
reg signed [7:0] a;
einhalte ja.

bei :
reg  [7:0] a;
werden alle Bits normal berechnet ala "unsigned"

Gruss

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.