Forum: FPGA, VHDL & Co. Problem bei VHDL-Klausur


von cpld (Gast)


Lesenswert?

Hallo,

habe seit diesem Semester VHDL, jetzt hab ich mir mal ne alte Klausur
(http://www.8ung.at/gerschi/studikram/Prog_Bausteine/ws2002_2003.pdf)
von unserem Prof angeschaut und da kam mir dass kalte Grausen weil ich
nicht weiß wie ich seine Aufgaben lösen soll.

Es fängt schon bei der 1. Aufg an:

entity Quersumme is
generic (n: integer := 16);
port (y: in Bit_vector(n-1 downto 0);
z: out integer range 0 to n
);
end Quersumme;

architecture Behavior1 of Quersumme is
subtype BitCount is integer range 0 to n;
begin
QS:process(y)
variable Tmp : BitCount := 0;
begin
for i in 0 to n-1 loop
if y(i) = '1' then
Tmp := Tmp + 1;
next;
end if;
end loop;
z <= Tmp;
end process;
end behavior1;

Dass Problem liegt glaub ich bei der If-Schleife, dir wird zu oft
durchlaufen.

Falls jemand ne Lösung und ein Programm für VHDL-Dummies weiß wäre ich
dankbar wenn er was posted.


Danke

von Alban (Gast)


Lesenswert?

Beschreib doch mal was dein if-statement machen soll und dann überprüfe
was es wirklich macht.

Gruß

Alban

von cpld (Gast)


Lesenswert?

also wenns ne 1 ist wird temp erhöht

von Klaus F. (kfalser)


Lesenswert?

Wieso besorgst Du Dir nicht einen VHDL-Simulator und versuchst das
Programm/die Programme zu debuggen?
Ansonsten glaube ich, daß Du Tmp nicht an die Variable z zuweisen
kannst, weil es verschiedene Typen sind. Lass den SubType weg und
verwende nur integer range 0 to n.

Klaus

von cpld (Gast)


Lesenswert?

der subtype ist halt laut Aufgabenstellung erwünscht, debuggen würde ich
gern wenn ich n gescheites Tool hätte, mit Xilinx ist dass ein ganz
schöner scheiß

von Egal (Gast)


Lesenswert?

Dein Tmp wird nie auf 0 zurückgesetzt.
D.h. bei jeder Änderung von y wird dem alten Tmp-Wert die Anzahl Einsen
nochmals dazuaddiert. (Innerhalb vom definierten range)

Schreibe mal nach der Zeile "Z <= Tmp;"
noch ein " Tmp := 0; ".

von Klaus F. (kfalser)


Lesenswert?

Für die Synthese ist es wahrscheinlich noch besser das Null-Setzen vor
der for-Schleife zu machen.
Könnte sein daß der Compiler nicht intelligent genug um zu merken daß
Tmp immer 0 ist, wenn der Prozess startet.

von Thomas (Gast)


Lesenswert?

Modelsim??!

von cpld (Gast)


Lesenswert?

Also komm bei der Klausur auf keinen grünen Zweig, bin jetzt schon den
ganzen Mittag dran und blicks keinen Meter, wenn ich dann mal was
simulieren will, bekomm ich nur Fehlermeldungen

von FPGAküchle (Gast)


Lesenswert?

schick uns mal die fehlermeldung

von FPGAküchle (Gast)


Lesenswert?

HM, ich bin mir nicht sicher, ob bei jedem aufruf des Processes tmp auch
den Initwert 0 bekommt. Besser du verzchtest auf den initwert bei der
deklaration und setzt tmp vor der schleife immer auf '0'. Next
innerhalb eines If ... end if hab ich auch noch nie ausprobiert,
scheint mir irgenwie "unkosher".


Also folgend siehts IMHO besser aus:
1
entity Quersumme is
2
generic (n: integer := 16);
3
port (
4
 y: in Bit_vector(n-1 downto 0);
5
 z: out integer range 0 to n);
6
end entity Quersumme;
7
8
architecture Behavior1 of Quersumme is
9
  subtype BitCount is integer range 0 to n;
10
11
begin
12
 QS:process(y)
13
   variable Tmp : BitCount;
14
   begin
15
   tmp := 0;
16
   for i in 0 to n-1 loop
17
    if y(i) = '1' then
18
     Tmp := Tmp + 1;
19
    end if;
20
   end loop;
21
  z <= Tmp;
22
 end process QS;
23
end architecture behavior1;

von cpld (Gast)


Angehängte Dateien:

Lesenswert?

also mit Code von FPGAKüchle unter XILINX:


======================================================================== 
=
WARNING:Xst:1989 - Unit <Quersumme>: instances
<Madd__n0017_Mxor_Result<2>>, <Madd__n0017_Mxor_Result<3>> of unit
<LPM_XOR2_1> are equivalent, second instance is removed
WARNING:Xst:1989 - Unit <Quersumme>: instances
<Madd__n0017_Mxor_Result<2>>, <Madd__n0017_Mxor_Result<4>> of unit
<LPM_XOR2_1> are equivalent, second instance is removed

Optimizing unit <Quersumme> ...

Process "Synthesize" completed successfully

Started : "Translate".
WARNING:ProjectMgmt -
"D:/Programme/VHDL-Test/Quersumme/Quersumme.ngr" line 0 duplicate
design unit: 'Module|Quersumme'

Command Line: ngdbuild -intstyle ise -dd _ngo -i -p xc9500
Quersumme.ngc
Quersumme.ngd

von FPGAküchle (Gast)


Lesenswert?

Hm, seh ich erst mal kein problem, oder drückt mir den sandmann schon
auf die Augen?.

Scheint aber achlecht zu optimieren, sollte man wohl per hand die
halbadder setzten und Kaskadieren. Aber das vielleicht aufgabe 10.

von cpld (Gast)


Lesenswert?

@FPGAküchle

ja die blöden Fehlermeldungen wenns dann trotzdem läuft verwirren einen
Anfänger total.

Ich hab hauptsächlich bei for-Schleifen, wie wandle ich z. B. eine
integer Zahl in nen Vektor um etc.

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.