Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.sci.electronics > #235018 > unrolled thread
| Started by | Mathias Weierganz <mathias.weierganz@htp-tel.de> |
|---|---|
| First post | 2017-11-07 15:06 +0100 |
| Last post | 2017-11-08 14:43 +0100 |
| Articles | 8 — 3 participants |
Back to article view | Back to de.sci.electronics
VHDL-Frage zu for-loops Mathias Weierganz <mathias.weierganz@htp-tel.de> - 2017-11-07 15:06 +0100
Re: VHDL-Frage zu for-loops Newdo <Newdo@ifmd.de> - 2017-11-07 15:29 +0100
Re: VHDL-Frage zu for-loops Mathias Weierganz <mathias.weierganz@htp-tel.de> - 2017-11-07 15:44 +0100
Re: VHDL-Frage zu for-loops Newdo <Newdo@ifmd.de> - 2017-11-07 15:48 +0100
Re: VHDL-Frage zu for-loops Newdo <Newdo@ifmd.de> - 2017-11-07 15:52 +0100
Re: VHDL-Frage zu for-loops Newdo <Newdo@ifmd.de> - 2017-11-07 15:54 +0100
Re: VHDL-Frage zu for-loops Gerhard Hoffmann <gerhard@hoffmann-hochfrequenz.de> - 2017-11-08 08:45 +0100
Re: VHDL-Frage zu for-loops Mathias Weierganz <mathias.weierganz@htp-tel.de> - 2017-11-08 14:43 +0100
| From | Mathias Weierganz <mathias.weierganz@htp-tel.de> |
|---|---|
| Date | 2017-11-07 15:06 +0100 |
| Subject | VHDL-Frage zu for-loops |
| Message-ID | <otsel0$uj5$1@news.albasani.net> |
Kann ich folgendes Konstrukt allgemein mit Hilfe einer for...loop
formulieren? Oder wie macht man das elegant, ohne dass ich jede
Zeile händisch erzeuge?
process(clkfx)
begin
if rising_edge(clkfx) then
case bcd1bcd0 is
when x"01" => divider <= conv_std_logic_vector (9999, 14);
when x"02" => divider <= conv_std_logic_vector (4999, 14);
when x"03" => divider <= conv_std_logic_vector (3332, 14);
... usw. bis x"99"
when x"99" => divider <= conv_std_logic_vector (99, 14);
Mir gelingt es nicht.
Mathias.
[toc] | [next] | [standalone]
| From | Newdo <Newdo@ifmd.de> |
|---|---|
| Date | 2017-11-07 15:29 +0100 |
| Message-ID | <otsg0j$rnn$1@news.albasani.net> |
| In reply to | #235018 |
Am 07.11.2017 um 15:06 schrieb Mathias Weierganz: > Kann ich folgendes Konstrukt allgemein mit Hilfe einer for...loop > formulieren? Oder wie macht man das elegant, ohne dass ich jede > Zeile händisch erzeuge? Mit einer lookup tabelle: https://cryptocode.wordpress.com/tag/lookup-table/ Irgendwann muss schon jemand die Konstanten eintippen... Hope it helps - Udo
[toc] | [prev] | [next] | [standalone]
| From | Mathias Weierganz <mathias.weierganz@htp-tel.de> |
|---|---|
| Date | 2017-11-07 15:44 +0100 |
| Message-ID | <otsgsi$oav$1@news.albasani.net> |
| In reply to | #235019 |
Am 07.11.2017 um 15:29 schrieb Newdo: > > Irgendwann muss schon jemand die Konstanten eintippen... > Der Witz ist ja, dass ich eine Rechenvorschrift für die Bildung des Dividers formulieren kann (10000/x - 1, wobei x von 1 bis 99 läuft). Da der Wert 10000 von der Taktfrequenz abhängt, möchte ich das gerne allgemeingültig (und kurz) programmieren.
[toc] | [prev] | [next] | [standalone]
| From | Newdo <Newdo@ifmd.de> |
|---|---|
| Date | 2017-11-07 15:48 +0100 |
| Message-ID | <otsh4s$okv$1@news.albasani.net> |
| In reply to | #235020 |
Am 07.11.2017 um 15:44 schrieb Mathias Weierganz: > Der Witz ist ja, dass ich eine Rechenvorschrift für die Bildung des > Dividers formulieren kann (10000/x - 1, wobei x von 1 bis 99 läuft). Verstehe. Der Witz ist übrigens auch, dass auch nicht unbedingt aus der Frage hervorging , dass es eine Formel gibt... Mal sehen... - Udo
[toc] | [prev] | [next] | [standalone]
| From | Newdo <Newdo@ifmd.de> |
|---|---|
| Date | 2017-11-07 15:52 +0100 |
| Message-ID | <otshaj$okv$2@news.albasani.net> |
| In reply to | #235020 |
Am 07.11.2017 um 15:44 schrieb Mathias Weierganz: > Da der Wert 10000 von der Taktfrequenz abhängt, möchte ich das gerne > allgemeingültig (und kurz) programmieren. Ich denke, so etwas sollte gehen: http://www.ics.uci.edu/~jmoorkan/vhdlref/for_loop.html Gruss Udo
[toc] | [prev] | [next] | [standalone]
| From | Newdo <Newdo@ifmd.de> |
|---|---|
| Date | 2017-11-07 15:54 +0100 |
| Message-ID | <otshei$okv$3@news.albasani.net> |
| In reply to | #235022 |
Mit divider = ComputeDivider(bcd1bcd0) als Inhalt der for-Schleife
[toc] | [prev] | [next] | [standalone]
| From | Gerhard Hoffmann <gerhard@hoffmann-hochfrequenz.de> |
|---|---|
| Date | 2017-11-08 08:45 +0100 |
| Message-ID | <f6fr0uFjl7gU1@mid.individual.net> |
| In reply to | #235020 |
Am 07.11.2017 um 15:44 schrieb Mathias Weierganz: > Am 07.11.2017 um 15:29 schrieb Newdo: >> >> Irgendwann muss schon jemand die Konstanten eintippen... >> > > Der Witz ist ja, dass ich eine Rechenvorschrift für die Bildung des > Dividers formulieren kann (10000/x - 1, wobei x von 1 bis 99 läuft). > Da der Wert 10000 von der Taktfrequenz abhängt, möchte ich das gerne > allgemeingültig (und kurz) programmieren. für große Werte von 10000... Mal eben kurz geht in VHDL erstmal garnix. :-( Ich habe auf opencores.org eine sinus/cosinus-Funktion abgelegt. Die enthält Tabellen, die zur Compilierzeit vom Compiler berechnet werden. Die Resultate werden dann in ROMs verpackt. Zur Compilierzeit steht einem noch alles zur Verfügung, was der Compiler an den PC durchreichen kann, also sin, cos, tan, log, dividieren, files lesen und so weiter. Das meiste an den Quellen, wie die Erweiterung von 90 auf 360 Grad, das automatisierte Pipelining oder das Erzeugen von sin & cos gleichzeitig aus einer einzigen Tabelle für einen komplexen Mischer wirst du einfach streichen können. Was dich interessiert ist nur die Deklaration der Tabelle und die Funktion initialisiere_tabelle() oder so. < https://opencores.org/project,sincos > Wenn sich die 10000 noch ändern können wenn das FPGA schon "fertig ist" wirst du im Chip einen Dividierer brauchen. Für begrenzte Genauigkeit kannst du den auch als ROM erschlagen oder du musst halt mehrere Tabellen vorausberechnen. Gruß, Gerhard Variables won't, and constants aren't.
[toc] | [prev] | [next] | [standalone]
| From | Mathias Weierganz <mathias.weierganz@htp-tel.de> |
|---|---|
| Date | 2017-11-08 14:43 +0100 |
| Message-ID | <otv1me$l1$1@news.albasani.net> |
| In reply to | #235018 |
Meine Lösung habe ich jetzt mit einer lookup-Table gemacht.
type t_div_tab is array(153 downto 0) of std_logic_vector(15 downto 0);
signal div_tab : t_div_tab ;
...
-- Die relevanten Speicherstellen werden gefüllt:
div_tab_gen1: for nn in 0 to 9 generate
div_tab_gen2: for n in 0 to 9 generate
div_tab(nn * 16 + n) <= conv_std_logic_vector(16667/(nn*10 + n) -
1, 16) when nn + n /= 0 else conv_std_logic_vector(1, 16);
end generate;
end generate;
-- hier werden die nicht genutzten Speicherstellen mit x"0001" gefüllt,
-- damit es keine Warnungen gibt:
div_tab_gen3: for nn in 0 to 8 generate
div_tab_gen4: for n in 10 to 15 generate
div_tab(nn * 16 + n) <= conv_std_logic_vector(1, 16);
end generate;
end generate;
[toc] | [prev] | [standalone]
Back to top | Article view | de.sci.electronics
csiph-web