Forum: FPGA, VHDL & Co. Addition unsigned


von Markus (Gast)


Lesenswert?

Guten Tag ich habe ein problem ich möchte zwei 12 Bit unsigned oder auch 
signed miteinander addieren... eigentlich sollte doch dann automatisch 
ein 13 Bit unsigned daraus gemacht werden jedoch wird mir eine 
Fehlermeldung angezeigt...

port(
isig12_old_diff      :  IN signed (11 downto 0);
isig12_new_diff      :  IN signed (11 downto 0);
sig13_temp           :  OUT signed (12 downto 0)
);


sig13_temp <= isig12_old_diff + isig12_new_diff;


Weiss jemand das Problem?

von Mac (Gast)


Lesenswert?

Welche Fehlermeldung wird denn angezeigt?

von Markus (Gast)


Lesenswert?

Error (10344): VHDL expression error at mean_value.m.vhd(92): expression 
has 12 elements, but must have 13 elements

von Markus (Gast)


Lesenswert?

Hier wäre sonst noch der Vollständige Code:



ENTITY mean_value IS
    PORT (
      isig12_old_diff      :  IN signed (11 downto 0);      -- 
Schnittstelle zu Cam Interface
      isig12_new_diff      :  IN signed (11 downto 0);      -- 
Schnittstelle zu Cam Interface
      ri_cntrl        :  IN t_cntrl_calc_record;        -- Schnittstelle 
zu SRAM Interface
      osig12_result      :  OUT signed (11 downto 0)      -- 
Schnittstelle zu SRAM Interface
    );
END mean_value;

ARCHITECTURE behavioral OF mean_value IS

BEGIN

  -- calc_mean: process(ri_new_diff) is
  -- begin
    -- if ri_cntrl.zyklus = 3 or ri_cntrl.zyklus = 4 then
      -- ro_result <= (ri_old_diff + ri_new_diff) SRL 1;
    -- else
      -- ro_result <= ri_new_diff;
    -- end if;
  -- end process calc_mean;

  calc_mean: process(ri_cntrl, isig12_old_diff, isig12_new_diff) is

  variable sig13_temp : signed(12 DOWNTO 0);

  begin
    if ri_cntrl.zyklus = 3 or ri_cntrl.zyklus = 4 then
      sig13_temp := isig12_old_diff + isig12_new_diff;
      osig12_result <= sig13_temp(12 DOWNTO 1);
    else
      osig12_result <= isig12_new_diff;
    end if;
  end process calc_mean;


END ARCHITECTURE behavioral;

von Duke Scarring (Gast)


Lesenswert?

Markus schrieb:
> begin
>     if ri_cntrl.zyklus = 3 or ri_cntrl.zyklus = 4 then
>       sig13_temp := isig12_old_diff + isig12_new_diff;
>       osig12_result <= sig13_temp(12 DOWNTO 1);
>     else
>       osig12_result <= isig12_new_diff;
>     end if;
>   end process calc_mean;

Für sowas machst Du eine eigene entity auf? Und dann noch ohne Takt? 
Grusel.
Wenn Du 12 Bit mit 12 Bit addierst kommen trotzdem 12 Bit raus.
Falls Du den Überlauf abfangen willst, mußt Du einen Summanden vorher 
auf 13 Bit erweitern.

Markus schrieb:
> Hier wäre sonst noch der Vollständige Code:
Das bezweifle ich, da fehlt noch folgendes:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use iee.numeric_std.all

Dann sähe Deine Erweiterung so aus:
1
  sig13_temp := isig12_old_diff + resize(isig12_new_diff, 13);

Duke

P.S.: zu den Variablen sage ich jetzt mal nix...

von Markus (Gast)


Lesenswert?

Da ich über generate 6 dieser Komponenten benötige habe ich das ganze 
als eigene entity gemacht... es ist nur ein sehr kleiner Teil eines 
grossen Projekts... Das ganze muss nicht sensitiv auf clock sein da 
diese Komponente kombinatorisch benötigt wird. Ich danke dir für deine 
schnelle Antwort.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.