Forum: FPGA, VHDL & Co. mod Operation


von Basti M. (counterfeiter)


Lesenswert?

Hallo,

für ein Projekt brauche ich eine mod Operation die synthetisierbar ist. 
Als Rückmeldung wäre nur wichtig, ob die Division aufgegangen ist, oder 
nicht.
Im Netz habe ich einen Codeschnippsel eines Dividieres gefunden und 
versucht ihn auf Modulo umzubauen. Klappt leider nicht so gut, 
wahrscheinlich hab ich das noch nicht so recht verstanden :-/

Jedenfalls sieht die Funktion so aus:
1
function  modulo (divident : UNSIGNED; devisor : UNSIGNED) return STD_LOGIC is
2
    variable a1 : unsigned(divident'length-1 downto 0):=divident;
3
    variable b1 : unsigned(devisor'length-1 downto 0):=devisor;
4
    variable p1 : unsigned(devisor'length downto 0):= (others => '0');
5
    variable i : integer:=0;
6
7
    begin
8
    for i in 0 to devisor'length-1 loop
9
      p1(devisor'length-1 downto 1) := p1(devisor'length-2 downto 0);
10
      p1(0) := a1(divident'length-1);
11
      a1(divident'length-1 downto 1) := a1(divident'length-2 downto 0);
12
      p1 := p1-b1;
13
      if(p1(devisor'length-1) = '1') then
14
        a1(0) := '0';
15
        p1 := p1+b1;
16
      else
17
        a1(0) :='1';
18
      end if;
19
    end loop;
20
    if(p1>0) then
21
      return '0';
22
    else
23
      return '1';
24
    end if;

Das Ergebnis der Div. steht in a1 und nun dachte ich, steht der Rest in 
p1... das scheint aber nicht so zu sein :-/

Kann mir jemand da ein paar Tipps geben (bin ganz frisch in VHDL)??

Kann ich dann diese Funktion so in meinem Process aufrufen und gleich 
Prüfen?:

--außerhalb prozess
signal c_1 : unsigned(31 downto 0) := X"00000001";
signal c_2 : unsigned(31 downto 0) := X"00000002";


--innerhalb...
if  modulo(c_1,c_2) = '1' then

Schon mal danke für die Hilfe


Basti

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Du willst eine kombinatorische Division machen? Warum? Braucht du dad 
Ergebnis so schnell?

Das mit dem "im Prozess aufrufen" deutet auf einen Programmierer hin, 
der jetzt VHDL "programmieren" will/soll/muss. Richtig?

Dann lautet meine Frage: was ist dein eigentliches Problem? Wie lautet 
die Aufgabe im Original?

von Basti M. (counterfeiter)


Lesenswert?

Ja, ich brauch das so schnell wie möglich...

Wird ein Primzahltester... auf die übliche "doppelschleifen Methode". 
FPGA gegen 4 Kern PC.
Deine parallele Wurzel habe ich schon zum laufen gebracht... danke schon 
mal ;)

Möchte dann natürlich pro Takt so viele Mod Operationen wie aufs Si 
passen parallel ausführen, damit man gegen den PC auch ne Chance hat...

Grüße

Basti

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Basti M. schrieb:
> für ein Projekt brauche ich eine mod Operation die synthetisierbar ist.
Welche Plattform?

Es gibt ja Divider-Cores, die idR. nichts kosten.

Altera klatscht dir auf Wunsch einen kombinatorischen Divider hin.

Actel/Microsemi kanns auf jeden Fall auch:
Beitrag "Re: Rechnen mit unsigned vs. signed und einer division"

Mit dem richtigen Synthesizer klappts auf jeden Fall:
Beitrag "Re: Rechnen mit unsigned vs. signed und einer division"

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
Noch kein Account? Hier anmelden.