Shift-and-Add Multiplier Datapath

0.0(0)
Studied by 0 people
call kaiCall Kai
Locked
learnLearn
examPractice Test
spaced repetitionSpaced Repetition
heart puzzleMatch
flashcardsFlashcards
GameKnowt Play
Card Sorting

1/54

encourage image

There's no tags or description

Looks like no tags are added yet.

Last updated 9:40 PM on 9/5/26
Name
Mastery
Learn
Test
Matching
Spaced
Call with Kai
Chat

No analytics yet

Send a link to your students to track their progress

55 Terms

1
New cards

Shift-and-Add Multiplier

A sequential multiplication architecture that processes one multiplier bit per iteration while reusing an adder across clock cycles.

2
New cards

ShiftAddMultiplier

The project's iterative multiplication datapath that stores the working multiplicand, working multiplier, accumulated result, and output product.

3
New cards

Trading Space for Time

The architectural strategy of reusing arithmetic hardware across multiple clock cycles instead of performing all partial-product work concurrently.

4
New cards

State Is the Price of Reuse

The principle that spreading multiplication across multiple cycles requires registers to preserve intermediate progress between clock edges.

5
New cards

reg [(2 * WIDTH) - 1:0] MultiplicandRegister;

Stores the current shifted multiplicand contribution used by the shift-and-add datapath.

6
New cards

reg [WIDTH - 1:0] MultiplierRegister;

Stores the working multiplier whose least significant bit determines whether the current multiplicand contribution should be added.

7
New cards

reg [(2 * WIDTH) - 1:0] Accumulator;

Stores the running sum of all partial-product contributions accepted so far.

8
New cards

Product

The registered output containing the multiplication result accumulated by the datapath.

9
New cards

MultiplierBit

Exposes the current least significant bit of MultiplierRegister.

10
New cards

assign MultiplierBit = MultiplierRegister[0];

Continuously exposes the current add-or-skip decision bit from the working multiplier.

11
New cards

MultiplierRegister[0]

The current multiplier bit examined during each shift-and-add iteration.

12
New cards

Because the multiplier is shifted right after every iteration, causing the next original multiplier bit to move into bit position 0.

Why can the sequential multiplier repeatedly inspect MultiplierRegister[0] instead of separately indexing every bit of B?

13
New cards

load

Control signal that initializes the ShiftAddMultiplier for a new multiplication operation.

14
New cards

step

Control signal that commands the ShiftAddMultiplier to perform one multiplication iteration.

15
New cards

posedge clk

The event on which the ShiftAddMultiplier's working state is updated.

16
New cards

Synchronous Reset

The reset behavior used by ShiftAddMultiplier because its reset condition is evaluated inside always @(posedge clk).

17
New cards

MultiplicandRegister <= {(2 * WIDTH){1'b0}};

Resets the working multiplicand register to zero.

18
New cards

MultiplierRegister <= {WIDTH{1'b0}};

Resets the working multiplier register to zero.

19
New cards

Accumulator <= {(2 * WIDTH){1'b0}};

Resets the running multiplication sum to zero.

20
New cards

Product <= {(2 * WIDTH){1'b0}};

Resets the registered multiplication output to zero.

21
New cards

MultiplicandRegister <= {{WIDTH{1'b0}}, A};

Loads A into the lower WIDTH bits of the 2×WIDTH working multiplicand register while zero-extending it.

22
New cards

MultiplierRegister <= B;

Loads operand B into the working multiplier register.

23
New cards

Accumulator <= {(2 * WIDTH){1'b0}};

Clears all accumulated contributions when a new multiplication operation is loaded.

24
New cards

Product <= {(2 * WIDTH){1'b0}};

Clears the visible product when a new multiplication operation is loaded.

25
New cards

Because the shift-and-add process must begin with no previously accumulated partial-product contributions.

Why is Accumulator cleared when load is asserted?

26
New cards

Because the multiplicand will shift left during later iterations and therefore requires enough width to preserve contributions throughout the 2×WIDTH product range.

Why is MultiplicandRegister 2×WIDTH bits wide?

27
New cards

Because only the original WIDTH multiplier bits need to be examined one at a time.

Why is MultiplierRegister only WIDTH bits wide?

28
New cards

if (MultiplierRegister[0])

Determines whether the current shifted multiplicand should be added into the running result during this iteration.

29
New cards

MultiplierRegister[0] = 1

The current multiplicand contribution is included in the accumulated product.

30
New cards

MultiplierRegister[0] = 0

The current multiplicand contribution is skipped.

31
New cards

Accumulator <= Accumulator + MultiplicandRegister;

Adds the current shifted multiplicand contribution into the running multiplication result.

32
New cards

Accumulator <= Accumulator;

Explicitly preserves the existing accumulated result when the current multiplier bit is 0.

33
New cards

Product <= Accumulator + MultiplicandRegister;

Updates Product with the newly calculated accumulated value when the current multiplier bit is 1.

34
New cards

Product <= Accumulator;

Updates Product with the unchanged accumulated value when the current multiplier bit is 0.

35
New cards

Because nonblocking assignments do not immediately change Accumulator during the current clocked evaluation, so Product <= Accumulator would otherwise receive the old accumulator value.

Why does the multiplier use Product <= Accumulator + MultiplicandRegister when MultiplierRegister[0] is 1?

36
New cards

Nonblocking Assignment Semantics

The reason Product must explicitly use the newly calculated sum rather than relying on Accumulator's new value during the same clock edge.

37
New cards

MultiplicandRegister <= MultiplicandRegister << 1;

Shifts the working multiplicand left by one bit after each multiplication step.

38
New cards

MultiplierRegister

Shifts the working multiplier right by one bit after each multiplication step.

39
New cards

Because each successive multiplier bit represents twice the binary weight of the previous multiplier bit.

Why is MultiplicandRegister shifted left after every iteration?

40
New cards

Because shifting left by one position multiplies the current contribution by 2, aligning it with the next multiplier bit's binary weight.

How does shifting MultiplicandRegister left prepare the datapath for the next partial product?

41
New cards

Because the next original multiplier bit must be moved into MultiplierRegister[0], where the datapath performs its add-or-skip test.

Why is MultiplierRegister shifted right after every iteration?

42
New cards

Opposite Shifts

The multiplicand shifts left to increase its positional weight while the multiplier shifts right to bring the next decision bit into the LSB position.

43
New cards

Observe → conditionally add → shift multiplicand left → shift multiplier right

The essential datapath actions of one shift-and-add multiplication iteration.

44
New cards

One Useful Iteration

Processes one original multiplier bit and therefore accounts for one possible partial-product contribution.

45
New cards

WIDTH Useful Iterations

The number of iterations required to process every bit of a WIDTH-bit multiplier when one multiplier bit is handled per step.

46
New cards

Because after WIDTH useful iterations every original bit of B has reached the LSB decision position and its corresponding contribution has either been accumulated or skipped.

Why is shift-and-add multiplication complete after WIDTH useful iterations?

47
New cards

Partial Product in the Sequential Multiplier

The current value of MultiplicandRegister when the current MultiplierRegister[0] is 1.

48
New cards

Accumulator as Algorithmic State

The accumulator preserves the sum of previously accepted partial-product contributions across clock cycles.

49
New cards

MultiplicandRegister as Algorithmic State

Records which shifted version of the multiplicand corresponds to the current iteration.

50
New cards

MultiplierRegister as Algorithmic State

Records which multiplier bits remain to be processed and places the current decision bit at its LSB.

51
New cards

Shifting is part of the multiplication itself.

Is shifting merely bookkeeping around the sequential multiplication algorithm?

52
New cards

Shifting allows one reusable adder to account for successive binary weights without generating every shifted partial product as separate concurrent hardware.

What is the architectural significance of shifting in ShiftAddMultiplier?

53
New cards

if (load) … else if (step)

Gives loading a new multiplication operation priority over performing an iteration on the same clock edge.

54
New cards

Because the datapath must first establish the initial operands and clear the previous accumulated state before any multiplication iteration can be meaningful.

Why does load have priority over step in ShiftAddMultiplier?

55
New cards

Sequential Multiplier Datapath

The part of the multiplier that knows how to perform and preserve the arithmetic transformations of one multiplication step, but does not itself decide when the complete operation should begin or finish.