Ich habe einen Wert, der sich unregelmäßig ändert. Immer wenn dieser Wert sich ändert brauche ich auch (Wert/360). Mir fehlt im Augenblick eine vernünftige Idee. Ich bin für jeden Ratschlag dankbar.
Ich glaube, du solltest deine Frage besser Formulieren. Naja, vielleicht denke ich richtig: 1 Wert lesem 2 Wert speichern 3 wert lesen 4 wert mit gespeichertem vergleichen 5 ungleich? 6 ja==> wert/360 mit dem wert machen was du willst 7 goto 3 so ungefaehr
Wie wird in VHDL denn eine Division realisiert? Muss man dafür nicht gleich eine ALU implementieren?
Wenn die Division immer den gleichen Divisor hat dann ist es einfach: y = x* 1/Divisor. 1/Divisor kannst du vorab ausrechnen und die Multiplikation ist einfach.
hallo zusammen, ich will mich mit meiner frage zur division mal hier einreihen um nicht extra ein thread aufzumachen. also bei mir ist das problem, das ich einen wert im nenner stehen habe, welcher sich ändert (z.b. 100000/wert). deswegen habe ich folgenden code mir überlegt (hier ist wert noch als konstant angenommen um ein kostantes ergebnis zu bekommen) entity division is Port ( wert : out integer; clk1: in std_logic); -- clk1 etwa 1MHz, abgeleitet - --von den 50MHz des spartan3-boards end division; architecture Behavioral of division is signal zahl : integer := 6324; signal divcount :integer:= 0; signal divcount2 :integer:= 0; signal hilf: integer := 0; begin process (clk1, hilf, divcount) begin if clk1 = '1' and clk1'event then wert <= divcount2; hilf <= 0; divcount <= 0; end if; if (hilf + zahl) <= 1000000 then hilf <= hilf +zahl; divcount <= divcount +1; else divcount2 <= divcount; end if; end process; end Behavioral; mein problem ist aber nun, dass das ergebnis sehr nervös hin und her zappelt und nicht den eindruck macht, dass dieses gezappel irgendetwas mit dem ergebnis meiner division zutun hat. gebe ich einen festen wert als ausgabe zurück, dann zappelt meine anzeige auch nicht, somit sollte alles weiter korrekt sein. ich hoffe es ist nur ein dummer anfänger fehler... ich nehme auch gerne alternative divisions-codes entgegen, bei denen es zu konstanten ergebnissen kommt. besten dank euch allen henning
Hallo Henning Dein Code wird so nicht funktionieren. Durch Laufzeiteffekte wird deine Rechenschaltung nie zu einem stabilen Ergebnis kommen. So etwas kann höchstens in einer getakten Umgebung funktionieren. Wie viele Takte willst du auf das Ergebnis warten? Ansonsten musst du mal schauen, ob in deinem FPGA entsprechende Divisionszellen integriert sind. MfG Holger
gut... da sieht also jemand schon mein problem :-) dann suchen wir nun mal eine gemeinsamme lösung !? angenommen, ich würde den original takt des spartan3-boards nehmen, also die 50MHz, dann hätte ich ja theoretisch 50.000 takte zeit bis mein 1kHz takt wieder kommt. da noch nicht klar ist welches fpga später eingesetzt wird, würde ich gerne auf spezielle interne bausteine verzichten. gruß henning
Hallo Henning, ich habe Deinen Code mal überarbeitet. Ich übernehme aber keine Gewähr auf Kompilierbarkeit oder gar Synthesefähigkeit. Und für die Funktion bist Du selbst verantwortlich. OK, nachdem ich mich jetzt rechtlich abgesichert habe :-), sollte ich vielleicht noch erwähnen, dass ich aber durchaus für Rückfragen etc. zur Verfügung stehe. Schau's Dir halt mal an - hoffentlich hilft es Dir weiter! Gruß Ines entity division is Port ( Clk : in std_logic; Reset : in std_logic; Clk1 : in std_logic; -- clk1 etwa 1MHz Wert : out integer ); end division; architecture Behavioral of division is signal zahl : integer; signal divcount : integer; signal divcount2 : integer; signal hilf : integer; signal clk1_last : integer; begin process (Clk, Reset) begin if Reset = '0' then -- low aktive reset Wert <= 0; zahl <= 6324; divcount <= 0; divcount2 <= 0; hilf <= 0; clk1_last <= '0'; elsif Clk = '1' and Clk'event then -- Systemtakt clk1_last <= Clk1; if Clk1 = '1' and clk1_last = '0' then -- Divisionstakt Wert <= divcount2; hilf <= 0; divcount <= 0; end if; if (hilf + zahl) <= 1000000 then hilf <= hilf + zahl; divcount <= divcount + 1; else divcount2 <= divcount; end if; end if; end process; end Behavioral;
Seht Euch doch mal den Unsigned Divider auf Opencores an http://www.opencores.org/projects.cgi/web/serial_div_uu/overview Ist zwar Verilog aber die Experten (ich leider nicht) von Euch sollten da schon durchsteigen. Könnte zumindest ein Anhaltspunkt für eine eigene Lösung sein. Der wird sicherlich auch etwas schneller sein : Taktzyklen = Anzahl Bits des Quotienten + 1 Ich bin mal gespannt, weil das Thema mich auch interessiert.
supi... die lösung von ines funktioniert bis auf einen kleinen syntax-fehler ganz gut. ich hoffe, dass dieser gute eindruck auch beim einbinden in das komplette projekt weiter funktioniert. wäre es nun noch möglich mir in wenigen worten zu erklären warum meine variante aufgrund von laufzeiten nicht funktionieren konnte? liebe grüsse aus bremen henning
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.