parameter参数传递的16位乘法器

parameter参数传递的16位乘法器
parameter参数传递的16位乘法器

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)

相关主题
相关文档
最新文档