FIFO Addition Problem

OP #1824202
Lesenswert?
• ▲
▼
hi,
ich versuche seit Tage ein Simulation-Programm von ADC zu schreiben.
ich verwende Quartus 2 von Altera.
ich schreibe in FIFO 4 Zahlen, dann lese ich die. das klappt ganz gut. 
Das schreiben und lesen geschieht ständig.
jetzt möchte ich von je 4 gelesene Werte die Summe berechenen. d.h. ich 
schreibe 4 Werte dann Lese ich die dann speichere ich die in zwischen 
Register dann berechne ich die Summe...
Das Problem ist in der Simulation bei der Summenberechnung, ich  bekomme 
komische Werte.
ich muss die FolgenWerte bekommen:
6 22 6 22...
aber ich bekomme nur
24
bitte, kann mir jemand helfen?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use IEEE.numeric_std.all;
--Block deklaration-----

entity fifotest1 is
  port
  (
    c0 : in std_logic;
    c1 : in std_logic;
    dat : out std_logic_vector (2 downto 0) ;
    wr : out std_logic;
    rr : out std_logic;
    wrfull: in std_logic;
    rdempty: in std_logic;
    datout: in std_logic_vector (2 downto 0);
    sw1 : in std_logic;
    sw0 : in std_logic;
    adcsum :out std_logic_vector(4 downto 0):="00000";
    LED1 : inout std_logic_vector (2 downto 0):="000"
    );


end fifotest1;

----Verhalten

architecture ppl_type of fifotest1 is


---Lokale Variable---Signal

signal dat1 :std_logic_vector(2 downto 0):="000";


signal sum2 :std_logic_vector(4 downto 0):="00000";
signal r1:std_logic_vector(2 downto 0):="000";
signal r2:std_logic_vector(2 downto 0):="000";
signal r3:std_logic_vector(2 downto 0):="000";
signal r4:std_logic_vector(2 downto 0):="000";

begin

schreiben : process(sw0,c0,wrfull)  ----

begin

  if(c0'event and c0='0' and sw0='1' and wrfull='0') then

        wr<='1';
        dat1<=dat1+1 ;
        dat<=dat1;
  end if;

  if(sw0='0'or wrfull='1')then

      wr<='0';

      dat<="000";

  end if;
end process schreiben;

lesen : process(sw1,c1,rdempty)  ----

begin
  if(c1'event and c1='0'and sw1='1' and rdempty='0') then

        rr<='1';

        LED1<=datout;

  end if;

  if(sw1='0'or rdempty='1')then

      rr<='0';

      LED1<=(others=>'0');

  end if;
end process lesen;

summation :process(c1)
variable count : integer range 0 to 3;
begin
  if(c1'event and c1='1')then
    r1<=LED1;
    r2<=r1;
    r3<=r2;
    r4<=r3;


  if (count=3)then
    sum2<=unsigned(r1)+ unsigned(r2)+ unsigned(r3)+ unsigned(r4)&"00";
    adcsum<= Std_Logic_Vector(sum2);

  end if;
  count:=count+1;
  end if;

end process summation;

end ppl_type;
Moderator (Firma: Titel) Persönliche Seite #1825343
Lesenswert?
• ▲
▼
Sabine Mühller schrieb:
> Error (10344): VHDL expression error at Vhdl1.vhd(98): expression has 3
> elements, but must have 5 elements
Und wie wäre es dann, jeweils erst mal führende Nullen anzuhängen? 
Blöd ist übrigens auch, dass + sowie & die selbe Priorität haben. 
Klammern schaden hier also keinesfalls...
1
    sum2 <= unsigned("00"&r1) + unsigned("00"&r2) + unsigned("00"&r3) + unsigned("00"&r4);
Moderator (Firma: Titel) Persönliche Seite #1825429
Lesenswert?
• ▲
▼
Sabine Mühller schrieb:
> warum hat wr leichte Verzögerung?
Ich vermute, du machst eine Timing-Simulation. Dann kommen da 
irgendwelche internen Gatterlaufzeiten rein...

Du weißt schon, was du damit beschreibst:
1
schreiben : process(sw0,c0,wrfull)  ----
2
begin
3
  if(c0'event and c0='0' and sw0='1' and wrfull='0') then -- synchron gesetzt mit Enable
4
        wr<='1';
5
        dat1<=dat1+1 ;
6
        dat<=dat1;
7
  end if;
8

9
  if(sw0='0' or wrfull='1')then  -- asynchroner kombinatorischer Reset !!!!!!
10
      wr<='0';
11
      dat<="000";
12
  end if;
13
end process schreiben;

Das könnte man funktionsgleich auch so schreiben:
1
schreiben : process(sw0,c0,wrfull)  ----
2
begin
3
  if(sw0='0' or wrfull='1')then        -- asynchroner kombinatorischer Reset !!!!!!
4
      wr<='0';
5
      dat<="000";
6
  elsif (c0'event and c0='0') then    -- synchron
7
     if (sw0='1' and wrfull='0') then -- Enable
8
        wr<='1';
9
        dat1<=dat1+1 ;
10
        dat<=dat1;
11
     end if;
12
  end if;
13
end process schreiben;

Und dir ist klar, dass asynchrone kombinatorische Resets extrem unsauber 
sind? Stichwort dazu: Glitches.
Moderator (Firma: Titel) Persönliche Seite #1825607
Lesenswert?
• ▲
▼
Lothar Miller schrieb:
> Sabine Mühller schrieb:
>> warum hat wr leichte Verzögerung?
> Ich vermute, du machst eine Timing-Simulation.
Also: ist das eine Timing-Simulation oder eine Verhaltenssimulation?

Sabine Mühller schrieb:
> Danke für dein Antwort,
> ich habe gerade probiert, aber leider es hat nicht gebracht!
Ist schon klar, denn ich schrieb ja auch:
>> Das könnte man funktionsgleich auch so schreiben:...
Wenn es funktionsgleich ist, dann darf sich auch nichts ändern!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren