简单计算器eda设计最终打印版.docx
《简单计算器eda设计最终打印版.docx》由会员分享,可在线阅读,更多相关《简单计算器eda设计最终打印版.docx(16页珍藏版)》请在冰豆网上搜索。
简单计算器eda设计最终打印版
第一章设计原理
1.1课程设计依据
在掌握常用数字电路功能和原理的基础上,根据EDA技术课程所学知识,利用硬件描述语言VerilogHDL、EDA软件QuartusII和硬件平台Cyclone/CycloneIIFPGA进行电路系统的设计。
1.2课程设计内容及原理
设计一个简单计算器,采用简单4*4计算器键盘,输入2位十进制数进行+、-、*、/四种运算,输入数据分别用两位数码管显示,输出用四位数码管显示4位10进制数,其中除法的结果显示分为商和余数两部分,要求采用时序逻辑设计实现计算器功能。
为了完成要求的效果显示,我先设计了一个简单的四则运算器,为了使其结果能清楚的看到,所以计算器模块和一个7段数码管模块连接。
实验要求,输入分别用两位数码管显示,输出用四位数码管显示,所以用一个3—8译码器和数码管连接,通过开关控制,形成动态显示。
从左向右,依次是第一位数码管显示a的高四位,第二位数码管显示a的低四位;第三位数码管显示b的高四位,第四位数码管显示b的低四位;第五位数码管到第八位数码管显示输出的结果。
通过改变时钟,使其看起来像同时显示在数码管上。
1.3课程设计要求
1、要求每个同学独立完成设计任务。
2、课程设计说明书封面格式要求见《天津城市建设学院课程设计教学规范》附表1。
3、课程设计的说明书要求简洁、通顺,计算正确,图纸表达内容完整、清楚、规范。
4、测试要求:
根据题目的特点,采用相应的时序仿真或者在实验系统上观察结果。
5、课程设计说明书要求:
●说明题目的设计原理和思路、采用方法及设计流程。
●系统框图、Verilog语言设计程序或原理图。
●对各子模块的功能以及各子模块之间的关系做较详细的描述。
●详细说明调试方法和调试过程。
●说明测试结果:
仿真时序图和结果显示图,并对其进行说明和分析
第二章设计流程
2.1设计流程图
设计流程如下图,分别用两个数码管表示二位十进制数,用一个case语句表示输入数值采用哪种运算方式,分别用00,01,10,11表示加、减、乘、除。
首先对运算符号进行选择,然后再在各自模块进行计算,用3—8译码器选择从哪个数码管输出。
图1硬件设计流程图
图2输出结果A.B的软件流程图
2.2LED灯接线部分显示
7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。
设计7段译码器,输出信号LED7S的7位分别接如图一数码管的7个段,高位在左,低位在右。
例如当LED7S输出为“1101101”时,数码管的7个段:
g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。
注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段dp。
LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。
A、静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位*器*进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5×8=40根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。
故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。
B、动态显示驱动:
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。
第三章模块连接
3.1四选一多路器
3.1.1多路器程序设计
通过对四选一多路器设计,对计算器的运算符“+”,“-”,“*”,“/”进行选择
程序如下:
modulejsq(a,b,c,out,out1,out2);
input[7:
0]a,b;
input[1:
0]c;
output[15:
0]out;
output[7:
0]out1,out2;
reg[15:
0]out;
reg[7:
0]out1,out2;
always@(a,b,c,out)
case(c)
2'b00:
begin
out1=0;
out2=0;
out=a+b;
end
2'b01:
begin
out1=0;
out2=0;
out=a-b;
end
2'b10:
begin
out1=0;
out2=0;
out=a*b;
end
2'b11:
begin
out1=a/b;
out2=a%b;
out={out1,out2};
end
default:
;
endcase
endmodule
3.1.2四选一多路器仿真图
在软件QuartusII中输入程序,进行仿真
四选一多路器仿真图如下:
图3四选一多路器仿真图
3.1.3四选一多路器仿真波形分析
如图3所示为计四选一多路器的实序仿真图,当输入a为1、b为1、c为00时输出out为2即1+1=2;当输入a=5,b=4,c=01时输出out=1.即5-4=1,当输入a=9,b=6,c=10时输出out=54,即9*6=54,当输入a=12,b=8,c=11时输出out1=1,out2=4,即商为12/8=1,余数为12%8=4.经此验证分析证明此计算器计算准确无误。
模块设计成功。
3.27段数码管显示
3.2.1数码管程序设计
程序如下:
moduleDECS7S(A,LED7S);
input[3:
0]A;
output[6:
0]LED7S;
reg[6:
0]LED7S;
always@(A)
begin
case(A)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
4'b1010:
LED7S<=7'b1110111;
4'b1011:
LED7S<=7'b1111100;
4'b1100:
LED7S<=7'b0111001;
4'b1101:
LED7S<=7'b1011110;
4'b1110:
LED7S<=7'b1111001;
4'b1111:
LED7S<=7'b1110001;
endcase
end
endmodule
3.2.2数码管仿真图
在QuartusII中输入程序,进行波形仿真。
数码管仿真图如下图所示:
图4数码管仿真图
3.2.2数码管仿真图分析
如图4所示为数码管显示器的时序仿真波形,当输入为2时七段数码管中abcdefg的高低电平分别为1011011即abcdg点亮显示数字2,当输入为4时七段数码管对应显示1100110即abcdef被点亮显示数字4.经验证其他数字显示均正确,七段数码管显示器模块设计仿真成功
3.3循环扫描模块
3.3.1循环扫描程序
程序如下:
modulexhsm(clk,rst,count,Dout);
inputclk,rst;
output[6:
0]Dout;
output[2:
0]count;
reg[6:
0]Dout;
reg[2:
0]count;
reg[6:
0]LED7S1,LED7S2,LED7S3,LED7S4,LED7S5,LED7S6,LED7S7,LED7S8;
always@(posedgeclkornegedgerst)
begin
if(!
rst)
count<=3'b000;
elseif(count==3'b111)
count<=3'b000;
else
count<=count+3'b001;
end
always@(posedgeclk)
begin
case(count)
3'b000:
Dout<=LED7S1;
3'b001:
Dout<=LED7S2;
3'b010:
Dout<=LED7S3;
3'b011:
Dout<=LED7S4;
3'b100:
Dout<=LED7S5;
3'b101:
Dout<=LED7S6;
3'b110:
Dout<=LED7S7;
3'b111:
Dout<=LED7S8;
endcase
end
endmodule
3.3.2循环扫描仿真图
在软件QuartusII中输入程序,对程序进行仿真。
循环扫描仿真图如下图所示:
图5循环扫描仿真图
3.3.3循环扫描模块分析
如图5所示为循环扫描时序仿真波形,该模块是一个循环扫描计数器,在时钟和复位信号的控制下,从000—111循环计数分别控制八个数码管循环点亮,由于时钟的频率比较快,大于人眼的分辨率,所以显示出八个数码管同时点亮,即同时显示计算器的输入、输出。
3.4简易计算器总体程序设计
3.4.1简单计算器程序设计
程序如下:
modulejsq9(a,b,c,Dout,count,clk,rst);
input[7:
0]a,b;
inputclk,rst;
input[1:
0]c;
output[6:
0]Dout;
output[2:
0]count;
reg[6:
0]Dout;
reg[2:
0]count;
reg[15:
0]out;
reg[6:
0]LED7S1,LED7S2,LED7S3,LED7S4,LED7S5,LED7S6,LED7S7,LED7S8;
DECL7Su1(.A(a[7:
4]),.LED7S(LED7S1));
DECL7Su2(.A(a[3:
0]),.LED7S(LED7S2));
DECL7Su3(.A(b[7:
4]),.LED7S(LED7S3));
DECL7Su4(.A(b[3:
0]),.LED7S(LED7S4));
DECL7Su5(.A(out[15:
12]),.LED7S(LED7S5));
DECL7Su6(.A(out[11:
8]),.LED7S(LED7S6));
DECL7Su7(.A(out[7:
4]),.LED7S(LED7S7));
DECL7Su8(.A(out[3:
0]),.LED7S(LED7S8));
reg[7:
0]out1,out2;
always@(a,b,c,Dout,count,clk,rst)
case(c)
2'b00:
out=a+b;
2'b01:
out=a-b;
2'b10:
out=a*b;
2'b11:
begin
out1=a/b;
out2=a%b;
out={out1,out2};
end
default:
;
endcase
always@(posedgeclkornegedgerst)
begin
if(!
rst)
count<=3'b000;
elseif(count==3'b111)
count<=3'b000;
else
count<=count+3'b001;
end
always@(posedgeclk)
begin
case(count)
3'b000:
Dout<=LED7S1;
3'b001:
Dout<=LED7S2;
3'b010:
Dout<=LED7S3;
3'b011:
Dout<=LED7S4;
3'b100:
Dout<=LED7S5;
3'b101:
Dout<=LED7S6;
3'b110:
Dout<=LED7S7;
3'b111:
Dout<=LED7S8;
endcase
end
endmodule
moduleDECL7S(A,LED7S);
input[3:
0]A;
output[6:
0]LED7S;
reg[6:
0]LED7S;
always@(A)
begin
case(A)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
4'b1010:
LED7S<=7'b1110111;
4'b1011:
LED7S<=7'b1111100;
4'b1100:
LED7S<=7'b0111001;
4'b1101:
LED7S<=7'b1011110;
4'b1110:
LED7S<=7'b1111001;
4'b1111:
LED7S<=7'b1110001;
endcase
end
endmodule
3.4.2简单计算器总体仿真图
在软件QuartusII中输入程序,进行仿真。
计算器总体设计仿真图如下:
图6总体设计仿真图
3.4.3简单计算器仿真图设计分析
如图6所示为简易计算器总体设计仿真波形,设计一个四选一多路器,当c为00时,为加法,c为01时,为减法;c为10时,为乘法;c为11时,为除法。
如图,在rst为低电平时,输出延迟,当rst为高电平后,在clk上升沿时,a为00000000,b为00000000,c为00,数码管1表示a的高四位,数码管2表示a的低四位,数码管3表示b的高四位,数码管4表示b的低四位,数码管5到数码管8表示输出Dout。
依次类推,可以看出,仿真出来的时序图是正确的。
第四章设计体会
通过本次课程设计让我对简易计算器有了更加深刻的了解,加深了对课本知识的了解。
在一开始看到这个题时,自我感觉很简单,但是当我真正开始做的时候,感觉很茫然,不知从何下手。
最后自己在网上找到了一些关于计算器的程序和数码管的程序进行理解和分析,把思路理清楚了,一步一步地分析,并在书上查找自己不理解的一些问题,自己也在图书馆借了关于这方面的书,来巩固一下在这方面的知识,帮我更好地理解问题。
而且把这几模块知识更好的融合在一起了,弥补了上课理论知识学习的的不足和实验的欠缺,便于以后的学习。
在本次课设中,主要运用了QuartusII软件,今年我们学习了这个软件,但是学习的不是很深,通过这次的学习,我又进一步熟悉了这个软件,并且对一些不是很理解的程序,通过自己查阅资料,现在可以熟悉的掌握了,这个软件的重要性体现在模块设计、程序设计、仿真时间的设计等方面,在仿真时间的设置上一定要注意延时的问题,在这个问题上自己花了很长的时间,就是由于时间没有设计合理,在最终慢慢调试中和对实验的总结,最终仿真出来了正确的仿真图。
通过本次课设,巩固了对课本知识点的学习,同时加强了软件QuartusII编程在EDA设计系统中的应用。
让我学到了只有把所学知识与实践结合起来才能有更高的突破,而且我还要掌握与专业相关软件的使用方法,增强了我的专业技能。
参考文献
[1]潘松,黄继业等.EDA技术实用教程——VerilogHDL(第四版).科学出版社,2010.
[2]潘松,黄继业.EDA技术实用教程——(第三版).科学出版社,2006.
[3]王松武,于鑫,武思军.电子创新设计与实践.北京:
国防工业出版社.2005
[4]孙延鹏,张芝贤,尹常永.VHDL与可编程逻辑器件应用.北京:
航空工业出版社.2006
[5]曹昕燕,周凤臣,聂春燕.EDA技术与课程设计.北京:
清华大学出版社.2006