从书上抄了一个加法树乘法器的verilog程序,以飨大家。
///////////////////////////////////////////////////////////////////<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
//// Description: //加法树乘法器(8位)
// Create Date: 2010- 05 -26
// Engineer: 张书腾
// Module Name: mult
// 该算法是实现是用加法表示乘法,用一个8选1 数据选择器来实现加法,再移位,
// 累加,可得结果。 虽增加了若干个寄存器暂存数据,增加了资源消耗,但是提高了速度。
module mult (clk, a, b, out);
input clk; // 系统时钟
input [7:0] a,b; //被乘数
output [15:0] out; //乘后的数
wire [15:0] out;
wire [15: 0] out1,c1;
wire [13:0] out2;
wire [11:0] out3,c2;
wire [9:0] out4;
reg [14:0] temp0;
reg [13:0] temp1;
reg [12:0] temp2;
reg [11:0] temp3;
reg [10:0] temp4;
reg [9:0] temp5;
reg [8:0] temp6;
reg [7:0] temp7;
//////////////////////////////////////////////////////////////////////////////////////////////
///函数function mux8_1的定义,实现选择操作数据
function [7:0] mux8_1;
input [7:0] oprand;
input sel;
begin
mux8_1 = (sel) ? (oprand):8'b0000_0000; //选择语句
end
endfunction
/////////////////////////////////////////////////////////////////////////
///形成移位中间值, 左移位数扩展
always @ (posedge clk)
begin
temp7 <= mux8_1(a,b[0]);
temp6 <= (mux8_1(a,b[1])<<1);
temp5 <= (mux8_1(a,b[2])<<2);
temp4 <= (mux8_1(a,b[3])<<3);
temp3 <= (mux8_1(a,b[4])<<4);
temp2 <= (mux8_1(a,b[5])<<5);
temp1 <= (mux8_1(a,b[6])<<6);
temp0 <= (mux8_1(a,b[7])<<7);
end
//////////////////////////////////////////////////////
//连接实现相乘 a * b
assign out1= temp0 + temp1; // 同理,out1的最大可能比temp0的位数大1.
assign out2 = temp2 + temp3; // 同理,out2的最大可能比temp2的位数大1.
assign out3 = temp4 + temp5; // 同理,out3的最大可能比temp4的位数大1.
assign out4 = temp6 + temp7; //注意out4最大可能为10位二进制数 如255*255时
assign c1 = out1 + out2;
assign c2 = out3 + out4;
assign out = c1+c2;
endmodule
用户377235 2012-11-12 22:29