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;
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
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!!!!!!!!
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.
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
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); |
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
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.
Danke für dein Antwort, ich habe gerade probiert, aber leider es hat nicht gebracht!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.