Hallo Leute,
ich hab's erneut versucht und dabei kam folgendes heraus:
entity MW is
port ( clk : in std_logic;
reset : in std_logic;
enable : in std_logic;
InData : in std_logic_vector(5 downto 0);
done : out std_logic;
mw : out std_logic_vector(5 downto 0)
);
end MW;
architecture Bahavioral of Average is
type Puffer is array (15 downto 0) of
std_logic_vector(5 downto 0);
signal Summe : std_logic_vector(9 downto 0);
signal InBuffer : Puffer;
signal shifted : std_logic;
signal int_done : std_logic;
begin
process (clk, reset, enable, InData)
begin
if (reset = '1') then
InBuffer <= (others => "000000");
shifted <= '0';
elsif (rising_edge(clk)) then
if (enable = '1') then
InBuffer <= (InBuffer(14 downto 0) & InData);
shifted <= '1';
else
shifted <= '0';
end if;
end if;
end process;
process (clk, reset, shifted, InBuffer)
begin
if (reset = '1') then
Summe <= (others => '0');
elsif (rising_edge(clk)) then
if (shifted = '1') then
Summe <= ("0000" & InBuffer(15)) +
("0000" & InBuffer(14)) +
...
("0000" & InBuffer(0));
int_done <= '1';
elsif (shifted = '0') then
int_done <= '0';
end if;
end if;
end process;
mw <= Summe(9 downto 4);
done <= int_Done;
end Behavioral;
Ich kann die seriell ankommenden Daten nicht sofort addieren, da ich
einen kontinuierlichen MW haben will. D. h. es soll erst der Puffer als
Shift-Reg. fungieren in den ein ständiger Datenstrom fließt. Immer wenn
ein 6-Bit-Wort eingelesen wird, fällt oben aus dem Puffer wieder ein
Wert raus. Der MW soll aus den 16 Pufferwerten ermittelt werden.
Ich kann euch leider nicht sagen was nicht funktioniert, ich weiß nur,
dass ich keinen MW zurückbekomme.
Ich hab einen seriellen Datenstrom vom I2C-Bus, möchte diese Daten dann
mitteln (Rauschminimierung) und anschließend wieder über den I2C-Bus
schicken.
Der Mittelwert-Filter soll als component in ein anderes file eingefügt
werden.
Der Ablauf soll wie folgt aussehen: Lesen vom Bus, MW-Bildung,
Schreiben auf den Bus
Hab dazu eine State-Machine realisiert: (Ausschnitt aus dem
Hauptprogramm)
...
signal state, nextstate : std_logic_vector(1 downto 0);
...
process: (clk, reset)
begin
if (reset = '1') then
state <= "00";
elsif (rising_edge(clk)) then
state <= nextstate;
end if;
end process;
process (state)
begin
nextstate <= state;
case state is
when "00" => -- I2C-Bus Initialisieren
...
when "01" => -- lesen vom I2C-Bus
...
when "10" => -- MW-Bildung
enable <= '1'; -- enable-signal für MW
if (done = '1') then -- wenn MW berechnet
enable <= '0';
berechneterMW <= MW; -- MW aus dem Modul
-- MW an eines internes
-- Signal des Hauptprogramms
-- zuweisen
nextstate <= "11";
end if;
when "11" => -- senden auf I2C-Bus
when others =>
nextstate <= "00";
end case;
end process;
Ich bin nun schon seit einigen Wochen dran und schaffe es einfach
nicht. Es ist zum verzweifeln.
Ich hoffe ihr könnt mir weiterhelfen.
Vielen Dank
Gruß
Andi