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
Beschreib doch mal was dein if-statement machen soll und dann überprüfe was es wirklich macht. Gruß Alban
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
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ß
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; ".
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.
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
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; |
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
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.