www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Rechnen mit signed und unsigned


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe ein Problem und zwar möchhte ich eine Addition 
durchführen, in der ein Summand unsigned und der andere signed ist.

Auf dieser Seite hab ich unter Rechnen in VHDL folgendes gefunden

>signal x: unsigned(7 downto 0); -- Zahlenbereich: 0 bis 2**8-1
>signal y: signed(7 downto 0); -- Zahlenbereich: -2**7 bis 2**7-1
>...
>x <= x + 1;
>y <= x + y;

Wenn ich dies Implementiere kommt immer der Fehler "Found 0 definitions 
for operator "+"...

Wenn ich beide Summanden und die Summe signed ODER unsigned mache, 
funktioniert es.
Ich wurde aber gerne rechnen: signed = unsigned + signed, wie oben ja zu 
sehen ist und funktionieren sollte.

Was mache ich falsch? Hier mal mein Codebeispiel

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity top is
 port (
  CLK : in std_logic
 );
end top;

architecture Behavioral of top is

 signal x : unsigned(7 downto 0) := (others => '0');
 signal y : signed(7 downto 0) := (others => '0');

begin

 process
 begin
  wait until rising_edge(CLK);
  y <= x + y;
 end process;

end Behavioral;

Wie gesagt mache ich x signed oder y unsigned funktioniert es, ansonsten 
der Fehler.

Danke für hilfe

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Holzhammermehtode wäre ein integer:
  y <= to_signed(to_integer(x) + to_integer(y),y'length);

Kompakter ist es so:
      z <= signed('0'&x) + y;

Aber du solltest prinzipiell genau auf einen evtl. Überlauf schauen.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke ich glaub ich habs, auch mit überlauf, werd es so machen

z <= to_integer(unsigned(b"00" & Input_1)) + signed(Input_2(7) & 
Input_2(7) & Input_2);

Input 1 und 2 sind zwei 8 Bit vectoren und z ist unsigned 10 Bit, für 
Vorzeichen und Überlauf, müsst so passen, jeden falls laut Simulation.

Autor: Thomas Reinemann (Firma: abaxor engineering) (abaxor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> z <= to_integer(unsigned(b"00" & Input_1)) + signed(Input_2(7) &
> Input_2(7) & Input_2);

Für so etwas

unsigned(b"00" & Input_1)

gibt es resize

resize (Input_1, Input_1'length + 2)

resize (Input_2, Input_2'length + 2)

am Besten

signal z : signed (input_1'length + 1 downto 0);

z <= signed (resize (unsigned (Input_1, z'length))) + resize (signed 
(Input_2, z'length));

Tom

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke wusst ich nocht nicht

Autor: J. S. (Firma: Telekomunikation Darmstadt) (juergenffm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas, geht das auch bei unsigned?

Autor: Thomas Reinemann (Firma: abaxor engineering) (abaxor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen S. schrieb:
> Thomas, geht das auch bei unsigned?

Was soll auch bei unsigned gehen? Resize kann man sowohl auf signed und 
unsigned anwenden. Das steht aber im Beispiel.

Tom

Autor: Olfa (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute

bin neuling in VHDL muss zwei schaltungen entwerfen in VHDL die 
einerstelle und zehnstelle der dezimaldarstellung als vier bwz 
zweistellige binärwort.dafür muss ich die mathematische operation 
benutzen mod und to_integer(unsigned(s)) hab keine ahnung wie ich das 
machen kann.kann mir jemand helfen,ich bis jetzt dieses code geschrieben 
es geht um 7-segment schaltung:

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Aufgabe nicht verstanden, aber das hier ist unnötig 
kompliziert:
port(
     cardsum:in std_logic_vector(4 downto 0)
     broke : out std_logic);
          
end Broke;

architecture verhalten of Broke is
begin

with cardsum select
broke <= '1' when "10110", 
         '1' when "10111",
         '1' when "11000",
         '1' when "11001",
         '1' when "11010",
         '1' when "11011",
         '1' when "11100",
         '1' when "11101",
         '1' when "11110",
         '1' when "11111",
         '0'when others;
         
end verhalten;
Das ginge so viel kürzer:
port(
     cardsum:in std_logic_vector(4 downto 0)
     broke : out std_logic);
end Broke;

architecture verhalten of Broke is
begin
  broke <= '1' when unsigned(cardsum)>22 else '0';
end verhalten;
Und spätestens dann darf man sich fragen, ob überhaupt ein eigenes Modul 
dafür nötig ist...

Aber wie gesagt:
ich habe das Problem nicht verstanden, evtl. willst du damit ja noch 
irgendwas anstellen. Zeichne doch mal ein Bild, das deine Aufgabe 
darstellt.

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.