Gast
#1859200
versuche eine regelabweichung zu bilden und differenzengleichung zu
berechnen. Konvertiere zunächst eingang auf integer, um dann berechnung
auszuführen. doch wenn ich mir negativwerte auf board anzeigen lasse,
kommt da nur müll, nachdem ich integer ergebnis zurückkonvertiert habe
in std_logic_vector. bei positiver regelabweichung haut alles hin, aber
mit der negativen hauts leider nich hin. hat vielleicht jemand ne idee?
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
use ieee.numeric_std.all;
ENTITY regler IS
PORT
(
ein,clk :in std_logic; --EIN/AUS-Schalter für den regler
x0 :in std_logic_vector(11 downto 0);
y0,y1 :out std_logic_vector(7 downto 0);
e_test :out std_logic_vector(12 downto 0)
);
END regler;
ARCHITECTURE regler_1 OF regler IS
signal x :integer;
signal y :integer;
signal y_1 :integer;
signal e_1 :integer range -2048 to 2048;
signal e_2 :integer range -2048 to 2048;
signal e :integer range -2048 to 2048; --regelabweichung
BEGIN
PROCESS(clk,ein,x0)
BEGIN
--zu beginn y_1,e_1,e_2 sind null
if (rising_edge(clk) AND ein='1') then
x <= conv_integer(x0);
e<=2048-x; --regelabweichung nur für e>0
e_test<=conv_std_logic_vector(e,13);
y<=y_1+(10*e)-(20*e_1)+(10*e_2); --PD-Algorithmus
if y>0 then
y0 <= conv_std_logic_vector(y,8);
end if;
if y<0 then
y1 <= conv_std_logic_vector(y,8);
end if;
y_1<=y; --neuer vorheriger stellwert
e_2<=e_1;
e_1<=e; --neue vorherige regelabweichung
end if;
END PROCESS;
END regler_1;