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