5 use ieee.std_logic_1164.
all;
6 use ieee.numeric_std.
all;
12 WIDTH
: positive
:= 32);
14 Reset_n
: in std_logic;
16 in_request
: out std_logic;
17 in_valid
: in std_logic;
18 dividend
: in unsigned
(WIDTH
-1 downto 0);
19 divisor
: in unsigned
(WIDTH
-1 downto 0);
21 out_requested
: in std_logic;
22 out_valid
: out std_logic;
23 quotient
: out unsigned
(WIDTH
-1 downto 0);
24 remainder
: out unsigned
(WIDTH
-1 downto 0)
28 architecture a_divider
of divider
is
29 type state_t
is (stt_readIn
, stt_divide
, stt_writeOut
);
30 signal state
: state_t
;
33 signal s_divisor
: unsigned
(WIDTH
*2-1 downto 0);
34 signal s_quotient
: unsigned
(WIDTH
-1 downto 0);
35 signal s_remainder
: unsigned
(WIDTH
*2-1 downto 0);
37 signal s_in_request
: std_logic;
38 signal s_out_valid
: std_logic;
39 signal s_repetition
: integer range 0 to WIDTH
+1;
43 in_request
<= s_in_request
;
44 out_valid
<= s_out_valid
;
50 s_out_valid
<= '0'; -- came from WriteOut, out_valid must be 0
52 if( s_in_request
= '1' and in_valid
= '1' )then
53 s_remainder
<= resize
("
00"
, WIDTH
) & dividend
;
54 s_divisor
<= divisor
& resize
("
00"
, WIDTH
);
55 s_quotient
<= resize
("
00"
, WIDTH
);
63 variable v_subtractor
: unsigned
(WIDTH
*2-1 downto 0);
65 v_subtractor
:= s_remainder
- s_divisor
;
67 s_divisor
<= SHIFT_RIGHT
(s_divisor
, 1);
68 s_quotient
<= SHIFT_LEFT
(s_quotient
, 1);
69 if (v_subtractor
(WIDTH
*2-1) = '0') then -- positive
71 s_remainder
<= v_subtractor
;
75 s_repetition
<= s_repetition
+ 1;
76 if (s_repetition
= WIDTH
) then
77 state
<= stt_writeOut
;
86 quotient
<= s_quotient
;
87 remainder
<= s_remainder
(WIDTH
-1 downto 0);
88 if (out_requested
= '1') then
91 end procedure WriteOut
;
94 if (clk
'event and clk
= '1') then
95 if (Reset_n
= '0') then
104 when stt_readIn
=> ReadIn
;
105 when stt_divide
=> Divide
;
106 when stt_writeOut
=> WriteOut
;
107 when others => ReadIn
; state
<= stt_readIn
;