文档库 最新最全的文档下载
当前位置:文档库 › booth乘法器

booth乘法器

booth乘法器
booth乘法器

Booth乘法器verilog代码(3:2)压缩

将每个模块的代码建一个.V文件,然后选中测试文件进行仿真。本程序可仿真成功。

Booth编码规则

例子

测试文件

module tb_booth_mul();

reg signed [15:0] multiplicand;

reg signed [15:0] multiplier;

wire [31:0] product;

regclock,reset;

initial

begin

reset<=0;

clock <= 1'b0 ;

forever

#5 clock <= ~clock ;

end

always @(posedge clock)

begin

#5

multiplicand <= $random($random);

multiplier <= $random($random);

end

//instantiation

booth_mulu_booth_mul (

.multiplicand(multiplicand),

.multiplier(multiplier), .product(product),

.clk(clock),

.reset(reset)

);

endmodule

booth乘法器主程序文件(不压缩)

module booth_mul(multiplicand,multiplier,product,clk,reset);

parameter BITWIDTH = 16;

input clk,reset;

input [BITWIDTH-1:0] multiplier;

input [BITWIDTH-1:0] multiplicand;

output [2*BITWIDTH-1:0] product;

reg [2*BITWIDTH-1:0] product;

reg [15:0] multiplicand1,multiplier1;

wire [8:0] ss;

wire a,e0,e1;

wire s0,s1,s2,s3,s4,s5,s6,s7,s8;

wire [2*BITWIDTH-1:0] tmp_prod;

wire [BITWIDTH+3:0] j0;

wire [BITWIDTH+2:0] j1,j2,j3,j4,j5,j6;

wire [BITWIDTH+1:0] j7;

wire [BITWIDTH:0] j8;

assign e0=multiplicand[15];

assign e1=multiplier[15];

assign a= e0|e1;

always@ (posedgeclk or posedge reset or negedgeclk)

begin

if(reset)

product <=0;

else

begin

if(a)

begin

if(multiplicand[15]) multiplicand1 <= ~multiplicand+1'b1;

else multiplicand1 <= multiplicand;

if(multiplier[15]) multiplier1 <= ~multiplier+1'b1;

else multiplier1 <= multiplier;

end

else

{multiplicand1,multiplier1}<={multiplicand,multiplier};

end

end

//partial product

bfj_9 j_9(

.multiplicand1(multiplicand1),

.multiplier1(multiplier1),

.s0(s0),.s1(s1),.s2(s2),.s3(s3),.s4(s4),

.s5(s5),.s6(s6),.s7(s7),.s8(s8),

.j0(j0),.j1(j1),

.j2(j2),.j3(j3),

.j4(j4),.j5(j5),

.j6(j6),.j7(j7),

.j8(j8)

);

assign

tmp_prod=j0000+{j1000[25:0],6'b000000}+{s7,1'b0,s6,1'b0,s5,1'b0,s4,1'b0,s3,1'b0,s2,1'b0,s1,1'b0,s0} ;

//partial product accumulator

assign tp1 = j0+{j1,1'b0,s0};

assign tp2 = tp1[BITWIDTH+5:2] + {j2,1'b0,s1};

assign tmp_prod[3:2] = tp2[1:0];

assign tp3 = tp2[BITWIDTH+5:2] + {j3,1'b0,s2};

assign tmp_prod[5:4] = tp3[1:0];

assign tp4 = tp3[BITWIDTH+5:2] + {j4,1'b0,s3};

assign tmp_prod[7:6] = tp4[1:0];

assign tp5 = tp4[BITWIDTH+5:2] + {j5,1'b0,s4};

assign tmp_prod[9:8] = tp5[1:0];

assign tp6 = tp5[BITWIDTH+5:2] + {j6,1'b0,s5};

assign tmp_prod[11:10] = tp6[1:0];

assign tp7 = tp6[BITWIDTH+5:2] + {j7,1'b0,s6};

assign tmp_prod[13:12] = tp7[1:0];

assign tp8 = tp7[BITWIDTH+5:2] + {j8[BITWIDTH-1],1'b0,s7};

assign tmp_prod[2*BITWIDTH-1:14] = tp8[BITWIDTH+1:0];

always@ (posedgeclk or posedge reset or posedgeclk)

if(reset) product <=0;

else if(e0^e1) product<={1'b1,~tmp_prod[2*BITWIDTH-2:0]+1'b1}; else product <= tmp_prod;

endmodule

booth乘法器3:2压缩文件

module booth_mul(multiplicand,multiplier,product,clk,reset); parameter BITWIDTH = 16;

input clk,reset;

input [BITWIDTH-1:0] multiplier;

input [BITWIDTH-1:0] multiplicand;

output [2*BITWIDTH-1:0] product;

reg [2*BITWIDTH-1:0] product;

reg [15:0] multiplicand1,multiplier1;

wire [8:0] ss;

wire a,e0,e1;

wire s0,s1,s2,s3,s4,s5,s6,s7,s8;

wire [2*BITWIDTH-1:0] tmp_prod;

wire [BITWIDTH+3:0] tp8;

wire [BITWIDTH+5:0] tp1,tp2,tp3,tp4,tp5,tp6,tp7;

wire [BITWIDTH+3:0] j0;

wire [BITWIDTH:0] j8;

assign e0=multiplicand[15];

assign e1=multiplier[15];

assign a= e0|e1;

always@ (posedgeclk or posedge reset or negedgeclk)

begin

if(reset)

product <=0;

else

begin

if(a)

begin

if(multiplicand[15]) multiplicand1 <= ~multiplicand+1'b1; else multiplicand1 <= multiplicand;

if(multiplier[15]) multiplier1 <= ~multiplier+1'b1;

else multiplier1 <= multiplier;

end

else

{multiplicand1,multiplier1}<={multiplicand,multiplier};

end

end

//partial product

bfj_9 j_9(

.multiplicand1(multiplicand1),

.multiplier1(multiplier1),

.s0(s0),.s1(s1),.s2(s2),.s3(s3),.s4(s4),

.s5(s5),.s6(s6),.s7(s7),.s8(s8),

.j0(j0),.j1(j1),

.j2(j2),.j3(j3),

.j4(j4),.j5(j5),

.j6(j6),.j7(j7),

.j8(j8)

);

//3:2 yasuo1:9->6

wire [21:0] j0_s,j1_s;

wire [19:0] j0_c,j1_c,j2_s;

wire [17:0] j2_c;

yasuo1 y9_6(

.j0(j0),.j1(j1),

.j6(j6),.j7(j7),

.j8(j8),

.j0_s(j0_s),.j0_c(j0_c),

.j1_s(j1_s),.j1_c(j1_c),

.j2_s(j2_s),.j2_c(j2_c)

);

//3:2 yasuo2:6->4

wire [23:0] j00_s,j00_c;

wire [22:0] j10_s;

wire [19:0] j10_c;

yasuo2 y6_4(

.j00(j0_s),.j01(j0_c),

.j10(j1_s),.j11(j1_c),

.j20(j2_s),.j21(j2_c),

.j00_s(j00_s),.j00_c(j00_c),

.j10_s(j10_s),.j10_c(j10_c)

);

//3:2 yasuo3:4->3

wire [28:0] j20_s;

wire [26:0] j20_c;

yasuo3 y4_3(

.j000(j00_s),.j100(j00_c),

.j200(j10_s),

.j20_s(j20_s),.j20_c(j20_c)

);

//3:2 yasuo4:3->2

wire [31:0] j0000;

wire [26:0] j1000;

yasuo4 y3_2(

.j10(j20_s),

.j20(j20_c),.j30(j10_c),

.j0000(j0000),.j1000(j1000)

);

assign

tmp_prod=j0000+{j1000[25:0],6'b000000}+{s7,1'b0,s6,1'b0,s5,1'b0,s4,1'b0,s3,1'b0,s2,1'b0,s1,1'b0,s0} ;

always@ (posedgeclk or posedge reset or posedgeclk)

if(reset) product <=0;

else if(e0^e1) product<={1'b1,~tmp_prod[2*BITWIDTH-2:0]+1'b1};

else product <= tmp_prod;

加法器

module add3(a,b,c,si,ci);

input a,b,c;

output si,ci;

wire si,ci;

assign si=a^b^c;

assign ci=a&b|(a^b)&c;

endmodule

booth 编码

module booth_recoder(

multiplicand,

code,

pp,

s

);

parameter BITWIDTH = 16;

input [BITWIDTH-1:0] multiplicand;

input [2:0] code;

output [BITWIDTH:0] pp;

output s;

reg [BITWIDTH:0] pp;

reg s;

always @ (multiplicand or code)

case(code)

3'b000:pp = {(BITWIDTH+1){1'b0}};//+0

3'b001:pp = {multiplicand[15],multiplicand}; //+M

3'b010:pp = {multiplicand[15],multiplicand}; //+M

3'b011:pp = {multiplicand,1'b0}; //+2M

3'b100:pp = {~multiplicand,1'b1};//-2M

3'b101:pp = {~multiplicand[15],(~multiplicand)};//-M 3'b110:pp = {~multiplicand[15],(~multiplicand)};//-M 3'b111:pp = {(BITWIDTH+1){1'b1}};//-0

endcase

always @ (multiplicand or code)

case(code[2])

1'b0:s = 1'b0;//+0,+M,+2M

1'b1:s = 1'b1;//-2M,-M,-0

endmodule

booth部分集产生

module bfj_9(multiplicand1,multiplier1,s0,s1,s2,s3,s4,s5,s6,s7,s8,j0,j1,j2,j3,j4,j5,j6,j7,j8);

parameter BITWIDTH = 16;

input [BITWIDTH-1:0]multiplicand1,multiplier1;

output s0,s1,s2,s3,s4,s5,s6,s7,s8;

output [BITWIDTH+3:0] j0;

output [BITWIDTH+2:0] j1,j2,j3,j4,j5,j6;

output [BITWIDTH+1:0] j7;

output [BITWIDTH:0] j8;

wire [BITWIDTH:0] pp0,pp1,pp2,pp3,pp4,pp5,pp6,pp7,pp8;

wire s0,s1,s2,s3,s4,s5,s6,s7,s8;

wire [BITWIDTH+3:0] j0;

wire [BITWIDTH+2:0] j1,j2,j3,j4,j5,j6;

wire [BITWIDTH+1:0] j7;

wire [BITWIDTH:0] j8;

booth_recoder #(BITWIDTH) br0(

.multiplicand(multiplicand1),

.code({multiplier1[1:0],1'b0}),

.pp(pp0),

.s(s0)

);

booth_recoder #(BITWIDTH) br1(

.multiplicand(multiplicand1),

.code(multiplier1[3:1]),

.pp(pp1),

.s(s1)

);

booth_recoder #(BITWIDTH) br2(

.multiplicand(multiplicand1),

.code(multiplier1[5:3]),

.pp(pp2),

.s(s2)

);

booth_recoder #(BITWIDTH) br3(

.multiplicand(multiplicand1),

.code(multiplier1[7:5]),

.pp(pp3),

.s(s3)

);

.multiplicand(multiplicand1), .code(multiplier1[9:7]),

.pp(pp4),

.s(s4)

);

booth_recoder #(BITWIDTH) br5(

.multiplicand(multiplicand1), .code(multiplier1[11:9]),

.pp(pp5),

.s(s5)

);

booth_recoder #(BITWIDTH) br6(

.multiplicand(multiplicand1), .code(multiplier1[13:11]),

.pp(pp6),

.s(s6)

);

booth_recoder #(BITWIDTH) br7(

.multiplicand(multiplicand1), .code(multiplier1[15:13]),

.pp(pp7),

.s(s7)

);

booth_recoder #(BITWIDTH) br8(

.multiplicand(multiplicand1), .code({2'b00,multiplier1[15]}), .pp(pp8),

.s(s8)

);

assign j0 = {~s0,s0,s0,pp0};

assign j1 = {1'b1,~s1,pp1};

assign j2 = {1'b1,~s2,pp2};

assign j3 = {1'b1,~s3,pp3};

assign j4 = {1'b1,~s4,pp4};

assign j5 = {1'b1,~s5,pp5};

assign j6 = {1'b1,~s6,pp6};

assign j7 = {~s7,pp7};

assign j8 = pp8[15:0];

endmodule

input [19:0] j0;

input [18:0] j1,j2,j3,j4,j5,j6;

input [17:0] j7;

input [16:0] j8;

output [21:0] j0_s,j1_s;

output [19:0] j0_c,j1_c,j2_s;

output [17:0] j2_c;

wire [21:0] j0_s,j1_s;

wire [19:0] j0_c,j1_c,j2_s;

wire [17:0] j2_c;

//j0_s,j0_c

assign j0_s[21]=j2[17];

assign j0_s[1]=j0[1];

assign j0_s[0]=j0[0];

assign j0_c[19]=j2[18];

add3 a1 (.a(1'b0), .b(j1[18]), .c(j2[16]), .si(j0_s[20]), .ci(j0_c[18])); add3 a2 (.a(j0[19]), .b(j1[17]), .c(j2[15]), .si(j0_s[19]), .ci(j0_c[17])); add3 a3 (.a(j0[18]), .b(j1[16]), .c(j2[14]), .si(j0_s[18]), .ci(j0_c[16])); add3 a4 (.a(j0[17]), .b(j1[15]), .c(j2[13]), .si(j0_s[17]), .ci(j0_c[15])); add3 a5 (.a(j0[16]), .b(j1[14]), .c(j2[12]), .si(j0_s[16]), .ci(j0_c[14])); add3 a6 (.a(j0[15]), .b(j1[13]), .c(j2[11]), .si(j0_s[15]), .ci(j0_c[13])); add3 a7 (.a(j0[14]), .b(j1[12]), .c(j2[10]), .si(j0_s[14]), .ci(j0_c[12])); add3 a8 (.a(j0[13]), .b(j1[11]), .c(j2[9]), .si(j0_s[13]), .ci(j0_c[11])); add3 a9 (.a(j0[12]), .b(j1[10]), .c(j2[8]), .si(j0_s[12]), .ci(j0_c[10])); add3 a10(.a(j0[11]), .b(j1[9]), .c(j2[7]), .si(j0_s[11]), .ci(j0_c[9])); add3 a11(.a(j0[10]), .b(j1[8]), .c(j2[6]), .si(j0_s[10]), .ci(j0_c[8])); add3 a12(.a(j0[9]), .b(j1[7]), .c(j2[5]), .si(j0_s[9]), .ci(j0_c[7])); add3 a13(.a(j0[8]), .b(j1[6]), .c(j2[4]), .si(j0_s[8]), .ci(j0_c[6])); add3 a14(.a(j0[7]), .b(j1[5]), .c(j2[3]), .si(j0_s[7]), .ci(j0_c[5])); add3 a15(.a(j0[6]), .b(j1[4]), .c(j2[2]), .si(j0_s[6]), .ci(j0_c[4])); add3 a16(.a(j0[5]), .b(j1[3]), .c(j2[1]), .si(j0_s[5]), .ci(j0_c[3])); add3 a17(.a(j0[4]), .b(j1[2]), .c(j2[0]), .si(j0_s[4]), .ci(j0_c[2])); add3 a18(.a(j0[3]), .b(j1[1]), .c(1'b0), .si(j0_s[3]), .ci(j0_c[1])); add3 a19(.a(j0[2]), .b(j1[0]), .c(1'b0), .si(j0_s[2]), .ci(j0_c[0]));

//j1_s,j1_c

assign j1_s[21]=j5[17];

assign j1_c[19]=j5[18];

add3 a20(.a(1'b0), .b(j4[18]), .c(j5[16]), .si(j1_s[20]), .ci(j1_c[18])); add3 a21(.a(1'b0), .b(j4[17]), .c(j5[15]), .si(j1_s[19]), .ci(j1_c[17])); add3 a22(.a(j3[18]), .b(j4[16]), .c(j5[14]), .si(j1_s[18]), .ci(j1_c[16])); add3 a23(.a(j3[17]), .b(j4[15]), .c(j5[13]), .si(j1_s[17]), .ci(j1_c[15])); add3 a24(.a(j3[16]), .b(j4[14]), .c(j5[12]), .si(j1_s[16]), .ci(j1_c[14])); add3 a25(.a(j3[15]), .b(j4[13]), .c(j5[11]), .si(j1_s[15]), .ci(j1_c[13])); add3 a26(.a(j3[14]), .b(j4[12]), .c(j5[10]), .si(j1_s[14]), .ci(j1_c[12])); add3 a27(.a(j3[13]), .b(j4[11]), .c(j5[9]), .si(j1_s[13]), .ci(j1_c[11])); add3 a28(.a(j3[12]), .b(j4[10]), .c(j5[8]), .si(j1_s[12]), .ci(j1_c[10])); add3 a29(.a(j3[11]), .b(j4[9]), .c(j5[7]), .si(j1_s[11]), .ci(j1_c[9])); add3 a30(.a(j3[10]), .b(j4[8]), .c(j5[6]), .si(j1_s[10]), .ci(j1_c[8])); add3 a31(.a(j3[9]), .b(j4[7]), .c(j5[5]), .si(j1_s[9]), .ci(j1_c[7])); add3 a32(.a(j3[8]), .b(j4[6]), .c(j5[4]), .si(j1_s[8]), .ci(j1_c[6])); add3 a33(.a(j3[7]), .b(j4[5]), .c(j5[3]), .si(j1_s[7]), .ci(j1_c[5])); add3 a34(.a(j3[6]), .b(j4[4]), .c(j5[2]), .si(j1_s[6]), .ci(j1_c[4])); add3 a35(.a(j3[5]), .b(j4[3]), .c(j5[1]), .si(j1_s[5]), .ci(j1_c[3])); add3 a36(.a(j3[4]), .b(j4[2]), .c(j5[0]), .si(j1_s[4]), .ci(j1_c[2])); add3 a37(.a(j3[3]), .b(j4[1]), .c(1'b0), .si(j1_s[3]), .ci(j1_c[1])); add3 a38(.a(j3[2]), .b(j4[0]), .c(1'b0), .si(j1_s[2]), .ci(j1_c[0]));

//j2_s,j2_c

assign j2_s[1]=j6[1];

assign j2_s[0]=j6[0];

add3 a39(.a(1'b0), .b(j7[17]), .c(j8[15]), .si(j2_s[19]), .ci(j2_c[17])); add3 a40(.a(j6[18]), .b(j7[16]), .c(j8[14]), .si(j2_s[18]), .ci(j2_c[16])); add3 a41(.a(j6[17]), .b(j7[15]), .c(j8[13]), .si(j2_s[17]), .ci(j2_c[15])); add3 a42(.a(j6[16]), .b(j7[14]), .c(j8[12]), .si(j2_s[16]), .ci(j2_c[14])); add3 a43(.a(j6[15]), .b(j7[13]), .c(j8[11]), .si(j2_s[15]), .ci(j2_c[13])); add3 a44(.a(j6[14]), .b(j7[12]), .c(j8[10]), .si(j2_s[14]), .ci(j2_c[12])); add3 a45(.a(j6[13]), .b(j7[11]), .c(j8[9]), .si(j2_s[13]), .ci(j2_c[11])); add3 a46(.a(j6[12]), .b(j7[10]), .c(j8[8]), .si(j2_s[12]), .ci(j2_c[10])); add3 a47(.a(j6[11]), .b(j7[9]), .c(j8[7]), .si(j2_s[11]), .ci(j2_c[9])); add3 a48(.a(j6[10]), .b(j7[8]), .c(j8[6]), .si(j2_s[10]), .ci(j2_c[8])); add3 a49(.a(j6[9]), .b(j7[7]), .c(j8[5]), .si(j2_s[9]), .ci(j2_c[7])); add3 a50(.a(j6[8]), .b(j7[6]), .c(j8[4]), .si(j2_s[8]), .ci(j2_c[6])); add3 a51(.a(j6[7]), .b(j7[5]), .c(j8[3]), .si(j2_s[7]), .ci(j2_c[5])); add3 a52(.a(j6[6]), .b(j7[4]), .c(j8[2]), .si(j2_s[6]), .ci(j2_c[4])); add3 a53(.a(j6[5]), .b(j7[3]), .c(j8[1]), .si(j2_s[5]), .ci(j2_c[3])); add3 a54(.a(j6[4]), .b(j7[2]), .c(j8[0]), .si(j2_s[4]), .ci(j2_c[2])); add3 a55(.a(j6[3]), .b(j7[1]), .c(1'b0), .si(j2_s[3]), .ci(j2_c[1])); add3 a56(.a(j6[2]), .b(j7[0]), .c(1'b0), .si(j2_s[2]), .ci(j2_c[0]));

endmodule

module yasuo2(j00,j01,j10,j11,j20,j21,j00_s,j00_c,j10_s,j10_c);

input [21:0] j00,j10;

input [19:0] j01,j11,j20;

input [17:0] j21;

output [23:0] j00_s,j00_c;

output [22:0] j10_s;

output [19:0] j10_c;

wire [23:0] j00_s,j00_c;

wire [22:0] j10_s;

wire [19:0] j10_c;

//j00_s,j00_c

assign j00_s[23]=j10[17];

assign j00_s[2]=j00[2];

assign j00_s[1]=j00[1];

assign j00_s[0]=j00[0];

assign j00_c[23]=j10[21];

assign j00_c[22]=j10[20];

assign j00_c[21]=j10[19];

assign j00_c[20]=j10[18];

add3 a1 (.a(1'b0), .b(j01[19]), .c(j10[16]), .si(j00_s[22]), .ci(j00_c[19]));

add3 a2 (.a(j00[21]), .b(j01[18]), .c(j10[15]), .si(j00_s[21]), .ci(j00_c[18])); add3 a3 (.a(j00[20]), .b(j01[17]), .c(j10[14]), .si(j00_s[20]), .ci(j00_c[17])); add3 a4 (.a(j00[19]), .b(j01[16]), .c(j10[13]), .si(j00_s[19]), .ci(j00_c[16])); add3 a5 (.a(j00[18]), .b(j01[15]), .c(j10[12]), .si(j00_s[18]), .ci(j00_c[15])); add3 a6 (.a(j00[17]), .b(j01[14]), .c(j10[11]), .si(j00_s[17]), .ci(j00_c[14])); add3 a7 (.a(j00[16]), .b(j01[13]), .c(j10[10]), .si(j00_s[16]), .ci(j00_c[13])); add3 a8 (.a(j00[15]), .b(j01[12]), .c(j10[9]), .si(j00_s[15]), .ci(j00_c[12])); add3 a9 (.a(j00[14]), .b(j01[11]), .c(j10[8]), .si(j00_s[14]), .ci(j00_c[11])); add3 a10(.a(j00[13]), .b(j01[10]), .c(j10[7]), .si(j00_s[13]), .ci(j00_c[10])); add3 a11(.a(j00[12]), .b(j01[9]), .c(j10[6]), .si(j00_s[12]), .ci(j00_c[9])); add3 a12(.a(j00[11]), .b(j01[8]), .c(j10[5]), .si(j00_s[11]), .ci(j00_c[8])); add3 a13(.a(j00[10]), .b(j01[7]), .c(j10[4]), .si(j00_s[10]), .ci(j00_c[7])); add3 a14(.a(j00[9]), .b(j01[6]), .c(j10[3]), .si(j00_s[9]), .ci(j00_c[6])); add3 a15(.a(j00[8]), .b(j01[5]), .c(j10[2]), .si(j00_s[8]), .ci(j00_c[5])); add3 a16(.a(j00[7]), .b(j01[4]), .c(j10[1]), .si(j00_s[7]), .ci(j00_c[4])); add3 a17(.a(j00[6]), .b(j01[3]), .c(j10[0]), .si(j00_s[6]), .ci(j00_c[3])); add3 a18(.a(j00[5]), .b(j01[2]), .c(1'b0), .si(j00_s[5]), .ci(j00_c[2])); add3 a19(.a(j00[4]), .b(j01[1]), .c(1'b0), .si(j00_s[4]), .ci(j00_c[1])); add3 a20(.a(j00[3]), .b(j01[0]), .c(1'b0), .si(j00_s[3]), .ci(j00_c[0]));

assign j10_s[2]=j11[2];

assign j10_s[1]=j11[1];

assign j10_s[0]=j11[0];

add3 a21(.a(1'b0), .b(j20[19]), .c(j21[16]), .si(j10_s[22]), .ci(j10_c[19]));

add3 a22(.a(1'b0), .b(j20[18]), .c(j21[15]), .si(j10_s[21]), .ci(j10_c[18]));

add3 a23(.a(1'b0), .b(j20[17]), .c(j21[14]), .si(j10_s[20]), .ci(j10_c[17]));

add3 a24(.a(j11[19]), .b(j20[16]), .c(j21[13]), .si(j10_s[19]), .ci(j10_c[16])); add3 a25(.a(j11[18]), .b(j20[15]), .c(j21[12]), .si(j10_s[18]), .ci(j10_c[15])); add3 a26(.a(j11[17]), .b(j20[14]), .c(j21[11]), .si(j10_s[17]), .ci(j10_c[14])); add3 a27(.a(j11[16]), .b(j20[13]), .c(j21[10]), .si(j10_s[16]), .ci(j10_c[13])); add3 a28(.a(j11[15]), .b(j20[12]), .c(j21[9]), .si(j10_s[15]), .ci(j10_c[12])); add3 a29(.a(j11[14]), .b(j20[11]), .c(j21[8]), .si(j10_s[14]), .ci(j10_c[11])); add3 a30(.a(j11[13]), .b(j20[10]), .c(j21[7]), .si(j10_s[13]), .ci(j10_c[10])); add3 a31(.a(j11[12]), .b(j20[9]), .c(j21[6]), .si(j10_s[12]), .ci(j10_c[9])); add3 a32(.a(j11[11]), .b(j20[8]), .c(j21[5]), .si(j10_s[11]), .ci(j10_c[8])); add3 a33(.a(j11[10]), .b(j20[7]), .c(j21[4]), .si(j10_s[10]), .ci(j10_c[7])); add3 a34(.a(j11[9]), .b(j20[6]), .c(j21[3]), .si(j10_s[9]), .ci(j10_c[6])); add3 a35(.a(j11[8]), .b(j20[5]), .c(j21[2]), .si(j10_s[8]), .ci(j10_c[5])); add3 a36(.a(j11[7]), .b(j20[4]), .c(j21[1]), .si(j10_s[7]), .ci(j10_c[4])); add3 a37(.a(j11[6]), .b(j20[3]), .c(j21[0]), .si(j10_s[6]), .ci(j10_c[3])); add3 a38(.a(j11[5]), .b(j20[2]), .c(1'b0), .si(j10_s[5]), .ci(j10_c[2])); add3 a39(.a(j11[4]), .b(j20[1]), .c(1'b0), .si(j10_s[4]), .ci(j10_c[1])); add3 a40(.a(j11[3]), .b(j20[0]), .c(1'b0), .si(j10_s[3]), .ci(j10_c[0]));

endmodule

module yasuo3(j000,j100,j200,j20_s,j20_c);

input [23:0] j000,j100;

input [22:0] j200;

output [28:0] j20_s;

output [26:0] j20_c;

wire [28:0] j20_s;

wire [26:0] j20_c;

assign j20_s[28]=j200[19];

assign j20_s[3]=j000[3];

assign j20_s[2]=j000[2];

assign j20_s[1]=j000[1];

assign j20_s[0]=j000[0];

assign j20_c[26]=j200[22];

assign j20_c[25]=j200[21];

assign j20_c[24]=j200[20];

add3 a2 (.a(1'b0), .b(j100[22]), .c(j200[17]), .si(j20_s[26]), .ci(j20_c[22])); add3 a3 (.a(1'b0), .b(j100[21]), .c(j200[16]), .si(j20_s[25]), .ci(j20_c[21])); add3 a4 (.a(1'b0), .b(j100[20]), .c(j200[15]), .si(j20_s[24]), .ci(j20_c[20])); add3 a5 (.a(j000[23]), .b(j100[19]), .c(j200[14]), .si(j20_s[23]), .ci(j20_c[19])); add3 a6 (.a(j000[22]), .b(j100[18]), .c(j200[13]), .si(j20_s[22]), .ci(j20_c[18])); add3 a7 (.a(j000[21]), .b(j100[17]), .c(j200[12]), .si(j20_s[21]), .ci(j20_c[17])); add3 a8 (.a(j000[20]), .b(j100[16]), .c(j200[11]), .si(j20_s[20]), .ci(j20_c[16])); add3 a9 (.a(j000[19]), .b(j100[15]), .c(j200[10]), .si(j20_s[19]), .ci(j20_c[15])); add3 a10(.a(j000[18]), .b(j100[14]), .c(j200[9]), .si(j20_s[18]), .ci(j20_c[14])); add3 a11(.a(j000[17]), .b(j100[13]), .c(j200[8]), .si(j20_s[17]), .ci(j20_c[13])); add3 a12(.a(j000[16]), .b(j100[12]), .c(j200[7]), .si(j20_s[16]), .ci(j20_c[12])); add3 a13(.a(j000[15]), .b(j100[11]), .c(j200[6]), .si(j20_s[15]), .ci(j20_c[11])); add3 a14(.a(j000[14]), .b(j100[10]), .c(j200[5]), .si(j20_s[14]), .ci(j20_c[10])); add3 a15(.a(j000[13]), .b(j100[9]), .c(j200[4]), .si(j20_s[13]), .ci(j20_c[9])); add3 a16(.a(j000[12]), .b(j100[8]), .c(j200[3]), .si(j20_s[12]), .ci(j20_c[8])); add3 a17(.a(j000[11]), .b(j100[7]), .c(j200[2]), .si(j20_s[11]), .ci(j20_c[7])); add3 a18(.a(j000[10]), .b(j100[6]), .c(j200[1]), .si(j20_s[10]), .ci(j20_c[6])); add3 a19(.a(j000[9]), .b(j100[5]), .c(j200[0]), .si(j20_s[9]), .ci(j20_c[5])); add3 a20(.a(j000[8]), .b(j100[4]), .c(1'b0), .si(j20_s[8]), .ci(j20_c[4])); add3 a21(.a(j000[7]), .b(j100[3]), .c(1'b0), .si(j20_s[7]), .ci(j20_c[3])); add3 a22(.a(j000[6]), .b(j100[2]), .c(1'b0), .si(j20_s[6]), .ci(j20_c[2])); add3 a23(.a(j000[5]), .b(j100[1]), .c(1'b0), .si(j20_s[5]), .ci(j20_c[1])); add3 a24(.a(j000[4]), .b(j100[0]), .c(1'b0), .si(j20_s[4]), .ci(j20_c[0]));

endmodule

module yasuo4(j10,j20,j30,j0000,j1000);

input [28:0] j10;

input [26:0] j20;

input [19:0] j30;

output [31:0] j0000;

output [26:0] j1000;

wire [31:0] j0000;

wire [26:0] j1000;

assign j0000[4]=j10[4];

assign j0000[3]=j10[3];

assign j0000[2]=j10[2];

assign j0000[1]=j10[1];

assign j0000[0]=j10[0];

add3 a3 (.a(1'b0), .b(j20[24]), .c(j30[16]), .si(j0000[29]), .ci(j1000[24])); add3 a4 (.a(j10[28]), .b(j20[23]), .c(j30[15]), .si(j0000[28]), .ci(j1000[23])); add3 a5 (.a(j10[27]), .b(j20[22]), .c(j30[14]), .si(j0000[27]), .ci(j1000[22])); add3 a6 (.a(j10[26]), .b(j20[21]), .c(j30[13]), .si(j0000[26]), .ci(j1000[21])); add3 a7 (.a(j10[25]), .b(j20[20]), .c(j30[12]), .si(j0000[25]), .ci(j1000[20])); add3 a8 (.a(j10[24]), .b(j20[19]), .c(j30[11]), .si(j0000[24]), .ci(j1000[19])); add3 a9 (.a(j10[23]), .b(j20[18]), .c(j30[10]), .si(j0000[23]), .ci(j1000[18])); add3 a10(.a(j10[22]), .b(j20[17]), .c(j30[9]), .si(j0000[22]), .ci(j1000[17])); add3 a11(.a(j10[21]), .b(j20[16]), .c(j30[8]), .si(j0000[21]), .ci(j1000[16])); add3 a12(.a(j10[20]), .b(j20[15]), .c(j30[7]), .si(j0000[20]), .ci(j1000[15])); add3 a13(.a(j10[19]), .b(j20[14]), .c(j30[6]), .si(j0000[19]), .ci(j1000[14])); add3 a14(.a(j10[18]), .b(j20[13]), .c(j30[5]), .si(j0000[18]), .ci(j1000[13])); add3 a15(.a(j10[17]), .b(j20[12]), .c(j30[4]), .si(j0000[17]), .ci(j1000[12])); add3 a16(.a(j10[16]), .b(j20[11]), .c(j30[3]), .si(j0000[16]), .ci(j1000[11])); add3 a17(.a(j10[15]), .b(j20[10]), .c(j30[2]), .si(j0000[15]), .ci(j1000[10])); add3 a18(.a(j10[14]), .b(j20[9]), .c(j30[1]), .si(j0000[14]), .ci(j1000[9])); add3 a19(.a(j10[13]), .b(j20[8]), .c(j30[0]), .si(j0000[13]), .ci(j1000[8])); add3 a20(.a(j10[12]), .b(j20[7]), .c(1'b0), .si(j0000[12]), .ci(j1000[7])); add3 a21(.a(j10[11]), .b(j20[6]), .c(1'b0), .si(j0000[11]), .ci(j1000[6])); add3 a22(.a(j10[10]), .b(j20[5]), .c(1'b0), .si(j0000[10]), .ci(j1000[5])); add3 a23(.a(j10[9]), .b(j20[4]), .c(1'b0), .si(j0000[9]), .ci(j1000[4])); add3 a24(.a(j10[8]), .b(j20[3]), .c(1'b0), .si(j0000[8]), .ci(j1000[3])); add3 a25(.a(j10[7]), .b(j20[2]), .c(1'b0), .si(j0000[7]), .ci(j1000[2])); add3 a26(.a(j10[6]), .b(j20[1]), .c(1'b0), .si(j0000[6]), .ci(j1000[1])); add3 a27(.a(j10[5]), .b(j20[0]), .c(1'b0), .si(j0000[5]), .ci(j1000[0]));

endmodule

4FPGA实验报告8位乘法器—徐艺萍

实验四8位乘法器实验 一、实验原理 8位乘法器,输入为两个8位信号,输出结果为16位。 module mult8(out, a, b); //8位乘法器源代码 parameter size=8; input[size-1:0] a,b; //两个操作数 output[2*size-1:0] out; //结果 assign out=a*b; //乘法运算符 endmodule 本实验采用Chipscope-Pro生成VIO/ICON核,并插入到8位乘法器设计中,在线进行观测和调试。 二、实验目的 1. 熟悉ISE9.1 开发环境,掌握工程的生成方法; 2. 熟悉SEED-XDTK XUPV2Pro 实验环境; 3. 了解Verilog HDL语言在FPGA 中的使用; 4. 通过掌握8位乘法器的Verilog HDL设计,了解数字电路的设计。 三、实验内容 1. 用Verilog HDL语言设计8位乘法器,进行功能仿真验证。 2. 使用chipscope-Pro 生成VIO/ICON 核,在线观测调试。 四、实验准备 1. 将USB 下载电缆与计算机及XUPV2Pro 板的J8 连接好; 2. 将RS232 串口线一端与计算机连接好,另一端与板卡的J11 相连接; 3. 启动计算机,当计算机启动后,将XUPV2Pro 板的电源开关SW11 打开到ON 上。观察XUPV2Pro 板上的+2.5V,+3.3V,+1.5V 的电源指示灯是否均亮。若有不亮的,请断开电源,检查电源。

五、实验步骤 ⑴创建工程及设计输入 ①在E:\project\目录下,新建名为mult8的新工程; 器件族类型(Device Family)选择“Virtex2P”, 器件型号(Device)选“XC2VP30 ff896 -7”, 综合工具(Synthesis Tool)选“XST (VHDL/Verilog)”, 仿真器(Simulator)选“ISE Simulator” ②设计输入并保存。 ⑵功能仿真 ①在sources窗口sources for中选择Behavioral Simulation。 ②由Test Bench WaveForm 添加激励源,如图1所示。仿真结果如图2所示。 图1 波形激励编辑窗口 图2 仿真结果 从图中可以验证由Verilog HDL语言设计的8位乘法器的工作是正确的,不论是输入a的值变化还是输入b的值变化,输出值随之变化,为a与b的乘积。 ⑶生成核并添加核 本次试验内容为8位乘法器,不需要使用ILA核。因此下面使用核生成法生成一个ICON核,一个VIO核就可以了。 ①首先对生成的工程进行综合。 ②生成核 ③添加核

计算机组成原理阵列乘法器课程设计报告

. 课程设计

. 教学院计算机学院 课程名称计算机组成原理题目4位乘法整列设计专业计算机科学与技术班级2014级计本非师班姓名唐健峰 同组人员黄亚军 指导教师 2016 年10 月 5 日

1 课程设计概述 1.1 课设目的 计算机组成原理是计算机专业的核心专业基础课。课程设计属于设计型实验,不仅锻炼学生简单计算机系统的设计能力,而且通过进行设计及实现,进一步提高分析和解决问题的能力。 同时也巩固了我们对课本知识的掌握,加深了对知识的理解。在设计中我们发现问题,分析问题,到最终的解决问题。凝聚了我们对问题的思考,充分的锻炼了我们的动手能力、团队合作能力、分析解决问题的能力。 1.2 设计任务 设计一个4位的二进制乘法器: 输入信号:4位被乘数A(A1,A2,A3,A4), 4位乘数B(B1,B2,B3,B4), 输出信号:8位乘积q(q1,q2,q3,q4,q5,q6,q7,q8). 1.3 设计要求 根据理论课程所学的至少设计出简单计算机系统的总体方案,结合各单元实验积累和课堂上所学知识,选择适当芯片,设计简单的计算机系统。 (1)制定设计方案: 我们小组做的是4位阵列乘法器,4位阵列乘法器主要由求补器和阵列全加器组成。 (2)客观要求 要掌握电子逻辑学的基本内容能在设计时运用到本课程中,其次是要思维灵活遇到问题能找到合理的解决方案。小组成员要积极配合共同达到目的。

2 实验原理与环境 2.1 1.实验原理 计算机组成原理,数字逻辑,maxplus2是现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 用乘数的每一位去乘被乘数,然后将每一位权值直接去乘被乘数得到部分积,并按位列为一行每一行部分积末位与对应的乘数数位对齐,体现对应数位的权值,将各次部分积求和得到最终的对应数位的权值。 2.2 2.实验环境 2.2.1双击maxplu2II软件图标,启动软件 (1).新建工程,flie->new project ....,出现存储路径的选项框,指定项目保存路径并且为工程命名,第三行设置实体名,保持与工程名一致。点击OK

实验三 8位乘法器的设计

实验三8位乘法器的设计 一、实验目的 1)了解8位乘法器的工作原理 2)熟悉MAX+plusII软件的基本使用方法 3)熟悉EDA实验开发的基本使用方法 4)学习VHDL程序中数据对象,数据类型,顺序语句,并行语句的综合使用 二、实验内容 设计一个由8位加法器构成的以时序逻辑方式设计的8位乘法器。其乘法原理是:乘法通过逐项位移相加原理来实现,以被乘数的最低位开始,若为1,则乘数左移后与上一次和相加,若为0,左移后以全零相加,直至被乘数的最高位。 三、实验条件 开发软件:MAX+plus II 9.23 Baseline 硬件设备:装有windows7的pc机 四、实验设计 1)系统的原理框架图

2)VHDL源程序 andarith.vhd源代码 library ieee; use ieee.std_logic_1164.all; entity andarith is port(abin:in std_logic; din:in std_logic_vector(7 downto 0); dout: out std_logic_vector(7 downto 0)); end entity andarith; architecture art of andarith is begin process(abin, din)is begin for i in 0 to 7 loop dout(i)<=din(i)and abin; end loop; end process; end architecture art; arictl.vhd源代码 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity arictl is port(clk:in std_logic; start: in std_logic; clkout:out std_logic; rstall: out std_logic; ariend: out std_logic); end entity arictl; architecture art of arictl is signal cnt4b:std_logic_vector(3 downto 0); begin rstall<=start; process(clk, start)is begin if start='1' then cnt4b<="0000"; elsif clk'event and clk='1'then if cnt4b<8 then cnt4b<=cnt4b+1; end if; end if;

移位相加8位乘法器的设计

EDA技术课程大作业 设计题目:移位相加8位乘法器的设计 院系:电子信息与电气工程学院 学生姓名: 学号:200902070017 专业班级:09电子信息工程专升本 2010年12月3日

移位相加8位乘法器的设计 1.设计背景和设计方案 1.1设计背景 EDA技术(即Electronic Design Automation技术)就是依赖强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Ddscription Langurage)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。它在硬件实现方面融合了大规模集成电路制造技术、IC版图设计、ASIC 测试和封装、FPGA(Gield Peogrammable Gate Array)/CPLD(Complex Programmable Logic Device)编程下载和自动测试等技术;在计算机辅助工程方面融合了计算机辅助设计(CAD),计算机辅助制造(CAM),计算机辅助测试(CAT),计算机辅助工程(CAE)技术以及多种计算机语言的设计概念;而在现代电子学方面则容纳了更多的内容,如电子线路设计理论、数字信号处理技术、数字系统建模和优化技术及长线技术理论等。本文介绍设计一个两个5位数相乘的乘法器。用发光二极管显示输入数值,用7段显示器显示十进制结果。乘数和被乘数分两次输入。在输入乘数和被乘数时,要求显示十进制输入数据。输入显示和计算结果显示,采用分时显示方式进行,可参见计算器的显示功能 1.2设计方案 此设计是由八位加法器构成的以时序逻辑方式设计的八位乘法器,它的核心器件是八位加法器,所以关键是设计好八位加法器。 方案一:八位直接宽位加法器,它的速度较快,但十分耗费硬件资源,对于工业化设计是不合理的。 方案二:由两个四位加法器组合八位加法器,其中四位加法器是四位二进制并行加法器,它的原理简单,资源利用率和进位速度方面都比较好。综合各方面的考虑,决定采用方案二。 该乘法器是由8位加法器构成的以时序方式设计的8位乘法器。其乘法原理是乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。从

乘法器课程设计

摘要:基于VHDL的数字系统设计具有设计技术齐全、方法灵活、支持广泛等优点,同时也是EDA技术的重要组成部分.文章用VHDL语言设计了左移法和进位节省法实现的两种组合乘法器,通过功能仿真,对两种乘法器的性能进行了比较,从而得知后者的传输延迟时间小,即速度较快.通过设计实例,介绍了利用VHDL语言进行数字系统设计的方法. 关键词:VHDL语言左移法进位节省法 Abstract:Digital system design based on VHDL has complete design techniques, methods, the advantages of flexible and wide support, at the same time also is the important component of the EDA technology. The article using VHDL language to design the left shift method and carry save method to realize the combination of two kinds of multiplier, through the function simulation, compares the performance of the two kinds of multiplier, which the latter's small transmission delay time, namely fast. Through the design example, introduced the method of using VHDL language to design digital system. Keywords:VHDL language ,left shift method ,carry save method

模拟乘法器AD834的原理与应用

模拟乘法器AD834的原理与应用 1.AD834的主要特性 AD834是美国ADI公司推出的宽频带、四象限、高性能乘法器,其主要特性如下: ●带符号差分输入方式,输出按四象限乘法结果表示;输出端为集电极开路差分电流结构,可以保证宽频率响应特性;当两输入X=Y=±1V时,输出电流为±4mA; ●频率响应范围为DC~500MHz; ●乘方计算误差小于0.5%; ●工作稳定,受温度、电源电压波动的影响小; ●低失真,在输入为0dB时,失真小于0.05%; ●低功耗,在±5V供电条件下,功耗为280mW; ●对直通信号的衰减大于65dB; ●采用8脚DIP和SOIC封装形式。 2.AD834的工作原理 AD834的引脚排列如图1所示。它有三个差分信号端口:电压输入端口X=X1-X2和Y=Y1-Y2,电流输出端口W=W1-W2;W1、W2的静态电流均为8.5mA。在芯片内部,输入电压先转换为差分电流(V-I转换电阻约为280Ω),目的是降低噪声和漂移;然而,输入电压较低时将导致V-I转换线性度变差,为此芯片内含失真校正电路,以改善小信号V-I转换时的线性特性。电流放大器用于对乘法运算电路输出的电流进行放大,然后以差分电流形式输出。 AD834的传递函数为: W=4XY (X、Y的单位为伏特,W的单位为mA) 3.应用考虑 3.1 输入端连接

尽管AD834的输入电阻较高(20kΩ),但输入端仍有45μA的偏置电流。当输入采用单端方式时,假如信号源的内阻为50Ω,就会在输入端产生1.125mV的失调电压。为消除该失调电压,可在另一输入端到地之间接一个与信号源内阻等值的电阻,或加一个大小、极性可调的直流电压,以使差分输入端的静态电压相等;此外,在单端输入方式下,最好使用远离输出端的X2、Y1作为输入端,以减小输入直接耦合到输出的直通分量。 应当注意的是,当输入差分电压超过AD834的限幅电平(±1.3V)时,系统将会出现较大的失真。 3.2 输出端连接 采用差分输出,可有效地抑制输入直接耦合到输出的直通分量。差分输出端的耦合方式,可用RC耦合到下一级运算放大器,进而转换为单端输出,也可用初级带中心抽头的变压器将差分信号转换为单端输出。 3.3 电源的连接 AD834的电源电压允许范围为±4V~±9V,一般采用±5V。要求VW1和VW2的静态电压略高于引脚+VS上的电压,也就是+VS引脚上的电去耦电阻RS应大于W1和W2上的集电极负载电阻RW1、RW2。例如,RS为62Ω,RW1和RW2可选为49.9Ω,而+V=4.4V,VW1=VW2=4.6V,乘法器的满量程输出为±400mV。 引脚-VS到负电源之间应串接一个小电阻,以消除引脚电感以及去耦电容可能产生的寄生振荡;较大的电阻对抑制寄生振荡有利,但也会使VW1和VW2的静态工作电压降低;该电阻也可用高频电感来代替。 4.应用实例 AD834主要用于高频信号的运算与处理,如宽带调制、功率测量、真有效值测量、倍频等。在某航空通信设备扩频终端机(如图2所示)的研制中,笔者应用AD834设计了扩频信号调制器和扩频信号接收AGC电路。

8位二进制乘法器

8位二进制乘EDA实验 法器 学号:02115024 [2013.12.15] 班级:021151 姓名:王浩楠 指导老师:徐少莹

一.设计要求 8位二进制乘法采用移位相加的方法。即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加,直到所有的部分积都被加过一次。 例如:11010101和10010011相乘,计算过程如下: 二.设计方法 按照这种算法,可以得到下图所示之框图和简单流程图。按照这种算法,可以得到下图所示之框图和简单流程图。图中Y寄存器存放被乘数M,B寄存器存放乘数N,A累加器存放部分积。A和Y中的数据在加法器中相加后送入A 中,而A和B相级联又构成了一个16bit的移位寄存器,当它工作于移位模式时,可以实现数据的右移。由于乘数的每一位不是0就是1 ,对应的部分积不是0就是被乘数本身,所以实际作部分积相加这一步时,只要根据乘数的对应位判断:如该位为1 ,则将累加器中的数据加上被乘数再移位;如该位为0时,就不加被乘数而直接移位。运算时首先将累加器A清零,并将被乘数M和乘数N分别存入寄存器Y和B,然后依据寄存器B中最右一位B0(数据N0)确定第一个部分积。将此部分积送入A累加器以后,将A连同寄存器B右移一位,部分积的最低位被移进寄存器B的最左位,乘数的最低位N0被移出寄存器B,而乘数的次低位N1被移至寄存器B的B0位。第二次仍然依据B0位的数据(N1)来确定第二个部分积,将部分积与累加器中的数据相加后右移一位,N1又被移出寄存器,数据N2被移到B0位置。。。。。这样,经过8次部分积相加位的操作,完成1次乘法运算,乘数N恰好被移出寄存器B,寄存器B中保存的就是运算积的低8位数据。移位相加的次数应用一个计数器来控制,每移位一次,计数器计一个数。当计数器计得8个数时,发出一个信号,使电路停止操作,并输出运算结果。

八位乘法器VHDL及功能模块说明

EDA课程设计报告 实验名称:八位乘法器

目录 一.引言 1.1 EDA技术的概念?? 1.2 EDA技术的特点?? 1.3 EDA设计流程?? 1.4 VHDL介绍?? 二.八位乘法器的设计要求与设计思路??2.1 设计目的?? 2.2 设计要求?? 三.八位乘法器的综合设计?? 3.1 八位乘法器功能?? 3.2 八位乘法器设计方案?? 3.3 八位乘法器实体设计?? 3.4 八位乘法器VHDL设计?? 3. 5八位乘法器仿真图形?? 心得体会?? 参考文献??

一、引言 1.1 EDA技术的概念 EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。 1.2 EDA技术的特点 利用EDA技术进行电子系统的设计,具有以下几个特点:①用软件的方式设计硬件;②用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;③设计过程中可用有关软件进行各种仿真;④系统可现场编程,在线升级;⑤整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。因此,EDA技术是现代电子设计的发展趋势。 1.3 EDA设计流程 典型的EDA设计流程如下: 1、文本/原理图编辑与修改。首先利用EDA工具的文本或图形编辑器将设计者的设计意图用文本或图形方式表达出来。 2、编译。完成设计描述后即可通过编译器进行排错编译,变成特定的文本格式,为下一步的综合做准备。 3、综合。将软件设计与硬件的可实现性挂钩,是将软件转化为硬件电路的关键步骤。 4、行为仿真和功能仿真。利用产生的网表文件进行功能仿真,以便了解设计描述与设计意图的一致性。 5、适配。利用FPGA/CPLD布局布线适配器将综合后的网表文件针对某一具体的目标器件进行逻辑映射操作,其中包括底层器件配臵、逻辑分割、逻辑优化、布局布线。适配报告指明了芯片内资源的分配与利用、引脚锁定、设计的布尔方程描述情况。

模拟乘法器及其应用

模拟乘法器及其应用

摘要 模拟乘法器是一种普遍应用的非线性模拟集成电路。模拟乘法器能实现两个互不相关的模拟信号间的相乘功能。它不仅应用于模拟运算方面,而且广泛地应用于无线电广播、电视、通信、测量仪表、医疗仪器以及控制系统,进行模拟信号的变换及处理。在高频电子线路中,振幅调制、同步检波、混频、倍频、鉴频、鉴相等调制与解调的过程,均可视为两个信号相乘或包含相乘的过程。采用集成模拟乘法器实现上述功能比采用分立器件如二极管和三极管要简单的多,而且性能优越。 Analog multiplier is a kind of widely used nonlinear analog integrated multiplier can be achieved between two unrelated analog multiplication is not only applied in the simulation operation aspect, and widely used in radio, television, communications, measuring instruments, medical equipment and control system, the analog signal conversion and the high frequency electronic circuit, amplitude modulation, synchronous detection, mixing, frequency doubling, frequency, modulation and demodulation process, the same as can be seen as two signal multiplication or contain multiplication function is realized by using integrated analog multiplier than using discrete components such as diodes and transistors are much more simple, and superior performance.

EDA实习之8位乘法器设计

学号:10446234 常州大学 EDA 技术 课程设计报告 题目:移位相加8位硬件乘法器设计 学生:朱京 学院(系):信息科学与工程学院专业班级:电子102 指导教师:李文杰

一、设计题目移位相加8位硬件乘法器设计 二、设计背景 纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器。基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。由8位加法器构成的以时序逻辑方式设计的8位乘法器,具有一定的实用价值。其乘法通过逐项移位相加来实现,从被乘数最低位开始,若为1,则乘数左移后与上次的和相加,若为0,左移后与全0相加,直至被乘数的最高位。 三、设计内容及要求 设计内容: 设计移位相加8位硬件乘法器,完成8位被乘数A[7..0]和8位乘数B[7..0]的乘法运算,得到16位的乘法运算输出DOUT[15..0]。 (1)设计8位移位寄存器SREG8B,当被乘数加载于SREG8B后,随时钟节拍,最低位在前,由低位至高位逐位移出。 (2)设计与门,根据移位寄存器输出是否为1,决定输入加法器的是8位乘数还是全零。 (3)设计8位加法器,将8位乘数或全零与16位锁存器的高8位进行相加。 (4)设计16位锁存器REG16B,在时钟到来时,锁存来自加法器的输出至高8位,并右移低8位。 要求: 1)根据系统设计要求,采用自顶向下的方法,划分系统主要模块,画出整体设计原理框图。 2)根据工作原理、用硬件描述语言对设计内容实现,列出设计程序清单,给出仿真波形图和调试中存在问题及解决方法。 3)设计内容下载至目标芯片,在EDA的GW48型实验箱进行功能验证。 4)谈谈该课题的课程设计中遇到的问题,获得哪些技能和体会,以及建设性意见。 四、设计步骤和安排: (1)题目安排;图书馆查相关资料; (2)设计原理研究,总体设计; (3)各主要模块的VHDL设计。各模块的设计仿真分析。 (4) 完成系统顶层文件设计,系统总体功能的仿真分析。 (5) 将设计内容进行硬件配置,在GW48实验箱上进行调试。 (6) 撰写课程设计报告、答辩并提交报告。

计算机组成原理_阵列乘法器的设计

沈阳航空航天大学 课程设计报告 课程设计名称:计算机组成原理课程设计课程设计题目:阵列乘法器的设计与实现 院(系):计算机学院 专业:计算机科学与技术 班级: 学号: 姓名: 指导教师: 完成日期:2014年1月10日

目录 第1章总体设计方案 0 1.1设计原理 0 1.2设计思路 (1) 1.3设计环境 (2) 第2章详细设计方案 (2) 2.1总体方案的设计与实现 (2) 2.1.1总体方案的逻辑图 (3) 2.1.2器件的选择与引脚锁定 (3) 2.1.3编译、综合、适配 (4) 2.2功能模块的设计与实现 (4) 2.2.1 一位全加器的设计与实现 (4) 2.2.2 4位输入端加法器的设计与实现 (6) 2.2.3 阵列乘法器的设计与实现 (8) 第3章硬件测试 (11) 3.1编程下载 (11) 3.2 硬件测试及结果分析 (11) 参考文献 (13) 附录(电路原理图) (15)

第1章总体设计方案 1.1 设计原理 阵列乘法器采用类似人工计算的方法进行乘法运算。人工计算方法是用乘数的每一位去乘被乘数,然后将每一位权值对应相加得出每一位的最终结果。如图1.1所示,用乘数的每一位直接去乘被乘数得到部分积并按位列为一行,每一行部分积末位与对应的乘数数位对齐,体现对应数位的权值。将各次部分积求和,即将各次部分积的对应数位求和即得到最终乘积的对应数位的权值。 为了进一步提高乘法的运算速度,可采用大规模的阵列乘法器来实现,阵列乘法器的乘数与被乘数都是二进制数。可以通过乘数从最后一位起一个一个和被乘数相与,自第二位起要依次向左移一位,形成一个阵列的形式。这就可将其看成一个全加的过程,将乘数某位与被乘数某位与完的结果加上乘数某位的下一位与被乘数某位的下一位与完的结果再加上前一列的进位进而得出每一位的结果,假设被乘数与乘数的位数均为4位二进制数,即m=n=4,A×B可用如下竖式算出,如图1.1所示。 X4 X3 X2 X1 =A ×Y4 Y3 Y2 Y1=B X4Y1X3Y1X2Y1 X1Y1 X4Y2X3Y2X2Y2X1Y2 X4Y3X3Y3X2Y3X1Y3 (进位)X4Y4 X3Y4X2Y4X1Y4 Z8Z7Z6Z5Z4Z3Z2Z1 图1.1 A×B计算竖式 X4 ,X3 ,X2 ,X1 ,Y4 ,Y3 ,Y2 ,Y1为阵列乘法器的输入端,Z1-Z8为阵列乘法器的输出端,该逻辑框图所要完成的功能是实现两个四位二进制既A(X)*B(Y)的乘法运算,其计算结果为C(Z) (其中A(X)=X4X3X2X1 ,B(Y)=Y4Y3Y2Y1,C(Z)=Z8Z7Z6Z5Z4Z3Z2Z1而且输入和输出结果均用二进制表示)。阵列乘法器的总原理如图1.2所示。

8位乘法器实验报告

6.2 8位乘法器的设计 1.实验目的 (1)熟悉isEXPERT/MAX+plusisEXPERT/MAX+plus II/Foudation Series 软件的基本使用方法。 (2)熟悉GW48-CK EDA实验开发系统的基本使用方法。 (3)学习VHDL基本逻辑电路的综合设计。 2.实验内容 设计并调试好由8位加法器构成的以时序逻辑方式设计的8位乘法器。此乘法器通过判断被乘数的位值为1还是零,并通过乘数的左移与上一次和相加的方法,实现了8位乘法的运算,并用GW48-CK EDA实验开发系统进行硬件验证。 3.实验条件 (1)开发设备:Lattice ispEXPERT。 (2)实验设备:GW48-CK EDA实验开发系统。 (3)拟用芯片:ispLSI1032E PLCC-84或EPF10K10LC84-3或XCS05/XL PLCC84以及运算控制电路和外部时钟。 4.实验设计 1)系统的原理框图

2)VHDL源程序 (1)选通与门模块的源程序ANDARITH.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ANDARITH IS PORT(ABIN: IN STD_LOGIC; DIN: IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT: OUT STD_LOGIC_vector(7 DOWNTO 0)); END ENTITY ANDARITH; ARCHITECTURE ART OF ANDARITH IS BEGIN PROCESS(ABIN,DIN)IS BEGIN FOR I IN 0 TO 7 LOOP DOUT(I)<=DIN(I)AND ABIN; END LOOP; END PROCESS; END ARCHITECTURE ART; (2)16位锁存器的源程序REG16B.VHD LIBRARY IEEE;

移位硬件八位乘法器

移位硬件八位乘法器 作者:孤灯 摘要:纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器,基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。这里介绍由八位加法器构成的以时序逻辑方式设计的八位乘法器,具有一定的实用价值,而且由FPGA构成实验系统后,可以很容 易的用ASIC大型集成芯片来完成,性价比高,可操作性强。 关键词:加法器,寄存器,一位乘法器,锁存器。 Abstract The pure combinatory logic constitution multiplier although the working speed quite is quick,But too takes the hardware resources,Realizes the wide position multiplier with difficulty.Meets the ROM multiplication table based on the PLD component outside the multiplier then is unable to constitute the monolithic system,Also is impractica Here introduced constitutes by eight accumulators by the succession logic way design eight multipliers,Has the certain practical value, Moreover constitutes the experimental system after FPGA,May be very easy to complete with the ASIC large-scale integration chip,The natural price is higher than,Feasibility. 一.设计思路 纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器,基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。这里介绍由八位加法器构成的以时序逻辑方式设计的八位乘法器,具有一定的实用价值,而且由FPGA构成实验系统后,可以很容易的用ASIC大型集成芯片来完成,性价比高,可操作性强。其乘法原理是:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与 上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。 二.方案设计与论证 此设计是由八位加法器构成的以时序逻辑方式设计的八位乘法器,它的核心器件是八 加法器,所以关键是设计好八位加法器。 方案一:八位直接宽位加法器,它的速度较快,但十分耗费硬件资源,对于工业化设计是不合理的。 方案二:由两个四位加法器组合八位加法器,其中四位加法器是四位二进制并行加法器,它的原理简单,资源利用率和进位速度方面都比较好。综合 各方面的考虑,决定采用方案二。 三.工作原理

乘法器的设计

物理与电子工程学院集成电路设计课程论文题目:乘法器的研究 学生姓名:XXX 指导教师:XXX 201X年XX月XX日

乘法器 摘要:乘法器,其基础就是加法器结构,它已经是现代计算机中必不可少的一部分。 乘法器的模型就是基于“移位和相加”的算法。本文讨论基本的阵列乘法器,以及产生部分 积和最终求和。 关键词:全加器,半加器,阵列。 引言: 乘法运算非常耗费硬件面积并且速度很慢,许多计算问题解决的快慢受乘法器电 路工作速度的约束,因此在现代高级的数字信号处理器和微处理器中都集成了硬件乘法单 元。并且乘法器在当今数字信号处理以及其他诸多应用领域中起着十分重要的作用。随着科 学技术的发展,许多研究人员已经开始试图设计一类拥有更高速率和低功耗,布局规律占用 面积小,集成度高的乘法器。这样,就能让它们更加适用于高速率,低功耗的大规模集成电 路的应用当中。通常的乘法计算方法是添加和位移的算法。在并行乘法器当中,相加的部分乘积的数量是主要的参数。它决定了乘法器的性能。为了减少相加的部分乘积的数量,修正 的Booth 算法是最常用的一类算法。但是,随着并行化的增多,大量的部分乘积和中间求和 的增加,会导致运行速度的下降。不规则的结构会增加硅板的面积,并且由于路由复杂而导 致中间连接过程的增多继而导致功耗的增大。另一方面串并行乘法器牺牲了运行速度来获得 更好的性能和功耗。因此,选择一款并行或串行乘法器实际上取决于它的应用性质。 主体 1.1.1二进制乘法定义 考虑两个无符号二进制数X 和Y ,X 为M 位宽,Y 为N 位宽,将它们用下列二进制数形 式表达 i 1 -M 0i i 2X X ∑== (1.1) j 1 -N 0j j 2Y Y ∑== (1.2) 其中i X 和j Y 为0或者1,那么X 和Y 的乘法运算定义如下 Z=X ×Y= k 1 -N M 0k k 2Z ∑+= =(i M i i X 210∑-=)(j 1-N 0j j 2Y ∑=)=∑∑=-=+???? ??1-M 0i 10j 2N j i j i Y X (1.3) 我们先来看一下手工是如何进行二进制乘法运算的。如图1-1所示,被乘数与乘数的第一个 位相乘(实际为“与”操作)产生积,并且根据乘数相应位的位置对部分积进行左移(例如, 被乘数与乘数的第0位相乘,则不移位;与第一位相乘,部分积左移1位,以此类推),最 终将所有的部分积相加得到乘法运算的结果。M 位被乘数与N 位乘数相乘得到的乘积是 M+N 位的。 1.1.2部分积生成

移位相加型8位硬件乘法器设计

合肥学院 课程设计报告 题目:移位相加型8位硬件乘法器 系别:电子信息与电气工程系 专业:通信工程 班级: 13通信工程(1)班 学号: 姓名: 导师:石朝毅 成绩: 2016年 6 月 11 日

移位相加型8位硬件乘法器设计 摘要 本次设计是基于时序结构的8位移位相加型乘法器,使用软件QuartusII进行仿真设计。完成此乘法器,我们需要首先设计该乘法器的组件,包括REGSHT模块、SREG8BT模块、AND8B模块和ADDER8BT模块,并对所有元件进行仿真,无误后可进行乘法器的设计。设计方法使用的是元件例化,具体原理是通过逐项相加来实现乘法功能,最终完成整体的VHDL程序设计并仿真。 关键词:时序;乘法器;元件例化

目录 第一章前言............................................ 错误!未定义书签。设计概述............................................. 错误!未定义书签。 问题提出与原理..................................... 错误!未定义书签。 设计需要........................................... 错误!未定义书签。第二章设计过程及结果.................................. 错误!未定义书签。设计思路............................................. 错误!未定义书签。 设计须知........................................... 错误!未定义书签。 基本步骤........................................... 错误!未定义书签。设计代码及仿真....................................... 错误!未定义书签。 元件REGSHT设计代码及仿真结果...................... 错误!未定义书签。 元件SREG8BT设计代码及仿真结果..................... 错误!未定义书签。 元件AND8B设计代码及仿真结果....................... 错误!未定义书签。 元件ADDER8BT设计代码及仿真结果.................... 错误!未定义书签。 总模块设计代码及仿真结果........................... 错误!未定义书签。第三章总结............................................ 错误!未定义书签。致谢................................................... 错误!未定义书签。

基于模拟乘法器MC1496的混频器设计

基于模拟乘法器MC1496的混频器设计

摘要 集成模拟乘法器是完成两个模拟量(电压或电流)相乘的电子器件。在高频电子线路中,振幅调制、同步检波、混频、倍频、鉴频等调制与解调的过程均可视为两个信号相乘的过程,而集成模拟乘法器正是实现两个模拟量,电压或电流相乘的电子器件。采用集成模拟乘法器实现上述功能比用分立器件要简单得多,而且性能优越,因此集成模拟乘法器在无线通信、广播电视等方面应用较为广泛。 混频器在通信工程和无线电技术中,应用非常广泛,在调制系统中,输入的基带信号都要经过频率的转换变成高频已调信号。在解调过程中,接收的已调高频信号也要经过频率的转换,变成对应的中频信号。特别是在超外差式接收机中,混频器应用较为广泛,混频电路是应用电子技术和无线电专业必须掌握的关键电路。 Matlab是一种电子技术界应用广泛的优秀科学计算软件,大量应用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。主要内容是基于MC1946的混频器应用设计与仿真,阐述混频器基本原理,并在Matlab中实现各信号波形的仿真。 关键词:MC1496模拟乘法器,混频器,Matlab

DESING OF MIXER BASED ON THE ANALOG MULTIPLIER MC1496 Abstract Integrated analog multiplier is to complete two analog multiplication electronics (voltage or current) In high frequency electronic circuit, amplitude modulation, synchronous detection, mixing, times frequency, frequency modulation and demodulation process can be regarded as the multiplication of two signals process, and integrated analog multiplier is the realization of two analog, voltage or current multiplication of electronic devices. The function is realized by using integrated analog multiplier is much simpler than with a discrete device, and superior performance, therefore integrated analog multiplier in wireless communication, radio and television are more widely application. Mixer in communication engineering and electronic technology, are widely applied in modulation system, the input of the baseband signal through frequency conversion into high frequency modulated signals. In the process of demodulation, receive the high frequency signal is modulated by frequency conversion, into the corresponding intermediate frequency signals. Especially in a superheterodyne receiver, which has been widely applied mixer, mixing circuit is a professional application of electronic technology, and radio must master the key circuit. Matlab is an electronic technology widely used mathematical software, a large number of used in algorithm development, data visualization, data analysis and numerical calculation of senior technical computing language and interactive environment. Main content is based on the MC1946 mixer application design and simulation, the basic principle of mixer, and realize the signal waveform in the Matlab simulation. Key Words: MC1496 analog multiplier, mixer, Matlab

相关文档