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.
