module mul_ser (clk, x, a, y); //----> Interface<br>
<br>
input clk;<br>
input [7:0] x, a;<br>
output [15:0] y;<br>
reg [15:0] y;<br>
<br>
<br>
always @(posedge clk) //-> Multiplier in behavioral style<br>
begin : States<br>
parameter s0=0, s1=1, s2=2;<br>
reg [2:0] count;<br>
reg [1:0] state;<br>
reg [15:0] p, t; // Double bit width<br>
reg [7:0] a_reg;<br>
case (state) <br>
s0 : begin // Initialization step <br>
a_reg <= a;<br>
state <= s1;<br>
count = 0;<br>
p <= 0; // Product register reset<br>
t <= {{8{x[7]}},x}; // Set temporary shift register to x<br>
end <br>
s1 : begin // Processing step<br>
if (count == 7) // Multiplication ready<br>
state <= s2;<br>
else <br>
begin // not allow variable bit selects, <br>
if (a_reg[0] == 1) // see (LRM Sec. 4.2.1)<br>
p <= p + t; // Add 2^k<br>
a_reg <= a_reg >> 1;// Use LSB for the bit select<br>
t <= t << 1;<br>
count = count + 1;<br>
state <= s1;<br>
end<br>
end<br>
s2 : begin // Output of result to y and<br>
y <= p; // start next multiplication<br>
state <= s0;<br>
end<br>
endcase <br>
end<br>
<br>
endmodule |