H
hover
Guest
Hallo, iedereen, ik heb een kraam multiplicatoreffecten, Maar als ik simuleren, ik vond dat sommige tijden kan het werk goed, soms kan het niet.Ik weet niet wat er mis is met mijn ontwerp.Please help me.Hieronder is mijn code.Code:
module booth_multiplier (product, klaar, word1, word2, start-, reset, clk);parameter L_word = 4;
parameter L_BRC = 2;
parameter S_idle = 0, S_shifting = 1, S_adding = 2, S_subing = 3, S_done = 4;
parameter All_ones = 4'b1111;output [2 * L_word-1: 0] product;
uitgang klaar;input [L_word-1: 0] word1, word2;
input start, clk, reset;reg [2:0] staat, next_state;
reg [2 * L_word-1: 0] vermenigvuldigtal;
reg [L_word-1: 0] multiplicatoreffecten;
reg m_brc;
reg-shift, toevoegen, Sub, load_words;
reg spoelen;
reg [2 * L_word-1: 0] product;draad m0 = multiplicatoreffecten [0];
wire [L_BRC-1: 0] BRC = (m0, m_brc);
draad klaar = ((state == S_idle) & &! reset) | | (stand == S_done);
draad leeg = ((word1 == 0) | | (word2 == 0));altijd @ (posedge clk of posedge reset) / / DataPath configuratie
beginnen
if (opnieuw) beginnen
vermenigvuldigtal <= 0;
multiplicatoreffecten <= 0;
product <= 0;
eindigen
else if (spoelen)
product <= 0;
anders als (load_words) beginnen
if (word1 [L_word-1] == 0) vermenigvuldigtal <= word1;
anders vermenigvuldigtal <= (All_ones, word1 [L_word-1: 0]);
multiplicatoreffecten <= word2;
product <= 0;
eindigen
anders als (shift) beginnen
vermenigvuldigtal <= vermenigvuldigtal <<1;
multiplicatoreffecten <= multiplicatoreffecten>> 1;
eindigen
anders als (toevoegen)
product <= product vermenigvuldigtal;
anders als (Sub)
product <= product-vermenigvuldigtal;
eindigenaltijd @ (posedge clk of posedge reset)
if (reset)
m_brc <= 0;
anders als (load_words)
m_brc <= 0;
anders
m_brc <= m0;altijd @ (posedge clk of posedge reset) / / staat overgang
if (reset)
staat <= S_idle;
anders
staat <= next_state;altijd @ (state of start of BRC of multiplier of lege) / / state machine
beginnen
load_words = 0;
shift = 0;
Add = 0;
Sub = 0;
flush = 0;
geval is (staat)
S_idle: if (! Start) next_state = S_idle;
else if (start & &! leeg) beginnen
load_words = 1; next_state = S_shifting;
eindigen
else if (start & & leeg) beginnen
flush = 1; next_state = S_done;
eindigen
S_shifting: if (multiplicatoreffecten == 1) beginnen toevoegen = 1; next_state = S_done; einde
anders als (BRC == 2'b00 | | BRC == 2'b11) beginnen shift = 1;
next_state = S_shifting; einde
anders als (BRC == 2'b01) beginnen toevoegen = 1; next_state = S_adding; einde
anders als (BRC == 2'b10) beginnen Sub = 1; next_state = S_subing; einde
S_adding: begin verschuiving = 1; next_state = S_shifting; einde
S_subing: begin verschuiving = 1; next_state = S_shifting; einde
S_done: if (start == 0) next_state = S_done;
else if (start & & leeg) beginnen
flush = 1; next_state = S_done;
eindigen
else if (start & &! leeg) beginnen
load_words = 1; next_state = S_shifting;
eindigen
standaard: next_state = S_idle;
ENDCASE
eindigenendmodule
module booth_multiplier (product, klaar, word1, word2, start-, reset, clk);parameter L_word = 4;
parameter L_BRC = 2;
parameter S_idle = 0, S_shifting = 1, S_adding = 2, S_subing = 3, S_done = 4;
parameter All_ones = 4'b1111;output [2 * L_word-1: 0] product;
uitgang klaar;input [L_word-1: 0] word1, word2;
input start, clk, reset;reg [2:0] staat, next_state;
reg [2 * L_word-1: 0] vermenigvuldigtal;
reg [L_word-1: 0] multiplicatoreffecten;
reg m_brc;
reg-shift, toevoegen, Sub, load_words;
reg spoelen;
reg [2 * L_word-1: 0] product;draad m0 = multiplicatoreffecten [0];
wire [L_BRC-1: 0] BRC = (m0, m_brc);
draad klaar = ((state == S_idle) & &! reset) | | (stand == S_done);
draad leeg = ((word1 == 0) | | (word2 == 0));altijd @ (posedge clk of posedge reset) / / DataPath configuratie
beginnen
if (opnieuw) beginnen
vermenigvuldigtal <= 0;
multiplicatoreffecten <= 0;
product <= 0;
eindigen
else if (spoelen)
product <= 0;
anders als (load_words) beginnen
if (word1 [L_word-1] == 0) vermenigvuldigtal <= word1;
anders vermenigvuldigtal <= (All_ones, word1 [L_word-1: 0]);
multiplicatoreffecten <= word2;
product <= 0;
eindigen
anders als (shift) beginnen
vermenigvuldigtal <= vermenigvuldigtal <<1;
multiplicatoreffecten <= multiplicatoreffecten>> 1;
eindigen
anders als (toevoegen)
product <= product vermenigvuldigtal;
anders als (Sub)
product <= product-vermenigvuldigtal;
eindigenaltijd @ (posedge clk of posedge reset)
if (reset)
m_brc <= 0;
anders als (load_words)
m_brc <= 0;
anders
m_brc <= m0;altijd @ (posedge clk of posedge reset) / / staat overgang
if (reset)
staat <= S_idle;
anders
staat <= next_state;altijd @ (state of start of BRC of multiplier of lege) / / state machine
beginnen
load_words = 0;
shift = 0;
Add = 0;
Sub = 0;
flush = 0;
geval is (staat)
S_idle: if (! Start) next_state = S_idle;
else if (start & &! leeg) beginnen
load_words = 1; next_state = S_shifting;
eindigen
else if (start & & leeg) beginnen
flush = 1; next_state = S_done;
eindigen
S_shifting: if (multiplicatoreffecten == 1) beginnen toevoegen = 1; next_state = S_done; einde
anders als (BRC == 2'b00 | | BRC == 2'b11) beginnen shift = 1;
next_state = S_shifting; einde
anders als (BRC == 2'b01) beginnen toevoegen = 1; next_state = S_adding; einde
anders als (BRC == 2'b10) beginnen Sub = 1; next_state = S_subing; einde
S_adding: begin verschuiving = 1; next_state = S_shifting; einde
S_subing: begin verschuiving = 1; next_state = S_shifting; einde
S_done: if (start == 0) next_state = S_done;
else if (start & & leeg) beginnen
flush = 1; next_state = S_done;
eindigen
else if (start & &! leeg) beginnen
load_words = 1; next_state = S_shifting;
eindigen
standaard: next_state = S_idle;
ENDCASE
eindigenendmodule