kraam multiplicatoreffecten

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
 
Meer info, please!

Wanneer de multiplier werkt goed, en wanneer niet?uw input sequentie in beide gevallen en je kon er een oplossing ...

 
Misschien hebt u een diagram voor weergave van uw ontwerp architectuur.

 
Zie hieronder VHDL versie van Booth Multiplicatoreffect voor referentie:

- Dit bestand bevat alle entiteit-architecturen voor een volledige
- k-bits x k-bits Booth multiplicatoreffecten.
- het ontwerp maakt gebruik van de nieuwe shift operatoren beschikbaar in de VHDL-93 STD
- Dit ontwerp geeft de Synplify synthese controleren
-------------------------------------------------- --------------------
- top level design eenheid
ENTITY booth_multiplier IS
GENERIEKE (k: POSITIEVE: = 7); - input aantal woord lengte minder een
PORT (vermenigvuldigtal, multiplicatoreffecten: IN BIT_VECTOR (k DOWNTO 0);
klok: IN BIT; product: INOUT BIT_VECTOR ((2 * k 1) DOWNTO 0));
EIND booth_multiplier;

ARCHITECTUUR VAN booth_multiplier structurele IS

SIGNAL mdreg, adderout, vervoert, augend, tcbuffout: BIT_VECTOR (k DOWNTO 0);
SIGNAL mrreg: BIT_VECTOR ((k 1) DOWNTO 0);
SIGNAL adder_ovfl: BIT;
SIGNAL verplicht, clr_mr, load_mr, shift_mr, clr_md, load_md, clr_pp, load_pp, shift_pp: BIT;
SIGNAL boostate: natuurlijke bereik 0 tot 2 * (k 1);

BEGIN

PROCES - belangrijkste kloksnelheid proces waarin alle elementen sequentiële
BEGIN
WAIT UNTIL (clock'EVENT en klok ='1 ');

- register aan te houden vermenigvuldigtal tijdens vermenigvuldiging
INDIEN clr_md ='1 ',
danmdreg <= (OTHERS =>'0 ');
Elsif load_md ='1 ',
danmdreg <= vermenigvuldigtal;
ALSE
mdreg <= mdreg;
END IF;

--register/shifter naar product paar bits gebruikt om toevoegingen
INDIEN clr_mr ='1 ',
danmrreg <= (OTHERS =>'0 ');
Elsif load_mr ='1 ',
danmrreg ((k 1) DOWNTO 1) <= multiplicatoreffecten;
mrreg (0) <='0 ';
Elsif shift_mr ='1 ',
danmrreg <= mrreg SRL 1;
ALSE
mrreg <= mrreg;
END IF;

--register/shifter accumuleert gedeeltelijke product waarden
INDIEN clr_pp ='1 ',
danproduct <= (OTHERS =>'0 ');
Elsif load_pp ='1 ',
danproduct ((2 * k 1) DOWNTO (k 1)) <= adderout; - toevoegen aan bovenste helft
product (k DOWNTO 0) <= product (k DOWNTO 0); - vernieuwen bootm half
Elsif shift_pp ='1 ',
danproduct <= product SRA 1; - verschuiving naar rechts teken verlengen
ALSE
product <= product;
END IF;

Proces beëindigen;

- uitbreiding voegt / aftrekken gedeeltelijke product vermenigvuldigtal
augend <= product ((2 * k 1) DOWNTO (k 1));
addgen: voor i in adderout'RANGE
GENEREREN
lsadder: IF i = 0 GENEREER
adderout (i) <= tcbuffout (i) XOR augend (i) XOR comp;
uitoefent (i) <= (tcbuffout (I) en augend (i)) OF
(tcbuffout (I) en NVU) OF
(COMP EN augend (i));
EIND GENEREER;
otheradder:
Als ik / = 0 GENEREER
adderout (i) <= tcbuffout (i) XOR augend (i) XOR voert (i-1);
uitoefent (i) <= (tcbuffout (I) en augend (i)) OF
(tcbuffout (I) en voert (i-1)) OF
(vervoert (i-1) en augend (i));
EIND GENEREER;
EIND GENEREER;
- Tweeën comp overflow bit
adder_ovfl <uitoefent = (k-1) XOR voert (k);

--true/complement buffer om twee
van de comp van mdreg
tcbuffout <= NIET mdreg wanneer (comp ='1 ') ELSE mdreg;

- stand multiplier staat counter
PROCES BEGIN
WAIT UNTIL (clock'EVENT en klok ='1 ');
INDIEN boostate <2 * (k 1) THEN boostate <= boostate 1;
ALSE boostate <= 0;
END IF;
Proces beëindigen;

- toewijzen controle signaal waarden gebaseerd op state
PROCESS (boostate)
BEGIN
- toewijzen defaults, alle registers vernieuwen
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 ';
INDIEN 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 ......
INDIEN mrreg (0) = mrreg (1) THEN
NULL; - vernieuwen pp
ALSE
load_pp <='1 '; - update product
END IF;
comp <= mrreg (1); - subract als mrreg (1 DOWNTO 0) = "10"
END IF;
Proces beëindigen;

EIND structurele;

 

Welcome to EDABoard.com

Sponsor

Back
Top