Gast
#2218162
Hallo, ich versuche folgende Gleichung in VHDL umzusetzen: Y = (X1 - X2 - X3 + X4) / 2 ; Dabei sind X1 - X4 Signale vom Typ std_logic_vector(31 downto 0). Mein Problem ist, dass X1 - X4 sehr groß werden können (also 0xFFFFFFFF) oder eben sehr klein (also 0x00000000). Y soll am Ende auch ein std_logic_vector(31 downto 0) werden. Wenn es einen Überlauf gibt, dann soll Y = 0xFFFFFFFF ergeben. Desweiteren soll es ein Vorzeichen Signal geben (prefix), das mir Anzeigt, ob der Wert Y positiv oder negativ ist. Mein (recht kläglicher) Versuch war folgender: entity test is port( clk : in std_logic; rst_n : in std_logic; -- ... X1 : in std_logic_vector(31 downto 0); X2 : in std_logic_vector(31 downto 0); X3 : in std_logic_vector(31 downto 0); X4 : in std_logic_vector(31 downto 0); -- ... Y : out std_logic_vector(31 downto 0); prefix : out std_logic -- ... ); end entity test; architecture stb of test signal s_Y_signed : signed(31 downto 0); signal s_X1 : std_logic_vector(31 downto 0); signal s_X2 : std_logic_vector(31 downto 0); signal s_X3 : std_logic_vector(31 downto 0); signal s_X4 : std_logic_vector(31 downto 0); -- ... begin -- ... s_Y_signed <= conv_signed((( conv_integer(s_X1) - conv_integer(s_X2) - conv_integer(s_X3) + conv_integer(s_X4)) / 2), s_Y_signed'length); Y <= conv_std_logic_vector( s_Y_signed, Y'length); prefix <= s_Y_signed(s_Y_signed'high); -- ... test_proc : process (clk, rst_n) begin if (rst_n = '0') then s_X1 <= (others => '0'); s_X2 <= (others => '0'); s_X3 <= (others => '0'); s_X4 <= (others => '0'); -- ... elsif (clk'event and clk = '1') then s_X1 <= X1; s_X2 <= X2; s_X3 <= X3; s_X4 <= X4; -- ... end if; end process test_proc -- ... end architecture stb; Das mit dem Überlauf fehlt hier noch komplett, da ich mir noch nicht ganz klar darüber geworden bin wie ich das am Besten detektieren könnte. Der abgetaktete Prozess schaut hier etwas klein aus, in der Oringalfassung ist er deutlich größer. Ich hab jetzt nur die wichtigen Zuweisungen gelassen. Ich hoffe jemand kann mir helfen mein Problem zu lösen. Vll. bin ich auch mit diesem Ansatz komplett auf dem Holzweg und jemand anderes kann mir einen neuen Denkanstoß in eine andere Richtung geben. Gruß, Stahlkopf