stand moltiplicatore

H

hover

Guest
Hi, tutti, ho scritto uno stand moltiplicatore, ma quando ho simulare, ho trovato che alcune volte si può lavorare bene, a volte non si può.Non so cosa c'è di sbagliato con il mio disegno.Please help me.Qui di seguito è il mio codice.Codice:

Modulo booth_multiplier (prodotto, pronto, parola1, parola2, start, reset, clk);parametro L_word = 4;

parametro L_BRC = 2;

parametro S_idle = 0, S_shifting = 1, S_adding = 2, S_subing = 3, S_done = 4;

All_ones parametro = 4'b1111;output [2 * L_word-1: 0] prodotto;

uscita pronto;input [L_word-1: 0] parola1, parola2;

Start input, clk, reset;reg [2:0] stato, next_state;

reg [2 * L_word-1: 0] moltiplicando;

reg [L_word-1: 0] moltiplicatore;

reg m_brc;

reg turno, ADD, SUB, load_words;

reg flush;

reg [2 * L_word-1: 0] prodotto;filo m0 = moltiplicatore [0];

wire [L_BRC-1: 0] = (m0 BRC, m_brc);

Filo ready = ((state == S_idle) & &! reset) | | (stato == S_done);

Filo vuoto = ((word1 == 0) | | (parola2 == 0));sempre @ (clk posedge o azzerare posedge) / / configurazione Datapath

iniziare

if (reset) begin

moltiplicando <= 0;

moltiplicatore <= 0;

prodotto <= 0;

fine

else if (a filo)

prodotto <= 0;

else if (load_words) begin

if (word1 [L_word-1] == 0) moltiplicando <= parola1;

else moltiplicando <= (All_ones, parola1 [L_word-1: 0]);

moltiplicatore <= parola2;

prodotto <= 0;

fine

else if (shift) begin

moltiplicando <= moltiplicando <<1;

moltiplicatore <= moltiplicatore>> 1;

fine

else if (Add)

prodotto <= prodotto moltiplicando;

else if (Sub)

prodotto <= prodotto moltiplicando;

finesempre @ (clk posedge o ripristinare posedge)

if (reset)

m_brc <= 0;

else if (load_words)

m_brc <= 0;

altro

m_brc <= m0;sempre @ (clk posedge o azzerare posedge) / / transizione di stato

if (reset)

state <= S_idle;

altro

state <= next_state;sempre @ (statali o iniziare o BRC o moltiplicatore o vuoto) / / macchina statale

iniziare

load_words = 0;

shift = 0;

Add = 0;

Sub = 0;

flush = 0;

caso (stato)

S_idle: if (! Start) next_state = S_idle;

else if (start & &! vuota) begin

= 1 load_words; next_state = S_shifting;

fine

else if (start & & empty) begin

flush = 1; next_state = S_done;

fine

S_shifting: if (moltiplicatore == 1) begin Aggiungi = 1; next_state = S_done; end

else if (BRC == 2'b00 | | BRC == 2'b11) begin shift = 1;

next_state = S_shifting; end

else if (BRC == 2'b01) begin Aggiungi = 1; next_state = S_adding; end

else if (BRC == 2'b10) begin Sub = 1; next_state = S_subing; end

S_adding: begin shift = 1; next_state = S_shifting; end

S_subing: begin shift = 1; next_state = S_shifting; end

S_done: if (start == 0) next_state = S_done;

else if (start & & empty) begin

flush = 1; next_state = S_done;

fine

else if (start & &! vuota) begin

= 1 load_words; next_state = S_shifting;

fine

default: next_state = S_idle;

endcase

fineendmodule
 
Maggiori info, please!

Quando il moltiplicatore funziona bene, e quando no?esaminare il vostro input sequenza in entrambi i casi, e si potrebbe trovare una soluzione ...

 
forse avete bisogno di un diagramma per mostrare la propria architettura di design.

 
See below versione VHDL di Booth moltiplicatore di riferimento:

- Questo file contiene tutte le entità architetture per un completo
- k-bit x k-bit Booth moltiplicatore.
- il progetto si avvale di nuovi operatori spostamento disponibile in VHDL-93 STD
- questo progetto supera il controllo di sintesi Synplify
-------------------------------------------------- --------------------
- Unità di design di alto livello
ENTITY booth_multiplier IS
GENERICO (k: POSITIVO: = 7); - il numero di input della lunghezza di parola meno uno
PORT (moltiplicando, moltiplicatore: in bit_vector (k downto 0);
clock: IN BIT; prodotto: INOUT BIT_VECTOR ((2 * k 1) downto 0));
END booth_multiplier;

ARCHITETTURA strutturale booth_multiplier IS

SIGNAL mdreg, adderout, trasporta, augend, tcbuffout: BIT_VECTOR (k downto 0);
SIGNAL mrreg: BIT_VECTOR ((k 1) downto 0);
SIGNAL adder_ovfl: BIT;
SIGNAL comp, clr_mr, load_mr, shift_mr, clr_md, load_md, clr_pp, load_pp, shift_pp: BIT;
SIGNAL boostate: area naturale 0 A 2 * (k 1);

BEGIN

PROCESSO - principale processo di clock contenente tutti gli elementi sequenziali
BEGIN
WAIT UNTIL (clock'EVENT E clock = '1 ');

- registro per tenere moltiplicando durante la moltiplicazione
IF clr_md = '1 'THEN
mdreg <= (others => '0 ');
ELSIF load_md = '1 'THEN
mdreg <= moltiplicando;
ELSE
mdreg <= mdreg;
END IF;

--register/shifter al prodotto coppia di bit utilizzati per il controllo adder
IF clr_mr = '1 'THEN
mrreg <= (others => '0 ');
ELSIF load_mr = '1 'THEN
mrreg ((k 1) downto 1) <= moltiplicatore;
mrreg (0) <= '0 ';
ELSIF shift_mr = '1 'THEN
mrreg <= mrreg SRL 1;
ELSE
mrreg <= mrreg;
END IF;

--register/shifter accumula valori del prodotto parziale
IF clr_pp = '1 'THEN
prodotto <= (others => '0 ');
ELSIF load_pp = '1 'THEN
(di prodotti (2 * k 1) downto (k 1)) <= adderout; - Aggiungi al top mezzo
prodotto (k downto 0) <= prodotto (k downto 0); - mezzo bootm refresh
ELSIF shift_pp = '1 'THEN
prodotto <= prodotto SRA 1; - scorrimento a destra con segno estendere
ELSE
prodotto <= prodotto;
END IF;

END PROCESS;

- adder aggiunge / sottrae il prodotto parziale moltiplicando
augend <= prodotto ((2 * k 1) downto (k 1));
addgen: FOR i IN adderout'RANGE
GENERATE
lsadder: se i = 0 GENERATE
adderout (i) <= tcbuffout (i) augend XOR (i) comp XOR;
porta (i) <= (tcbuffout (i) E augend (i)) OR
(tcbuffout (i) E comp) O
(COMP e augend (i));
End generate;
otheradder: se l'I / = 0 GENERATE
adderout (i) <= tcbuffout (i) augend XOR (i) XOR porta (i-1);
porta (i) <= (tcbuffout (i) E augend (i)) OR
(tcbuffout (i) e porta (i-1)) OR
(porta (i-1) E augend (i));
End generate;
End generate;
- due a due comp overflow bit
adder_ovfl <= porta (k-1) porta XOR (k);

--true/complement buffer per generare due's comp di mdreg
tcbuffout <= NON mdreg QUANDO (= '1 ') mdreg comp ELSE;

- counter stand stato moltiplicatore
PROCESSO BEGIN
WAIT UNTIL (clock'EVENT E clock = '1 ');
IF <boostate 2 * (k 1) THEN boostate <= boostate 1;
ELSE boostate <= 0;
END IF;
END PROCESS;

- assegnare segnale di controllo valori basati sullo stato
PROCESSO (boostate)
BEGIN
- assegnare le impostazioni predefinite, tutti i registri di aggiornamento
comp <= '0 ';
clr_mr <= '0 ';
load_mr <= '0 ';
shift_mr <= '0 ';
clr_md <= '0 ';
load_md <= '0 ';
clr_pp <= '0 ';
load_pp <= '0 ';
shift_pp <= '0 ';
IF boostate = 0 THEN
load_mr <= '1 ';
load_md <= '1 ';
clr_pp <= '1 ';
ELSIF boostate MOD 2 = 0 THEN - boostate = 2,4,6,8 ....
shift_mr <= '1 ';
shift_pp <= '1 ';
ELSE - boostate = 1,3,5,7 ......
IF mrreg (0) = mrreg (1) THEN
NULL; - pp refresh
ELSE
load_pp <= '1 '; - aggiornamento del prodotto
END IF;
comp <= mrreg (1); - subract se mrreg (1 downto 0) = "10"
END IF;
END PROCESS;

END strutturali;

 

Welcome to EDABoard.com

Sponsor

Back
Top