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
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