Serial Multiplier
Datapath
  Recognizing that no more than one of Initialize, Add, and
  Shift will ever be true at the same time, all the flip-flops
  can be controlled by two bits, as follows:
  |  | 
    
      | Shift  Add  Init | x1  x0 |  
      | 0  0  0 | 0  0 |  
      | 0  0  1 | 0  1 |  
      | 0  1  0 | 1  0 |  
      | 1  0  0 | 1  1 |  | 
  Then, each register is controlled by x1 and
  x0 as follows:
  
  |  | 
  
    | x1  x0 | Register m | Register C | Register a | Register q |  
    | 0  0 | No Change | No Change | No Change | No Change |  
    | 0  1 | Load from A | Load with 0 | Load with 0s | Load from B |  
    | 1  0 | No Change | Load from C4 | Load from full adders | No Change |  
    | 1  1 | No Change | Load with 0 | Shift right | Shift right |  | 
Which leads to the following datapath design:
  
Controller
The state table for the controller would be:
  |  | 
    
      | Inputs | Outputs |  
      | Present State | Start | q0 | Next State | Init | Add | Shift | Wait |  
      | 0 | 0 | x | 0 | 0 | 0 | 0 | 1 |  
      | 0 | 1 | 0 | 2 | 1 | 0 | 0 | 0 |  
      | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |  
      | 1 | x | x | 2 | 0 | 1 | 0 | 0 |  
      | 2 | x | 0 | 4 | 0 | 0 | 1 | 0 |  
      | 2 | x | 1 | 3 | 0 | 0 | 1 | 0 |  
      | 3 | x | x | 4 | 0 | 1 | 0 | 0 |  
      | 4 | x | 0 | 6 | 0 | 0 | 1 | 0 |  
      | 4 | x | 1 | 5 | 0 | 0 | 1 | 0 |  
      | 5 | x | x | 6 | 0 | 1 | 0 | 0 |  
      | 6 | x | 0 | 8 | 0 | 0 | 1 | 0 |  
      | 6 | x | 1 | 7 | 0 | 0 | 1 | 0 |  
      | 7 | x | x | 8 | 0 | 1 | 0 | 0 |  
      | 8 | x | x | 0 | 0 | 0 | 1 | 0 |  | 
Assuming we decode the Present State to generate the intermediate values
State0 ... State8 we can derive the
following equations for the output variables, where Di
is the D input of the ith bit of the the 4-bit state register:
  - Init = ( State0 ⋅ Start )
  
- Add =  ( State1 + State3 +
                State5 + State7 )
  
- Shift = ( State2 + State4 +
                State6 + State8 )
  
- Wait = ( State0 ⋅ ~Start )
  
- D0 = (  q0 ⋅
  ( State0 + State2 + State4+
  State6  ) )
  
- D1 = ( (  Start ⋅ State0
  ⋅ ~q0  ) + State1 + ( 
  State2 ⋅ q0  ) +
  ( State4 ⋅ ~q0 ) +
  State5 + ( State6 ⋅
  q0 ) )
  
- D2 = (  ( State2 ⋅
  ~q0 ) + State3 + State4 +
  State5 + ( State6 ⋅
  q0 ) )
  
- D3 = (  ( State6 ⋅
  ~q0 ) + State7  )
Here is a logic diagram for the controller: