Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.sci.electronics > #235018 > unrolled thread

VHDL-Frage zu for-loops

Started byMathias Weierganz <mathias.weierganz@htp-tel.de>
First post2017-11-07 15:06 +0100
Last post2017-11-08 14:43 +0100
Articles 8 — 3 participants

Back to article view | Back to de.sci.electronics


Contents

  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

#235018 — VHDL-Frage zu for-loops

FromMathias Weierganz <mathias.weierganz@htp-tel.de>
Date2017-11-07 15:06 +0100
SubjectVHDL-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]


#235019

FromNewdo <Newdo@ifmd.de>
Date2017-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]


#235020

FromMathias Weierganz <mathias.weierganz@htp-tel.de>
Date2017-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]


#235021

FromNewdo <Newdo@ifmd.de>
Date2017-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]


#235022

FromNewdo <Newdo@ifmd.de>
Date2017-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]


#235023

FromNewdo <Newdo@ifmd.de>
Date2017-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]


#235040

FromGerhard Hoffmann <gerhard@hoffmann-hochfrequenz.de>
Date2017-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]


#235049

FromMathias Weierganz <mathias.weierganz@htp-tel.de>
Date2017-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