www.mikrocontroller.net

Forum: FPGA, VHDL & Co. (vhdl) mod 12 rechnen


Autor: flix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich möchte in vhdl mod 12 rechnen,
das funktioniert auch wunderbar bei der simulation. Bei der Sythese dagt 
Xilinx ISE dann, dass nur 2^x modulo gerechnet werden kann.

signal addr : std_logic vector(5 downto 0);

name:process (..)
variable test :integer;

begin 
..
..
..
   test := CONV_INTEGER(addr) mod 12;


funktioniert so für die siumlation, aber nicht synthese.

Hab es versucht so umzustellen :
test := CONV_INTEGER(addr)
if test = 12 then 
  test := 0;
else 
 test := test;
end if;

tut aber nicht mehr das was es soll ? ... , hab auch noch andere 
Varianten davon probiert zb
if addr = "01100" then 
test := 0;
else 
 test := test;
end if;

  danke für tipps
  flix

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ flix

>ich möchte in vhdl mod 12 rechnen,
>das funktioniert auch wunderbar bei der simulation. Bei der Sythese dagt
>Xilinx ISE dann, dass nur 2^x modulo gerechnet werden kann.

Ja, das kann XST nicht synthetisieren.

Man kann das über eine Wertetabelle lösen, die man ggf. clever per 
loop/if oder so zusammenbastelt.

Mfg
Falk

Autor: flix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber warum gehen meine zwei vorschläge nicht ? ... weis jemand rat ?
  danke
  flix

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine 2 Varianten machen doch keine modulo Operation!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War es ein flüchtigkeitsfehler, oder soll es wirklich
test := test;
heißen? Ansonsten würde ich ein
test := test + 1;
vorschlagen.

Autor: KlausK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die unteren beiden Bits kann man direkt nehmen, dann bleiben nur noch 16 
Fälle, für die man modulo 3 rechnen muss:

case addr(5 downto 2) is
  when "0000" => test := "00" & adr(1 downto 0);
  when "0001" => test := "01" & adr(1 downto 0);
  when "0010" => test := "10" & adr(1 downto 0);
  when "0011" => test := "00" & adr(1 downto 0);
  when "0100" => test := "01" & adr(1 downto 0);
  when "0101" => test := "10" & adr(1 downto 0);
  when "0110" => test := "00" & adr(1 downto 0);
  when "0111" => test := "01" & adr(1 downto 0);
  when "1000" => test := "10" & adr(1 downto 0);
  when "1001" => test := "00" & adr(1 downto 0);
  when "1010" => test := "01" & adr(1 downto 0);
  when "1011" => test := "10" & adr(1 downto 0);
  when "1100" => test := "00" & adr(1 downto 0);
  when "1101" => test := "01" & adr(1 downto 0);
  when "1110" => test := "10" & adr(1 downto 0);
  when "1111" => test := "00" & adr(1 downto 0);
end case;

Geht das auch kürzer zu schreiben? (fragt ein Neuling)

Klaus

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht nicht kürzer, aber universeller.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity mod_12 is
    Port ( data_in : in std_logic_vector(5 downto 0);
           mod_out : out std_logic_vector(3 downto 0));
end mod_12;

architecture Behavioral of mod_12 is

TYPE type_MOD_12_TABLE IS ARRAY (natural RANGE <>) OF integer range 0 to 63;

CONSTANT MOD_12_TABLE  : type_MOD_12_TABLE(0 TO 63) :=
      ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
        0, 1, 2, 3); 

signal tmp: integer range 0 to 63;

begin

   tmp     <= conv_INTEGER(data_in);
   mod_out <= conv_std_logic_vector(MOD_12_TABLE(tmp),6);

end Behavioral;


MFG
Falk

Autor: Ingmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei großen Vektorbreiten ist das aber schon eine nicht unerhebliche 
verschwendung. Ginge denn die Standardoperation (Modulo = Ausgangswert - 
Teiler x Ganzzahl (Ausgangswert / Teiler) nicht?

Man könnte es zumindest zweistufig lösen über Teiler 4 und Restklasse 3.

Autor: KlausK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk: Danke für die Anregung, ich hoffe, dass ich es richtig 
modifiziert habe (wieder kürzer, aber nicht mehr universell).

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity mod_12 is
    Port ( data_in : in std_logic_vector(5 downto 0);
           mod_out : out std_logic_vector(3 downto 0));
end mod_12;

architecture Behavioral of mod_12 is

TYPE type_MOD_3_TABLE IS ARRAY (natural RANGE <>) OF integer range 0 to 
15;

CONSTANT MOD_3_TABLE  : type_MOD_3_TABLE(0 TO 15) :=
      ( 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0);

signal tmp: integer range 0 to 15;

begin

   tmp     <= conv_INTEGER(data_in(5 downto 2));
   mod_out <= conv_std_logic_vector(MOD_3_TABLE(tmp),4) & data_in(1 
downto 0);

end Behavioral;

Entstehen jetzt Probleme durch die unterschiedliche Behandlung der Bits 
5 bis 2 und 1 bis 0 hinsichtlich Laufzeit?

Klaus

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ KlausK

>@Falk: Danke für die Anregung, ich hoffe, dass ich es richtig
>modifiziert habe (wieder kürzer, aber nicht mehr universell).

Sieht gut aus.

>Entstehen jetzt Probleme durch die unterschiedliche Behandlung der Bits
>5 bis 2 und 1 bis 0 hinsichtlich Laufzeit?

Nein, wieso? Das is alles rein kombinatorisch. Das läuft locker mit 200 
MHz++.

MfG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.