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