Divisore senza restauro
Ciao A tutti,
vi scrivo per chiedervi aiuto. Mi è stato assegnato come progettino di fine anno per un esame la realizzazione in VHDL di un divisore senza restauro.
traccia:"Progetto e simulazione di un divisore di un numero intero X (dividendo) a 2 byte per un intero Y (divisore) a 6 bit. Il quoziente è pur esso un numero intero. Il metodo da seguire è senza restauro: cioè Y va confrontato mediante un comparatore ad un dividendo parziale Xp costituito inizialmente da 6 bit. Qualora Y>Xp il quoziente parziale è zero ed Y deve essere spostato di un posto a dx rispetto a X. Si rifà il tentativo di sottrazione e restauro e shift, che va ripetuto fino a che Y non risulti minore o uguale a Xp. Nel data path, si prevedono 3 registri A, Q, M, il dividendo X va memorizzato nei registri A e Q ed il divisore nel registro M. Al termine il quoziente deve rimanere in Q ed il resto in A. Un apposito contatore indica la fine dell’operazione."
Quello che ho realizzato io in vhdl ha il seguente listato:
####################################################
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity divisore_senza_restauro is
port(Ui,Li: in std_logic_vector(7 downto 0); --Li(8->0) LSByte divisore
--Ui(8->0) MSByte divisore
Y: in std_logic_vector(5 downto 0); --Ui(8->0) MSByte divisore
n1,n2,n3,overflow1,overflow2: out std_logic;
Uu,Lu,resto: out std_logic_vector(7 downto 0)
);
end divisore_senza_restauro;
architecture programma of divisore_senza_restauro is
begin
comp: process (U,L)
variable Xp: std_logic_vector(15 downto 0);
variable Xp1: unsigned(15 downto 0);
variable Y1: unsigned(5 downto 0);
variable U_tempo: std_logic_vector(15 downto 0);
variable quoz: std_logic_vector(15 downto 0 );
--variable resto: bit_vector(7 downto 0);
variable n: integer ;
variable pippo,nq,ni,m,p, c,d,ind_quoz , t, i, q, var, b: integer RANGE -100 TO 100;
begin
c:=0;
n1<='0';
n2<='0';
n3<='0';
p:=5;
ind_quoz:=15; --contatore che indica la fine della divisione
--while(ind_quoz>4)loop --15 bit-10 bit
-------------------------------------------------------
----sposto 2 byte U e L nella variabile qi_tempo----
for n in 15 downto 8 loop
U_tempo(n):=U(n-8);
end loop;
for n in 7 downto 0 loop
U_tempo(n):=U(n);
n2<='1';
end loop;
------------------------------------
------ D I V I S I O N E -----------
pippo:=p;
for n in 10 downto 0 loop
Xp:= U_tempo;
Xp1:=unsigned(Xp);
Xp1:=shift_right(Xp1,n);
-------------------
Y1:=unsigned(Y);
if(Y1>Xp1)then
--devo mettere zero nel quoziente
quoz(ind_quoz):='0';
ind_quoz:=ind_quoz-1;
else
--mettere 1 nel quoziente e fare la sottrazione
quoz(ind_quoz):='1';
Xp1:=Xp1-Y1;
--trasferire gli n bit - significativi di Xp a
--gli n bit + significativi di U_tempo
for d in 0 downto p loop
U_tempo(15-d):=Xp1(pippo);
pippo:=pippo-1;
end loop;
ind_quoz:=ind_quoz-1;
end if;
p:=p+1;
end loop; --FINE DIVISIONE
--end loop;--controllo sulla fine della divisione
------gestione del quoziente--------
--if(ind_quoz<7)then
for d in 15 downto 8 loop
Uu(d-8)<= quoz(d);
end loop;
--overflow2<=U_tempo(7);
--overflow1<=U_tempo(6);
n3<='1';
for d in 7 downto 0 loop
Lu(d)<= quoz(d); --trasferisco i primi 8 bit del resto al seganle di uscita
end loop;
--else
-- for d in 15 downto 8 loop
-- Uu(d-8)<= U_tempo(d);
-- end loop;
-- end if;
------gestione del resto------------
for d in 7 downto 0 loop
resto(d)<= U_tempo(d); --trasferisco i primi 8 bit del resto al seganle di uscita
end loop;
n1<='1';
end process comp;
end programma;
#####################################################
Purtroppo nn funziona.
qualcuno di voi può aiutarmi con il mio progetto o farmi vedere qualcosa di simile?
Grazie in anticipo per la vostra collaborazione.
PS
scusate le la richiesta un po' lunga.