实验四BCD码的显示范晓宁3285.docx

上传人:b****3 文档编号:11221617 上传时间:2023-05-29 格式:DOCX 页数:13 大小:385.62KB
下载 相关 举报
实验四BCD码的显示范晓宁3285.docx_第1页
第1页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第2页
第2页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第3页
第3页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第4页
第4页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第5页
第5页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第6页
第6页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第7页
第7页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第8页
第8页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第9页
第9页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第10页
第10页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第11页
第11页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第12页
第12页 / 共13页
实验四BCD码的显示范晓宁3285.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验四BCD码的显示范晓宁3285.docx

《实验四BCD码的显示范晓宁3285.docx》由会员分享,可在线阅读,更多相关《实验四BCD码的显示范晓宁3285.docx(13页珍藏版)》请在冰点文库上搜索。

实验四BCD码的显示范晓宁3285.docx

实验四BCD码的显示范晓宁3285

上海电力学院

实验报告

实验课程名称:

现代数字系统设计

实验项目名称:

BCD码显示及运算

班级:

2010251

姓名:

范晓宁学号:

******85

成绩:

______实验时间:

2012年11月8日

1.二进制码到BCD码的转换

二进制码与BCD码之间的转换关系见下表:

表中将4位二进制输入V=v3v2v1v0转换成2位十进制D=d1d0,实现办法是用SW[3..0]作为二进制输入,而用HEX1和HEX0作为十进制输出的显示。

从上述表中可以看出,当V<=9时,d1=0、d0=V;反之,d1=1、d0=V-10。

实验步骤如下:

第1步:

新建一个Quartus项目。

第2步:

建立一个VHDL文件,根据上述工作原理编写代码以实现所要求的电路,文件另存为bin_bcd.vhd。

由于程序中用到了二进制码与十进制数之间的比较,所以需要添加一个程序包如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

第3步:

完成代码转换之后,需要将BCD码在数码管上显示,所以需要在项目中添加实验3中完成的num_7seg.vhd文件。

第4步:

采用图形编辑方法或元件调用方法都可以完成最终的电路功能。

第5步:

编译并下载验证。

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitybin_bcdis

port(SW:

instd_logic_vector(3downto0);

HEX1,HEX0:

outstd_logic_vector(6downto0));

endbin_bcd;

architectureBCDofbin_bcdis

begin

withSW(3downto0)select

HEX1<="1000000"when"0000",

"1000000"when"0001",

"1000000"when"0010",

"1000000"when"0011",

"1000000"when"0100",

"1000000"when"0101",

"1000000"when"0110",

"1000000"when"0111",

"1000000"when"1000",

"1000000"when"1001",

"1111001"whenothers;

withSW(3downto0)select

HEX0<="1000000"when"0000",

"1111001"when"0001",

"0100100"when"0010",

"0110000"when"0011",

"0011000"when"0100",

"0010010"when"0101",

"0000010"when"0110",

"1111000"when"0111",

"0000000"when"1000",

"0010000"when"1001",

"1000000"when"1010",

"1111001"when"1011",

"0100100"when"1100",

"0110000"when"1101",

"0011000"when"1110",

"0010010"whenothers;

endBCD;

2.1位BCD加法器

电路原理是输入两个BCD码A和B以及1位进位输入cin,输出是BCD码的和sum以及1位进位输出cout。

例如当A=1001(9)、B=1001(9)、cin=1时,cout=1,sum=1001(9)。

电路的输出最大值也就是19。

1位BCD加法器可以利用两个二进制加法器实现,其原理如下图所示。

在VHDL中,二进制加法可以直接用A+B实现。

不过前提是需要使用std_logic_unsigned.all这个程序包。

程序的部分代码如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitybcd_add_1bitis

port(A,B:

instd_logic_vector(3downto0);

cin:

inbit;

sum:

outstd_logic_vector(3downto0));

endbcd_add_1bit;

architecturebehave_BCDofbcd_add_1bitis

signalm:

std_logic_vector(4downto0);

signalc:

std_logic;

begin

m<=('0'&A)+('0'&B)+cin;

c<=m(4)or(m(3)andm

(2))or(m(3)andm

(1));

cout<=c;

sum<=m(3downto0)+('0'&c&c&'0');

endbehave_BCD;

…..

signalm:

std_logic_vector(4downto0);

signalc:

std_logic;

begin

m<=('0'&A)+('0'&B)+cin;

c<=m(4)or(m(3)andm

(2))or(m(3)andm

(1));

cout<=c;

sum<=m(3downto0)+('0'&c&c&'0');

…….

这个程序完全是按照上述工作原理图得出的,文件另存为bcd_add_1bit.vhd。

由于需要将结果值在数码管上显示,所以需要在项目中添加实验3中完成的num_7seg.vhd文件。

验证电路时可以用SW[0]作为cin输入端,SW[4..1]、SW[8..5]分别作为A和B的输入端,HEX0作为sum的输出端,LEDG[0]作为cout的输出端。

3.2位BCD加法器

从1位BCD加法器扩展为2位BCD加法器,可以采用图形编辑器和VHDL文本输入两种方法实现。

输入两个2位BCD码A1A0和B1B0以及1位进位输入cin,输出2位BCD码和S1S0和1位进位输出cout。

验证电路时可用SW[8..1]表示A1A0,SW[16..9]表示B1B0,SW[0]表示cin;HEX1和HEX0表示S1S0,LEDG[0]表示cout。

方法1:

采用图形编辑器的方法,最终效果图如下所示。

方法2:

采用1位BCD加法器的设计思路重新设计一个2位BCD加法器,以下是实现2位BCD加法器的伪代码,可作为编程的思路。

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitybcd_add_2bitis---------------------实体部分

port(key:

instd_logic;---------------定义key输入口

a0,a1,b0,b1:

inintegerrange0to9;-----定义两个加数的输入口

a0l,a1l,b0l,b1l,s0l,s1l,s2l:

outstd_logic_vector(6downto0);----定义七个输出数码管

s:

outstd_logic);----定义Key指示灯输出口

endbcd_add_2bit;

architectureoneofbcd_add_2bitis----------结构体部分

signalone:

integerrange0to18;----定义两个数的个位相加之后的信号

signalten:

integerrange0to19;-----定义两个数的十位相加之后的信号

signalco1,co2:

integerrange0to1;----定义个位和十位的进位信号

signals0,s1:

integerrange0to15;

begin

p1:

process(one,ten,a0,b0,a1,b1,co1)----第一个进程,进行加运算

begin

one<=a0+b0;--------------------个位相加之和

ifone>9then--------------------和大于9,进位为1

co1<=1;

s0<=one-10;-----------------------个位的值

else-----------------------和小于9,进位为0

co1<=0;

s0<=one;-------------------------个位的值

endif;

ten<=a1+b1+co1;----------------------十位相加值和,加数包括个位来的进位

iften>9then-------------------和大于9,进位为1

co2<=1;

s1<=ten-10;-------------------十位的值

else----------------------------------和小于9,进位为0

co2<=0;

s1<=ten;-----------------------十位的值

endif;

endprocessp1;

p2:

process(a0,a1,b0,b1)----------第二个进程,两个加数的输出数码管显示译码

begin

casea0is----------------------被加数的个位显示译码

when0=>a0l<="1000000";

when1=>a0l<="1111001";

when2=>a0l<="0100100";

when3=>a0l<="0110000";

when4=>a0l<="0011001";

when5=>a0l<="0010010";

when6=>a0l<="0000010";

when7=>a0l<="1111000";

when8=>a0l<="0000000";

when9=>a0l<="0010000";

whenothers=>a0l<="ZZZZZZZ";

endcase;

casea1is------------------------------被加数的十位显示译码

when0=>a1l<="1000000";

when1=>a1l<="1111001";

when2=>a1l<="0100100";

when3=>a1l<="0110000";

when4=>a1l<="0011001";

when5=>a1l<="0010010";

when6=>a1l<="0000010";

when7=>a1l<="1111000";

when8=>a1l<="0000000";

when9=>a1l<="0010000";

whenothers=>a1l<="ZZZZZZZ";

endcase;

caseb0is-----------------------------加数的个位显示译码

when0=>b0l<="1000000";

when1=>b0l<="1111001";

when2=>b0l<="0100100";

when3=>b0l<="0110000";

when4=>b0l<="0011001";

when5=>b0l<="0010010";

when6=>b0l<="0000010";

when7=>b0l<="1111000";

when8=>b0l<="0000000";

when9=>b0l<="0010000";

whenothers=>b0l<="ZZZZZZZ";

endcase;

caseb1is----------------------------加数的十位显示译码

when0=>b1l<="1000000";

when1=>b1l<="1111001";

when2=>b1l<="0100100";

when3=>b1l<="0110000";

when4=>b1l<="0011001";

when5=>b1l<="0010010";

when6=>b1l<="0000010";

when7=>b1l<="1111000";

when8=>b1l<="0000000";

when9=>b1l<="0010000";

whenothers=>b1l<="ZZZZZZZ";

endcase;

endprocessp2;

p3:

process(key,s0,s1,co2,a0,a1,b0,b1)--------第三个进程,和的显示译码以及输入大于9是的出来

begin

ifkey='0'ora0>9orb0>9ora1>9orb1>9then--当key等于0或者两个输入中的任何一个位大于9,和的数码显示均为“Z”状态

s0l<="ZZZZZZZ";

s1l<="ZZZZZZZ";

s2l<="ZZZZZZZ";

else

cases0is-------------------------------和的个位显示译码

when0=>s0l<="1000000";

when1=>s0l<="1111001";

when2=>s0l<="0100100";

when3=>s0l<="0110000";

when4=>s0l<="0011001";

when5=>s0l<="0010010";

when6=>s0l<="0000010";

when7=>s0l<="1111000";

when8=>s0l<="0000000";

when9=>s0l<="0010000";

whenothers=>s0l<="ZZZZZZZ";

endcase;

cases1is--------------------------------和的十位显示译码

when0=>s1l<="1000000";

when1=>s1l<="1111001";

when2=>s1l<="0100100";

when3=>s1l<="0110000";

when4=>s1l<="0011001";

when5=>s1l<="0010010";

when6=>s1l<="0000010";

when7=>s1l<="1111000";

when8=>s1l<="0000000";

when9=>s1l<="0010000";

whenothers=>s1l<="ZZZZZZZ";

endcase;

caseco2is--------------------------和的百位显示译码

when0=>s2l<="1000000";

when1=>s2l<="1111001";

endcase;

endif;

endprocessp3;

p4:

process(key)-------------第四个进程,设置key的指示灯

begin

ifkey='1'then

s<='1';

elses<='0';

endif;

endprocessp4;

end;

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

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2