贵州大学
EDA技术课程设计报告
题 目:BCD码加法器
院 系 计算机科学与技术学院 专 业 计科121
学 号 **********、**********、********** 学生姓名 张飞宇、王红强、匡金军 指导教师 夏玉勤
EDA技术课程设计报告 设计BCD码加法器
一、 设计任务及要求
(1)课程设计意义:
对BCD码加法有了进一步了解;
学习了quartus II设计软件,初步了解了FPGA; (2)设计要求:
利用Verilog HDL语言,编写一个4位BCD码加法器程序,输入用八个开关分别表示两个BCD码,输出结果用数码管显示。
主要芯片:2个全加器(4008BD)、开关、数码管(2个),其他元件、门电路任选
(3)主要功能:
输入两个4位BCD码,相加结果显示在数码管上。
我组在要求的功能上添加了一些代码,使输入结果也能在数码管上显示。
(4)设计思路:
图1 简易结构图
如图1所示:A,B分别是2个输入数字,S0-S1为输出,经过BCD加法器的运算,能实现BCD码加法功能。
(1)T=A+B,若T>10,则Z赋值为10,同时进位(2)C=1,和值低位(3)S0=T-Z,和值高位(4)S1=C。
二、 基于Verilog语言的电路设计、仿真、综合 硬件及软件电路设计及描述
2
EDA技术课程设计报告 图2 顶层模块图
图3 RTL (1)数据的产生与输入
通过J1~J8八个单刀双掷开关在+5V和GND之间的切换来产生两个4位8421BCD码作为输入的数据,当开关打到+5V时输入数据1,打到GND时输入数据0。其中J1~J4分别为数据A3~A0,J5~J8分别为数据B3~B0,且A3~A0、B3~B0
的位权依次降低(8421)。
(2)加法电路
把上面得到的两个四位8421BCD码分别输入4008BD全加器的输入端A3~A0、B3~B0,同时CIN输入端接低电平。则S3~S0输出计算结果,COUT为
3
EDA技术课程设计报告 进位输出端。 (3)转换电路
为将输出结果显示在数码管上,需要将计算结果进行转换,转换电路的原理如表2.1所示当结果小于9时,转换为十进制时只有一位,所以无需转换可以直接输入显示译码器后通过数码管显示出。当运算结果大于9时,转化为十进制数为两位要进位,因此必须通过转换电路来实现数值转换,即将得到的结果做如表1.3所示的转换。考虑到全加器要到16才能进位,而显示时则要求到十句进位,所以要在通过一个4008全加器将计算结果加上六,使其在结果为10时就开始进位,又因为计算结果小于9时不能加六,所以通过一个四位数值比较器74HC85AD将计算结果与事先设定的数9进行比较,当结果大于九时则给第二片全加器的A3~A0输入数据6,当计算结果不大于9时则给第二片全加器的A3~A0输入数据0,即不做变化。 (4)显示电路
在数字测量仪表和各种数字系统中,都需要将数字量直观地显示出来,数字显示电路通常由译码驱动器和显示器等部分组成。数码显示器就是用来显示数字、文字或符号的器件。普遍使用的七段数字显示器发光二极管器件有发光二极管和液晶显示器。发光二极管构成的七段显示器有两种,共阴极和共阳极电路。共阴极电路中,七个发光二极管的阴极连在一起接低电平,需要某一段发光,就将相应二极管的阳极接高电平。共阳极显示器的驱动则刚好相反。
为了使数码管能显示十进制数,必须将十进制数的代码经译码器译出,然后经驱动器点亮对应的段。例如,对于8421BCD码的0011状态,对应于十进制数为3,则译码驱动应使a、b、c、d、g各段点亮。译码器的功能就是,对应于某一组数码输入,相应的几个输出端有有效信号输出。 测试实验结果:
通过调节开关输入数据0110与0011,按下F5,则数码管显示出计算09(不进位);
再次调节开关输入数据1000与1001,数码管显示计算结果17(进位); 然后随机输入0001与0010,数码管显示计算结果为3。如下图4所示:
4
EDA技术课程设计报告
图4 功能仿真图
源程序代码:
1.
BCD加法器
module BCDadder(A,B,S0,S1,clear); //定义输入模块 input [3:0]A; //考虑到A、B的值可能
//超过十进制数8,顾定义长度为4位;
input [3:0]B;
input clear; //clear为复位信号 output S0; output S1;
reg [3:0]S0; reg [3:0]S1; reg [4:0]C;
reg [4:0]T; //T为临时参数,C为进位,低位和值可能超过16,所以定义T长
度为5; reg [4:0]Z;
always @(posedge clear) //以每一次复位上升沿到来开始计算和值; begin
T=A+B; //低位相加和值赋T; if(T>9)
5
EDA技术课程设计报告 begin
Z=10; //如果低位相加有进位,则赋值Z=10; C=1; //如果T>9,则有进位,此时C=1; end else begin Z=0; C=0; end begin
S0=T-Z; //和值S0到S1赋值; S1=C; end end
endmodule
2.
输入数A、B显示
module indisplay(A,B,displayA,displayB); input [3:0]A; input [3:0]B;
output [6:0]displayA;
reg [6:0]displayA; //定义其类型为寄存器类型; reg [6:0]displayB;
always@(A or B) //当输入A 、B中任何一位变化,即执行输入显示程序; begin
case(A) //输入A显示 4'd0:displayA=7'b1000000; 4'd1:displayA=7'b1111001; 4'd2:displayA=7'b0100100; 4'd3:displayA=7'b0110000; 4'd4:displayA=7'b0011001;
output [6:0]displayB; //定义7段数码管的输出;
6
EDA技术课程设计报告 4'd5:displayA=7'b0010010; 4'd6:displayA=7'b0000010; 4'd7:displayA=7'b1011000; 4'd8:displayA=7'b0000000; 4'd9:displayA=7'b0010000;
default: displayA=7'b1000000; //默认时,数码管显示数字“0”; endcase
case(B) //输入B显示 4'd0:displayB=7'b1000000; 4'd1:displayB=7'b1111001; 4'd2:displayB=7'b0100100; 4'd3:displayB=7'b0110000; 4'd4:displayB=7'b0011001; 4'd5:displayB=7'b0010010; 4'd6:displayB=7'b0000010; 4'd7:displayB=7'b1011000; 4'd8:displayB=7'b0000000; 4'd9:displayB=7'b0010000;
default:displayB=7'b1000000; //默认时,数码管显示数字“0”; endcase end endmodule
3.
输出显示
module display(S0,S1,display1,display2); input[3:0] S0; input[3:0] S1;
output[6:0] display1; output[6:0] display2; reg[6:0] display1; reg[6:0] display2;
always @(S0 or S1 ) //当和值S中的任何一位变化,就开始执行显示程序; begin
7
EDA技术课程设计报告 case(S0) //和值第一位S0显示; 4'd0:display1=7'b1000000; 4'd1:display1=7'b1111001; 4'd2:display1=7'b0100100; 4'd3:display1=7'b0110000; 4'd4:display1=7'b0011001; 4'd5:display1=7'b0010010; 4'd6:display1=7'b0000010; 4'd7:display1=7'b1011000;
4'd8:display1=7'b0000000; //默认时,数码管显示数字“0”; 4'd9:display1=7'b0010000;
default: display1=7'b1000000; //默认时,数码管显示数字“0”; endcase
case(S1) //和值第二位S1显示; 4'd0:display2=7'b1000000; 4'd1:display2=7'b1111001; 4'd2:display2=7'b0100100; 4'd3:display2=7'b0110000; 4'd4:display2=7'b0011001; 4'd5:display2=7'b0010010; 4'd6:display2=7'b0000010; 4'd7:display2=7'b1011000; 4'd8:display2=7'b0000000; 4'd9:display2=7'b0010000;
default:display2=7'b1000000; //默认时,数码管显示数字“0”; endcase end endmodule
三、课程设计体会
通过本实验,再次熟悉Verilog HDL编程程序,对其中的case 、if else等语法运用有了更深的了解,掌握了BCD码加法器的逻辑原理,学会如何逐步分析,从而推导出程序顺序。在编辑程序时,开始时T0、T1的值是利用语
8
EDA技术课程设计报告 法assign来定义,发现这时,T就必须是wire类型数据,但这样T又无法直接做算术运算,后来调整语句,使T的赋值在always语句内出现,此时T则可直接进行算术运算。在实验时,许多语法细节仍然不完全熟悉,比如“;”的输入常常出错,这个需要加强熟悉。
四、参考文献
1.王橙非.电路与数字逻辑设计实践.南京:东南大学出版社,2002
2.康华光.《电子技术基础数字部分(第五版)》[m].高等教育出版社,
9
2005