----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date: 16.03.2022 19:12:30
-- Design Name: 
-- Module Name: pwm_test - Behavioral
-- Project Name: 
-- Target Devices: 
-- Tool Versions: 
-- Description: 
-- 
-- Dependencies: 
-- 
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
-- 
----------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.MATH_REAL.ALL;
--use IEEE.float_pkg.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

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

entity regler is
    Port ( clk : in STD_LOGIC;      --Clk -> Gibt abtastzeit vor
           w : in integer := 0;     --Sollwert
           y : in integer := 0;     --Istwert
           u : inout integer := 0; --Stellgöße
           KR : in integer := 1;    -- Verstärkung
           T : in integer := 1000;   -- Abtastzeit in us
           TV : integer := 0;     -- Vorhaltezeit   für Differenzierer interesannt
           TN : in integer := 1);   -- Nachstellzeit
end regler;

architecture Behavioral of regler is


--signal stepWidth : integer := 1;   -- 10 us   später berechnet aus Clk und Prescaler
signal prescaler : integer :=1000000;   -- prescaler für Zeit


-- Parameter aus Sprungantwort etc.
--signal KR : integer := 1;           -- Verstärkung
--signal T : integer := 1000;      -- Abtastzeit in ns = 1ms = 1000000ns
--signal TV : integer := 0;     -- Vorhaltezeit   für Differenzierer interesannt
--signal TN : integer := 10;    -- Nachstellzeit

-- Konstanten Reglerparameter
--signal a1 : integer ;
--signal b0 : integer;
--signal b1 : integer;
--signal b2 : integer;

signal a1 : integer := 1;
signal b0 : integer := KR*(1+TV/T);
signal b1 : integer := -KR *(1 - T / TN + 2 * TV / T );
signal b2 : integer := KR * TV/T;


--interne Signale signal
--signal u_k1 : integer := 0;  -- = uk-1 = u (wurde nicht geändert)
--signal e_k : integer := 0;     -- aktuelle Reglerdiffferenz
signal e_k1 : integer := 0;    -- letzte       ""
signal e_k2 : integer := 0;    -- vorletzte    ""


signal I_k : integer := 0;  -- I-Anteil


-- signal u : integer := 100000; -- Eingangswert Strecke

--signal x : integer := 0; -- Ausgangssignal Strecke -> Stellgröße



begin


process(clk)
 
    variable e_k : integer := 0;     -- aktuelle Reglerabweichung
    --variable I_k : integer := 0;     -- I-Anteil
    --variable I_k1 : integer := 0;    -- letzer I-Anteil
    
    begin
             
        if rising_edge(clk) then
               
            -- Konstanten Reglerparameter
--            a1 <= 1;
--            b0 <= KR*(1+TV/T);
--            b1 <= -KR *(1 - T / TN + 2 * TV / T );
--            b2 <= KR * TV/T;
        
            
            e_k := w - y;   --Reglerdifferenzbilden
            
            
            -- PID-Regler ---------------------------------------                     
            --u <= (a1*u+b0*e_k+b1*e_k1+b2*e_k2)/1000;   --Stellgröße u berechnen, PID-Regler
            
            --e_k2 <= e_k1;
            --e_k1 <= e_k;
            
            -- PI-Regler ----------------------------------------
            I_k <= I_k + T * 1 / TN * prescaler * e_k / prescaler;        -- I-Anteil berechnen
            u <= KR * e_k + I_k;
            
            -----------------------------------------------------           
            --u <= w;   -- Regler überbrücken!    
            
                                    
        end if;
        
end process;

--test
    
end Behavioral;
