Forum: FPGA, VHDL & Co. FIFO Addition Problem


von Sabine M. (zizo)


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;

von Matthias (Gast)


Lesenswert?

Naja, du zählst da drei Bit breite Register zusammen und hängst dann 
zwei Nullen an. Ich denke dein Problem ist ein Überlauf bei dieser 
Berechnung.

lg
Matthias

von Sabine Mühller (Gast)


Lesenswert?

nein,
das Lesen und Schreiben klappt wunderbar, wenn ich nur ein Wert 
(r1,r2,r3 oder r4)lese ist Richtig. Es ist nur, wenn ich r1+r2+r3+r4 
berechne kommt komische Wert raus!!!!!!!!

von Matthias (Gast)


Lesenswert?

Lies noch mal, was ich geschrieben habe.

lg
m

von D. I. (Gast)


Lesenswert?

Sabine Mühller schrieb:
> nein,
> das Lesen und Schreiben klappt wunderbar, wenn ich nur ein Wert
> (r1,r2,r3 oder r4)lese ist Richtig. Es ist nur, wenn ich r1+r2+r3+r4
> berechne kommt komische Wert raus!!!!!!!!

Schreib dich nicht ab, lern lesen und schreiben.

von Sabine M. (zizo)


Lesenswert?

danke,
ich habe sum2 mit 5 Bit Breite aber r1 , r2, r3 und r4 jeweils mit 3 Bit 
Breite.
der Compiler zeigt Fehler,

Error (10344): VHDL expression error at Vhdl1.vhd(98): expression has 3 
elements, but must have 5 elements

wie kann ich das machen??

Sabine

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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);

von Sabine M. (zizo)


Angehängte Dateien:

Lesenswert?

danke es funktioniert,
noch eine Frage :
if(c0'event and c0='0' and sw0='1' and wrfull='0') then

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

warum hat wr leichte Verzögerung?
danke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Sabine M. (zizo)


Lesenswert?

Danke für dein Antwort,
ich habe gerade probiert, aber leider es hat nicht gebracht!

von Kopfschüttler (Gast)


Lesenswert?

>ich habe gerade probiert,

Manchmal geht Studieren doch über Probieren!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.