Hallo allerseits Hat jemand eine Idee, wie ich folgenden Wurzelalgorithmus in VHDL übersetzen kann bzw. wie der "Data Path" hierzu aussehen sollte? Die Aufgabe war, sowohl den Datenpfad wie auch die Finite State Machine jeweils in einem vhd-File zu erstellen. Hier der Code: public static int sqrt (int num) { int op = num; int res = 0; int one = 1 << 6; while (one > op) { one >>=2; while (one != 0) { if (of >= res + one) { op -= res + one; res += 2 * one; } res >>= 1; one >>= 2; } return res; }
ModelSim kann glaube ich Wurzel, aber um einen Code zu bekommen, must Du den Wizzard bemühen und einen Divider instanziieren. Bei Altera heisst der LPM_DIVIDE.
Adrian Wüthrich wrote: > Hallo allerseits > > Hat jemand eine Idee, wie ich folgenden Wurzelalgorithmus in VHDL > übersetzen kann bzw. wie der "Data Path" hierzu aussehen sollte? Die > Aufgabe war, sowohl den Datenpfad wie auch die Finite State Machine > jeweils in einem vhd-File zu erstellen. > > Hier der Code: Da scheint eine geschweifte Klammer (für eines der while()) zu fehlen. Ich bin mal davon ausgegangen das die zweite while()-Schleife innerhalb der ersten ist: > public static int sqrt (int num) { > int op = num; > int res = 0; > int one = 1 << 6; > > while (one > op) { <DP> > one >>=2; </DP> > > while (one != 0) { > if (of >= res + one) { > op -= res + one; <DP> > res += 2 * one; </DP> > } <DP> > res >>= 1; > one >>= 2; </DP> > } > return res; > } Was ich mit <DP> </DP> gekennzeichnet habe würde ich in den Data Path stecken und alles andere in den Controller.
@lupo: Wer lesen kann, ist klar im Vorteil. > ModelSim kann glaube ich Wurzel, aber um einen Code zu bekommen, must Du > den Wizzard bemühen und einen Divider instanziieren. Bei Altera heisst > der LPM_DIVIDE. Wo bitteschön wird in seinem Code wird ein Dividierer benötigt. state_init: >> int op = num; >> int res = 0; >> int one = 1 << 6; state_shift: >> while (one > op) { >> one >>=2; state_check_ready: >> while (one != 0) { ... >> res >>= 1; >> one >>= 2; >> } state_calc: >> op -= res + one; >> res += 2 * one; Die Bedingungen zum Wechseln der Zustände darfst Du Dir selbst ausdenken. Rick
Also zunächst, im Code fehlt eine geschweifte Klammer, ein
Variablenname war falsch, neuer Code:
public static int sqrt (int num) {
int op = num;
int res = 0;
int one = 1 << 6;
while (one > op) {
one >>=2;
} // << missing braket !!!!!!!!!!!!
while (one != 0) {
if (op >= res + one) { // op instead of !!!!!!!!!!!
op -= res + one;
res += 2 * one;
}
res >>= 1;
one >>= 2;
}
return res;
}
Dann zum Datapath:
==================
Läst sich schrittweise aus deinem Code extrahieren, du brauchtst mind.
3 Register, ich benutze im Folgenden aber 5, ein signed "tmpval" und
ein std_signal "tmpbool":
Dummy:
Operation NOP: (dummy operation)
op <=op
res <= res
one <= one
Start:
Operation 0a:
op <= num
res <= 0
one <= 1 << 6 (= 64 !!)
While1:
Operation 1a:
tmpbool <= '1' when one > op else '0';
Operation 1b: (falls tmpbool = '1')
one <= one(maxbit downto 2)
While2:
Operation 2a:
tmpbool <= '1' when one > 0 else '0'
Operation 2b:
tmpval <= res + one
Operation 2c:
tmpbool <= '1' when op > tmpval else '0';
Operation 2d: (falls tmpbool = '1')
op <= op - res - one
res <= res + (one & 0)
Operation 2e: (falls tmpbool = '1')
res <= "0" & res(maxbit downto 1)
res <= "00" & one(maxbit downto 2)
End:
Fehlt nur noch der Multiplexer (Abb. Code => Operation), ist aber
ganz einfach in VHDL..
Zum ControlPath: (TransitionTable inkl Statements)
================
S0a: S1a,Operation0a
S1a: if tmpbool='0' => S2a, OperationNOP
if tmpbool='1' => S1b, Operation1a
S1b: S2a,Operation1b
S2a: S3b,Operation2a
S2b: if tmpbool='0' => S3a, OperationNOP
if tmpbool='1' => S2c, Operation1b
S2c: S3b,Operation2b
S2c: if tmpbool='0' => S3c, OperationNOP
if tmpbool='1' => S3c, Operation2c
S2d: S2a,Operation7
S3a: ende...
State-Logik in VHDL zu schreiben, dürfte dann ja kein Problem mehr
sein..
DataPath als auch ControlPath (StateMachine) sind so ziemlich 1:1
umgesetzt. Hoffe mal, habe keinen Fehler gemacht. Falls doch, dürfte
eine Korrektur kein Problem machen.
Gruss
Jörg
>> ModelSim kann glaube ich Wurzel, aber um einen Code zu bekommen, must Du >> den Wizzard bemühen und einen Divider instanziieren. Bei Altera heisst >> der LPM_DIVIDE. >Wo bitteschön wird in seinem Code wird ein Dividierer benötigt. Ja,,ja bin gestört worden - aber das Gesagte gilt analog! -> kleine gedankliche Transferleistung Deinerseits erforderlich.
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.