www.mikrocontroller.net

Forum: FPGA, VHDL & Co. FIFO Addition Problem


Autor: Sabine Mühller (zizo)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sabine Mühller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!!!!!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies noch mal, was ich geschrieben habe.

lg
m

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sabine Mühller (zizo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
    sum2 <= unsigned("00"&r1) + unsigned("00"&r2) + unsigned("00"&r3) + unsigned("00"&r4);

Autor: Sabine Mühller (zizo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
schreiben : process(sw0,c0,wrfull)  ----
begin
  if(c0'event and c0='0' and sw0='1' and wrfull='0') then -- synchron gesetzt mit Enable
        wr<='1';
        dat1<=dat1+1 ;
        dat<=dat1;
  end if;

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

Das könnte man funktionsgleich auch so schreiben:
schreiben : process(sw0,c0,wrfull)  ----
begin
  if(sw0='0' or wrfull='1')then        -- asynchroner kombinatorischer Reset !!!!!!
      wr<='0';
      dat<="000";
  elsif (c0'event and c0='0') then    -- synchron
     if (sw0='1' and wrfull='0') then -- Enable
        wr<='1';
        dat1<=dat1+1 ;
        dat<=dat1;
     end if;
  end if;
end process schreiben;

Und dir ist klar, dass asynchrone kombinatorische Resets extrem unsauber 
sind? Stichwort dazu: Glitches.

Autor: Sabine Mühller (zizo)
Datum:

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

Autor: Kopfschüttler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich habe gerade probiert,

Manchmal geht Studieren doch über Probieren!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.