Verilog HDL 乘法器.docx

上传人:b****6 文档编号:8688989 上传时间:2023-02-01 格式:DOCX 页数:13 大小:150.07KB
下载 相关 举报
Verilog HDL 乘法器.docx_第1页
第1页 / 共13页
Verilog HDL 乘法器.docx_第2页
第2页 / 共13页
Verilog HDL 乘法器.docx_第3页
第3页 / 共13页
Verilog HDL 乘法器.docx_第4页
第4页 / 共13页
Verilog HDL 乘法器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Verilog HDL 乘法器.docx

《Verilog HDL 乘法器.docx》由会员分享,可在线阅读,更多相关《Verilog HDL 乘法器.docx(13页珍藏版)》请在冰豆网上搜索。

Verilog HDL 乘法器.docx

VerilogHDL乘法器

 

一、设计的性质、目的和任务2

二、设计课题要求2

1、基本要求2

2、设计内容2

三、总体设计3

1、输入模块3

2、乘法模块4

3、选择模块5

4、显示模块7

四、总体调试与仿真结果……………………………13

五、调试中遇到的问题及解决的方法13

六、课程设计过程中的体会和感想14

七、建议……………………………………………15

 

一、设计的性质、目的和任务

熟悉EDA设计方法、设计语言和开发软件及设计实例,利用掌握的一种硬件描述语言(AHDL/VHDL/VerilogHDL)和EDA开发工具(MaxPlusⅡ)进行数字系统的设计开发及仿真。

通过课程设计的锻炼,要求学生掌握电路的一般设计方法,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,培养学生的创新精神。

二、设计课题要求

(1)基本要求

掌握现代大规模集成数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。

(2)设计内容

设计一个两个5位数相乘的乘法器。

用发光二极管显示输入数值,用7段显示器显示十进制结果。

乘数和被乘数分两次输入。

在输入乘数和被乘数时,要求显示十进制输入数据。

输入显示和计算结果显示,采用分时显示方式进行,可参见计算器的显示功能。

注意,如果除法功能为引用功能模块,则难度系数将按照1到2.5计算。

#设计提示(仅供参考):

通常表示带符号二进制数时,最高位为“0”表示“+”号,最高位为“1”表示“-”号,例如,01101表示“+1101”,而11101则表示“-1101”。

乘法运算通常采用移位相加方法实现,见简略示意图。

最终符号则用两个数的最高位采用“异或”逻辑得到。

 

三、总体设计

基于VerilogHDL硬件语言的乘法器设计

(1)输入模块

该模块为乘数和被乘数输入,由ch(表示乘号)、rst(表示复位)控制。

当rst=0、ch=0时,输入被乘数AO;当rst=0、ch=1时,输入乘数BO;当rst=1时,无论ch=0或1,输入均为零。

程序如下:

生成模块如下:

moduleshuru(date,ch,AO,BO,rst);

inputch;

inputrst;

input[3:

0]date;

output[3:

0]AO,BO;

reg[3:

0]AO,BO;

always@(date)

begin

case({ch,rst})

2'b00:

AO=date;

2'b10:

BO=date;

2'b01:

AO=4'b0000;

2'b11:

BO=4'b0000;

default:

begin

AO=4'bx;

BO=4'bx;

end

endcase

end

endmodule

波形仿真如下:

仿真输入被乘数10,乘数12;当复位为1时,输入的14和11均无效。

(2)乘法模块

将乘数b的每一位与被乘数a相乘,如果b的该位为0则相乘得0;如果b的该位为1则相乘后左移相应的位数并寄存,最后累加得出最终结果。

程序如下:

生成模块如下:

modulemult(out,a,b,clk);

output[7:

0]out;

input[3:

0]a,b;

inputclk;

wire[7:

0]out;

wire[5:

0]out1;

wire[7:

0]out2;

reg[6:

0]temp3;

reg[5:

0]temp2;

reg[4:

0]temp1;

reg[3:

0]temp0;

function[3:

0]mult4;

input[3:

0]operand;

inputsel;

begin

mult4=(sel)?

(operand):

4'b0000;

end

endfunction

always@(posedgeclk)

begin

temp0<=mult4(a,b[0]);

temp1<=((mult4(a,b[1]))<<1);

temp2<=((mult4(a,b[2]))<<2);

temp3<=((mult4(a,b[3]))<<3);

end

assignout1=temp0+temp1;

assignout2=temp2+temp3;

assignout=out1+out2;

endmodule

波形仿真如下:

仿真11*12

(3)选择模块

由ch(表乘号键)、dh(表等号键)控制,当ch=0,dh=0时选择被乘数的数值(ai)和符号(fa);当ch=1,dh=0(即按下乘号键)时选择乘数的数值(bi)和符号(fb);当ch=1,dh=1(即同时按下乘号键和等号键)时选择结果的数值(ci)和符号(fc)。

程序如下:

生成模块如下:

modulechoose(ch,dh,ai,bi,ci,fa,fb,fc,out,fo);

inputfa,fb,fc;

input[3:

0]ai,bi;

input[7:

0]ci;

inputch,dh;

outputfo;

output[7:

0]out;

regfo;

reg[7:

0]out;

always@(aiorbiorci)

begin

case({ch,dh})

2'b00:

begin

out=ai;fo=fa;

end

2'b10:

begin

out=bi;fo=fb;

end

2'b11:

begin

out=ci;fo=fc;

end

default:

begin

out=8'bx;fo=1'bx;

end

endcase

end

endmodule

波形仿真如下:

仿真被乘数为-9,乘数为10,结果为-11,选择结果为fo和out。

(4)显示模块

显示模块有LED显示模块和数码管显示模块。

LED显示模块

输入Ri为四位二进制数,分别取反赋值给L0,L1,L2,L3,由L0,L1,L2,L3控制LED的亮灭(输入1灯亮,输入0灯灭)。

程序如下:

生成模块如下:

moduleledxian(Ri,L0,L1,L2,L3);

input[3:

0]Ri;

outputL0,L1,L2,L3;

assignL0=~Ri[0];

assignL1=~Ri[1];

assignL2=~Ri[2];

assignL3=~Ri[3];

endmodule

波形仿真如下:

数码管显示模块

二进制转十进制:

Step=0时,进行初始化;step=1时,若输入最高位有百位则A3加1,若最高位有十位则A2加1,若最高位只有个位则A1加1;

Step=2时,分别将寄存数A3,A2,A1赋值给bai,shi,ge。

如此循环直到输入值为0

modulebdzhuanhuan(clk,DB,bai,shi,ge);

inputclk;

input[7:

0]DB;

output[3:

0]bai,shi,ge;

reg[3:

0]A1,A2,A3,bai,shi,ge;

reg[8:

0]LDB;

reg[2:

0]step;

always@(posedgeclk)

begin

case(step)

0:

begin

LDB[7:

0]<=DB;

step<=1;

A1<=0;

A2<=0;

A3<=0;

end

1:

begin

if(LDB>=100)

begin

A3<=A3+1;

LDB<=LDB-100;

end

elseif((LDB>=10)&&(LDB<100))

begin

A2<=A2+1;

LDB<=LDB-10;

end

elseif((LDB>=1)&&(LDB<10))

begin

A1<=LDB;

LDB<=0;

end

else

begin

step<=2;

end

end

2:

begin

bai<=A3;

shi<=A2;

ge<=A1;

step<=0;

end

default:

step<=0;

endcase

end

endmodule

波形仿真如下:

仿真输入为159,得到分离结果bai=1,shi=5,ge=9

显示译码:

控制数码管各段的亮灭达到显示0~9的目的。

moduleshumaxian(b,s,g,bai,shi,ge);

input[3:

0]bai,shi,ge;

output[7:

0]b,s,g;

reg[7:

0]b,s,g;

always@

(1)

begin

case(bai)

4'd0:

b=8'b00000011;

4'd1:

b=8'b10011111;

4'd2:

b=8'b00100101;

4'd3:

b=8'b00001101;

4'd4:

b=8'b10011001;

4'd5:

b=8'b01001001;

4'd6:

b=8'b01000001;

4'd7:

b=8'b00011111;

4'd8:

b=8'b00000001;

4'd9:

b=8'b00001001;

default:

b=8'bx;

endcase

end

always@

(1)

begin

case(shi)

4'd0:

s=8'b00000011;

4'd1:

s=8'b10011111;

4'd2:

s=8'b00100101;

4'd3:

s=8'b00001101;

4'd4:

s=8'b10011001;

4'd5:

s=8'b01001001;

4'd6:

s=8'b01000001;

4'd7:

s=8'b00011111;

4'd8:

s=8'b00000001;

4'd9:

s=8'b00001001;

default:

s=8'bx;

endcase

end

always@

(1)

begin

case(ge)

4'd0:

g=8'b00000011;

4'd1:

g=8'b10011111;

4'd2:

g=8'b00100101;

4'd3:

g=8'b00001101;

4'd4:

g=8'b10011001;

4'd5:

g=8'b01001001;

4'd6:

g=8'b01000001;

4'd7:

g=8'b00011111;

4'd8:

g=8'b00000001;

4'd9:

g=8'b00001001;

default:

g=8'bx;

endcase

end

endmodule

波形仿真如下:

(5)符号模块

用乘号控制,当ch=0(未按下乘号)输入被乘数的符号,当ch=1(按下乘号)输入乘数的符号,程序如下。

用异或运算结果的符号。

modulesign(fin,fa,fb,ch);

inputch,fin;

outputfa,fb;

regfa,fb;

always@(fin)

begin

if(ch==0)

begin

fa=fin;

end

if(ch==1)

begin

fb=fin;

end

end

endmodule

符号输出时灭掉数码管除符号位以外的其他段,程序如下

modulemieguan(in,out,rst);

inputin,rst;

output[7:

0]out;

reg[7:

0]out;

always@

(1)

begin

case({in,rst})

2'b10:

out=8'b1111_1101;

2'b00:

out=8'b1111_1111;

2'b01:

out=8'b1111_1111;

2'b11:

out=8'b1111_1111;

default:

out=8'bx;

endcase

end

endmodule

四、

总体调试与仿真结果

总体模块结构图:

总体波形仿真:

仿真-9*12,得出结果为数码管对应的二进制数00000011显示为000001001显示为9,10011111显示为1,00100101显示为2,00000001显示为8。

符号位11111101显示负号,11111111不显示即为正。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1