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?
Error (10344): VHDL expression error at mean_value.m.vhd(92): expression has 12 elements, but must have 13 elements
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;
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.