Problem bei VHDL-Klausur

Gast #388285
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
Gast #388290
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; ".
Gast #388295
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;
Gast #388296
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
Angehängte Dateien:
Gast #388297
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.
Gast #388298
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren