parameter参数传递的16位乘法器
![parameter参数传递的16位乘法器](https://img.360docs.net/imgf3/1sflmgeylxn8722glaqcxkyo6bsmvbo4-31.webp)
![parameter参数传递的16位乘法器](https://img.360docs.net/imgf3/1sflmgeylxn8722glaqcxkyo6bsmvbo4-62.webp)
parameter参数传递的16位乘法器
选用课后习题设计
题目:设计一个4位乘法器,为此首先设计一个4位加法器,用例化语句调用这个加法器,用移位相加的方式完成乘法。并以此为基础,使用parameter参数传递的功能,设计一个16位乘法器。
加法器采用行波进位的方法。4位加法器设计如下:
module ripple_carry_adder(x, y, cin, sum, cout);
parameter N = 4;
input cin;
input [N-1:0] x, y;
output [N-1:0] sum;
output cout;
reg cout;
reg [N-1:0] sum;
reg q[N:0];
always @(x or y or cin)begin:ADDER
integer i;
q[0] = cin;
for(i=0; i<=N-1; i=i+1)begin
q[i+1] = (x[i]&y[i]) | (x[i]&q[i]) | (y[i]&q[i]);
sum[i] = x[i] ^ y[i] ^ q[i];
end
cout = q[N];
end
endmodule
以此为基础的4位乘法器如下:
module top(load, rst, clk, dataa, datab, sum);
parameter n = 4;
input load;
input rst;
input clk;
input [n-1:0] dataa;
input [n-1:0] datab;
output [2*n-1:0] sum;
parameter [1:0] state_s1 = 0,
state_s2 = 1;
reg [1:0] next_state;
reg [2*n-1:0] dataa_register;
reg [n-1:0] datab_register;
reg [2*n-1:0] sum_tmp,sum_tmp2;
wire cout;
assign sum = sum_tmp;
always @(negedge rst or posedge clk)
begin:
integer i;
if (rst == 1'b0)
begin
for (i = 0; i <= 2 * n - 1; i = i + 1)
begin
dataa_register[i] <= 1'b0;
sum_tmp[i] <= 1'b0;
end
for (i = 0; i <= n - 1; i = i + 1)
datab_register[i] <= 1'b0;
next_state <= state_s1;
end
else
case (next_state)
state_s1 :
if (load == 1'b1)
begin
dataa_register[n - 1:0] <= dataa;
datab_register <= datab;
for (i = 0; i <= 2 * n - 1; i = i + 1) sum_tmp[i] <= 1'b0;
next_state <= state_s2;
end
state_s2 :
begin
if (datab_register[0] == 1'b1)