八位二进制BCD码转换器.docx
《八位二进制BCD码转换器.docx》由会员分享,可在线阅读,更多相关《八位二进制BCD码转换器.docx(10页珍藏版)》请在冰豆网上搜索。
八位二进制BCD码转换器
实验报告:
8位二进制-BCD码转换器
姓名:
学号:
指导教师:
一.实验目的
了解二进制-BCD码转换器实现原理,掌握移位加3算法,熟悉Verilog编程中模块复用模式。
二.实验任务
1.掌握用移位加三算法实现二进制-BCD码转换器的设计;
2.设计Verilog实验程序;
3.生成比特流文件,将文件下载到开发板中进行硬件验证。
三.实验设备
1.计算机(安装XilinxISE10.1软件平台);
2.NEXYS2FPGA开发板一套(带USB-MIniUSB下载线)
四.实验原理
设计任意数目输入的二进制-BCD码转换器的方法就是采用移位加三算法(ShiftandAdd3Algorithm)。
此方法包含以下4个步骤:
1)把二进制左移1位;
2)如果共移了8位,那么BCD数就在百位、十位和个位列;
3)如果在BCD列中,任何一个二进制数是5或者比5更大,那么就在BCD列的数值加上3;
4)回到步骤1)。
其工作过程如图1所示:
图1.一个8位的二进制数转换成BCD码的步骤
五.实验内容
在XilinxISE10.1上完成8位二进制-BCD码转换器设计,输入设计文件,仿真后,生成二进制码流文件下载到FPGA开发板上进行验证;
1)依照实验1的方式,在XilinxISE10.1中新建一个工程example02;
2)在工程管理区任意位置单击鼠标右键,在弹出的快捷菜单中选择“NewSource”命令,弹出新建源代码对话框,这里我们选择“VerilogModule”类型,输入Verilog文件名“binbcd8.v”,完整代码如下:
modulebinbcd8(
input[7:
0]b,
outputreg[9:
0]p
);
reg[17:
0]z;
integeri;
always@(*)
begin
for(i=0;i<=17;i=i+1)
z[i]=0;
z[10:
3]=b;
repeat(5)//重复5次
begin
if(z[11:
8]>4)
z[11:
8]=z[11:
8]+3;
if(z[15:
12]>4)
z[15:
12]=z[15:
12]+3;
z[17:
1]=z[16:
0];
end
p=z[17:
8];
end
endmodule
3)设计相应的7段显示管程序,将相应的十进制数在开发板的显示管上显示出来。
建立文件类型为“VerilogModule”的“x7segb.v”,完整代码如下
modulex7segb(
input[15:
0]x,
inputclk,
inputclr,
outputreg[6:
0]a_to_g,
outputreg[3:
0]an,
outputdp
);
wire[1:
0]s;
reg[3:
0]digit;
wire[3:
0]aen;
reg[19:
0]clkdiv;
assigndp=1;
assigns=clkdiv[19:
18];
assignaen[3]=x[15]|x[14]|x[13]|x[12];
assignaen[2]=x[15]|x[14]|x[13]|x[12]
|x[11]|x[10]|x[9]|x[8];
assignaen[1]=x[15]|x[14]|x[13]|x[12]
|x[11]|x[10]|x[9]|x[8]
|x[7]|x[6]|x[5]|x[4];
assignaen[0]=1;
//4位4选1
always@(*)
case(s)
0:
digit=x[3:
0];
1:
digit=x[7:
4];
2:
digit=x[11:
8];
3:
digit=x[15:
12];
default:
digit=x[3:
0];
endcase
//数码管显示
always@(*)
case(digit)
0:
a_to_g=7'b0000001;
1:
a_to_g=7'b1001111;
2:
a_to_g=7'b0010010;
3:
a_to_g=7'b0000110;
4:
a_to_g=7'b1001100;
5:
a_to_g=7'b0100100;
6:
a_to_g=7'b0100000;
7:
a_to_g=7'b0001111;
8:
a_to_g=7'b0000000;
9:
a_to_g=7'b0000100;
'hA:
a_to_g=7'b0001000;
'hB:
a_to_g=7'b1100000;
'hC:
a_to_g=7'b0110001;
'hD:
a_to_g=7'b1000010;
'hE:
a_to_g=7'b0110000;
'hF:
a_to_g=7'b0111000;
default:
a_to_g=7'b0000001;//0
endcase
//digitselect
always@(*)
begin
an=4'b1111;
if(aen[s]==1)
an[s]=0;
end
//时钟分频器
always@(posedgeclkorposedgeclr)
begin
if(clr==1)
clkdiv<=0;
else
clkdiv<=clkdiv+1;
end
Endmodule
4)设计8位二进制-BCD码转换器的顶层模块,如图3所示,下面的程序清单给出了实现这个顶层模块设计的Verilog程序,文件名为“binbcd8_top.v。
图3.顶层模块
modulebinbcd8_top(
inputmclk,
input[3:
3]btn,
input[7:
0]sw,
output[7:
0]led,
output[6:
0]seg,
output[3:
0]an,
outputdp
);
wire[15:
0]x;
wire[9:
0]p;
assignx={6'b000000,p};
assignled=sw;
binbcd8B1(.b(sw),
.p(p)
);
x7segbM1(.x(x),
.clk(mclk),
.clr(btn[3]),
.a_to_g(seg),
.an(an),
.dp(dp)
);
Endmodule
5)导入其UCF文件,并进行编辑,代码如下:
NET"mclk"LOC="B8";
NET"btn<3>"LOC="A7";
NET"sw<0>"LOC="P11";
NET"sw<1>"LOC="L3";
NET"sw<2>"LOC="K3";
NET"sw<3>"LOC="B4";
NET"sw<4>"LOC="G3";
NET"sw<5>"LOC="F3";
NET"sw<6>"LOC="E2";
NET"sw<7>"LOC="N3";
NET"Led<0>"LOC="M5";
NET"Led<1>"LOC="M11";
NET"Led<2>"LOC="P7";
NET"Led<3>"LOC="P6";
NET"Led<4>"LOC="N5";
NET"Led<5>"LOC="N4";
NET"Led<6>"LOC="P4";
NET"Led<7>"LOC="G1";
NET"seg<6>"LOC="L14";
NET"seg<5>"LOC="H12";
NET"seg<4>"LOC="N14";
NET"seg<3>"LOC="N11";
NET"seg<2>"LOC="P12";
NET"seg<1>"LOC="L13";
NET"seg<0>"LOC="M12";
NET"dp"LOC="N13";
NET"an<0>"LOC="F12";
NET"an<1>"LOC="J12";
NET"an<2>"LOC="M13";
NET"an<3>"LOC="K14";
6)进行综合和实现,然后生成二进制比特文件。
7)将生成的二进制比特文件下载到开发板上,观察运行结果。
六.实验结果
七.实验心得及体会
通过本次实验让我了解了8位二进制—BCD码转换器的工作原理。
也让我更加熟悉了ise软件的使用,对Verilog语法有了更深的理解,在本次实验中由于忽略了语法错误,导致实验完成花费了很长时间,让我更了解了Verilog语法的重要性。