dezimal und kommazahl dividieren

Moderator (Firma: Titel) Persönliche Seite #3282017
Lesenswert?

Jois schrieb:
> konnte mir jemand bitte sagen, wie kann ich das Ergebnis in kommazalh
> kriegen?
Ich hätte da noch eine oder zwei Fragen:
Wie genau soll denn diese Kommazahl sein?
Was willst du damit machen?
Wieviele Nachkommastellen brauchst du?
Woher kommen die beiden zu teilenden Zahlen?
Wie schnell muss die Berechnung sein?
#3286838
Lesenswert?

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5

6

7
entity Dividierer is
8
 Port ( CLK          : in    std_logic;
9
        RESET        : in    std_logic;
10
        START        : in    std_logic;
11
        READY        : out   std_logic;
12
        Dividend     : in    std_logic_vector;
13
        Divisor      : in    std_logic_vector;
14
        Quotient     : out   std_logic_vector
15
      );
16
end Dividierer;
17

18
architecture Dividierer_Architecture of Dividierer is
19

20
begin
21

22
--assert Quotient'length = (Dividend'length)
23
--    report "Dividierer: Quotient length must equal Dividend length" severity error;
24

25
process (CLK)
26
variable i   : integer range 0 to Dividend'length-1 + 2 := 0;
27
variable q   : std_logic_vector(Dividend'length  downto 0);  -- Ansichtlich etwas länger
28
variable d   : std_logic_vector(Dividend'length-1 downto 0);
29
variable div : std_logic_vector(Dividend'length-1 downto 0);
30
variable x   : std_logic_vector(Dividend'length   downto 0);  -- 1bit läger wegen Subtraktionsüberlauf 
31
variable c   : std_logic;
32

33
constant zeros : std_logic_vector(Dividend'length downto 0) := (others => '0');
34
constant ones  : std_logic_vector(Dividend'length downto 0) := (others => '1');
35

36
begin
37
  if (CLK'event and CLK = '1') then 
38
    if Reset = '0' then 
39
      if i = 0 then 
40
        c   := '0'; 
41
        d   := Dividend; 
42
        div := (others => '0'); 
43
        div := Divisor ; 
44
        q   := (others => '0'); 
45
        x   := (others => '0');
46
        if START = '1' then i := 1; end if;
47
        READY <= '0';
48
      else
49
        c                      := x(x'length-1);
50
        x(x'length-1 downto 0) := x(x'length-2 downto 0) & d(d'length-1);
51
        d(d'length-1 downto 0) := d(d'length-2 downto 0) & '-'; -- don?t care 
52
       
53
        if c = '0' then
54
          x := x - ("0" & div);
55
        else 
56
          x := x + ("0" & div);
57
        end if;
58
        
59
        q(q'length-1 downto 0) := q(q'length-2 downto 0) & not x(x'length-1);      
60
        
61
        i := i + 1;
62
        READY <= '0';
63
        if i = Dividend'length+1 then 
64
         if q(q'length-1 downto Quotient'length) /= zeros(q'length - 1 - Quotient'length downto 0) then
65
            q := (others => '1');
66
          end if;  
67
          
68
          Quotient <= q(Quotient'length-1 downto 0); 
69
          i := 0;
70
          READY <= '1';
71
        end if;
72
      end if;
73
    else
74
        i   := 0;
75
        c   := '0'; 
76
        q   := (others => '0'); 
77
        x   := (others => '0');
78
        READY <= '0';
79
    end if;
80
  end if;
81
end process;
82

83
end Dividierer_Architecture;
#3286871
Lesenswert?

Duke Scarring schrieb:
> Martin H. schrieb:
>> use IEEE.STD_LOGIC_ARITH.ALL;
>> use IEEE.STD_LOGIC_UNSIGNED.ALL;
> Vielleicht machst Du da nochmal etwas hübscheren Code draus, hier meine
> Kritikpunkte:
> 1. siehe Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
gebongt...
> 2. exzessive Verwendung von Variablen
hat die Logik schön klein gemacht
> 3. fehlende Testbench
mpf...vergessen...ist schon 10 Jahre alt der Code und ich habe die TP 
nie wieder gebraucht...
>
> Duke
#3286963
Lesenswert?

Lothar Miller schrieb:
>>> 2. exzessive Verwendung von Variablen
>> hat die Logik schön klein gemacht
> Häh? Wie erklärst du dir das?
Ich hatte einen Servoregler in einen XC2S100 zu pressen
Number of Slices - war mein größtes Problem und da habe ich angesetzt...
Ich kann es heute auch nicht mehr nachvollziehen. Das Original hatte 
noch einen Multiplexer da ich zwei Divisionen brauchte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren