《简单计算器设计》由会员分享,可在线阅读,更多相关《简单计算器设计(10页珍藏版)》请在金锄头文库上搜索。
1、目录第一章 设计目的及任务要求 1.1 设计目的1.2 设计任务1.3 课设要求第二章 设计思路 2.1 设计总体框图 错误!未指定书签。2.2 设计原理2.2.1 计算其原理 2.2.2 数码显示原理 2.2.3 八位数码管扫描的原理 第三章 设计源程序及分析 3.1 计算器模块3.1.1 计算器源程序 3.1.2 计算器程序分析 3.2 数码管显示部分3.2.1 数码管显示源程序 3.2.2 数码管显示程序分析 3.3 循环扫描模块3.3.1 循环扫描程序 3.3.2 循环程序分析 3.4 总程序及其分析第四章 时序仿真和结果验证 4.1 计算器时序仿真及其分析 104.2 数码管时序仿真
2、及分析4.3 总体时序仿真图4.4 结果验证第五章 心得体会 第一章 设计目的及任务要求1.1设计目的(1) 进一步加强熟练EDA基础知识。(2) 熟练掌握Quartus 6.0软件的使用以及用该软件编程和仿真的全过程。(3) 培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计 打下良好的设计基础。1.2设计任务设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进 制数,并用四位数码管显示,能够实现+、-、 *、/四种运算,其中除法的结果显示分为商和余数两部分 分别用两位数码管显示。1.3课设要求1)说明题目的设计原理和思
3、路、采用方法及设计流程。(2)系统框图、Verilog语言设计程序或原理图。3) 对各子模块的功能以及各子模块之间的关系做较详细的描述。4) 详细说明调试方法和调试过程。5) 说明测试结果:仿真时序图和结果显示图,并对其进行说明和分析第二章 设计思路2.1设计总体框图有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描 模块,输出模块以及显示模块。图一 设计总体框图2.2设计原理2.2.1 计算其原理Verilog语言中可直接用运算符+、-、*、/、来实现四则运算,系统会根据程序自动综合出相应的计 算器。分别是加法器模块,减法器模块,乘法器模块和除法器模块,
4、当程序变得正确的话则各个程序会按照 一定的步骤一步步的往下执行的。2.2.2 数码显示原理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、5”。 注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h。共阴极七段数码管的原理图如下 图二所示。图二 共阴极七段数码管2.2.3 八位数码管扫描的原理图三所示的是8位数码扫描显示电路,其中每个数码管的7个段:g、f、e、d、c、b、a都分别连在 一起,8个数码管分别由8个选通信号k1、k2、k8来选择。被选通的数码管显示数据,其余关闭。如在 某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而 其它7个数码管呈现关闭状态。根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得 8个选通信号k1、k2、k8分别被单独选通,并在此
6、同时,在段信号输入口加上希望在该对应数码管上显 示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。图三 8位数码管显示驱动电路扫描电路通过可调时钟输出片选地址SEL2.0。由SEL2.0通过3-8译码器决定了8位中的哪一 位显示,SEL2.0变化的快慢决定了扫描频率f扫的快慢。扫描频率大于人眼的分辨率时,呈现出八个 数码管同时点亮。第三章 设计源程序及分析3.1计算器模块3.1.1 计算器源程序mdule jsq(a,b,c,out);input7:0a,b;input1:0c;otput15:0out;reg 15:0out reg7:0out1,out2; always(a,b,c
7、,out) case(c) 2b00:out=a+b; 2b01:out=a-b; 2b10:out=a*b;2b11: begin out1=a/b;out2=a%b; out=out1,out2;end default:; endcase endmodule3.1.2 计算器程序分析该模块是本次设计的核心部分,用于实现四则运算,两位八位二进制数a、b作为待计算的输入,并 输入两位二进制数c作为计算功能选择,00代表加法运算、01代表减法运算、10代表乘法运算、11代表 除法运算。输出16位二进制数out位运算结果。并在总体设计中把输入、输出端接到数码管上。3.2 数码管显示部分3.2.1
8、数码管显示源程序module DECL7S (A, LED7S); input 3:0 A;output 6:0 LED7S;reg 6:0 LED7S;always (A)begincase(A)4b0000 : LED7S=7b0111111;4b0001: LED7S = 7b0000110 ;4b0010: LED7S = 7b1011011;4b0011: LED7S = 7b1001111;4b0100: LED7S = 7b1100110 ;4b0101: LED7S = 7b1101101;4b0110: LED7S = 7b1111101 ;4b0111: LED7S = 7
9、b0000111 ;4b1000: LED7S = 7b1111111 ;4b1001: LED7S = 7b1101111 ;4b1010: LED7S = 7b1110111 ;4b1011: LED7S = 7b1111100 ;4b1100: LED7S = 7b0111001 ;4b1101: LED7S = 7b1011110 ;4b1110: LED7S = 7b1111001 ;4b1111: LED7S = 7b1110001 ;endcaseendendmodule3.2.2 数码管显示程序分析该模块是整个设计中的显示部分,是一个编码器组合逻辑设计,每个数码管可显示十六进制
10、0至 F, 对应4位二进制数,因此输入端a、b分别用两个数码管显示,输出out用四个数码管显示,该设计中需 要八个同样的数码管显示器,即。此模块将在总程序中被调用八次。3.3 循环扫描模块3.3.1 循环扫描程序modulexhsm(clk,rst,count,Dout);inputclk,rst;output6:0Dout;output2:0count;reg6:0Dout;reg2:0count;always(posedge clk or negedge rst)beginif(!rst)count=3b000;else if(count=3b111)count=3b000;elsecou
11、nt=count+3b001;endalways(posedge clk)begincase(count)3b000: Dout=LED7S1;3b001:Dout=LED7S2;3b010:Dout=LED7S3;3b011:Dout=LED7S4;3b100: Dout=LED7S5;3b101:Dout=LED7S6;3b110:Dout=LED7S7;3b111:Dout=LED7S8;endcaseendendmodule3.3.2 循环程序分析该模块是一个循环计数器,在时钟和复位信号的控制下,从 000111 循环计数分别控制八个数码管 循环点亮,由于时钟的频率比较快,大于人眼的分
12、辨率,所以显示出八个数码管同时点亮,即同时显示计 算器的输入、输出。3.4 总程序及其分析module jsq9(a,b,c,Dout,count,clk,rst);input7:0a,b;input clk,rst;input1:0c; output6:0Dout;output 2:0count;reg6:0Dout; reg2:0count;reg15:0out;reg6:0 LED7S1,LED7S2,LED7S3,LED7S4, LED7S5,LED7S6,LED7S7,LED7S8;DECL7S u1(.A(a7:4) , .LED7S(LED7S1);DECL7S u2(.A(a3
13、:0) , .LED7S(LED7S2);DECL7S u3(.A(b7:4) , .LED7S(LED7S3);DECL7S u4(.A(b3:0) , .LED7S(LED7S4);DECL7S u5(.A(out15:12) , .LED7S(LED7S5);DECL7S u6(.A(out11:8) , .LED7S(LED7S6);DECL7S u7(.A(out7:4) , .LED7S(LED7S7); DECL7S u8(.A(out3:0) , .LED7S(LED7S8); reg7:0out1,out2;always(a,b,c,Dout,count,clk,rst) c
14、ase(c) 2b00:out=a+b;2b01:out=a-b; 2b10:out=a*b; 2b11: begin out1=a/b;out2=a%b; out=out1,out2;end default:; endcase always(posedge clk or negedge rst) begin if(!rst) count=3b000;else if(count=3b111) count=3b000;else count=count+3b001;end always(posedge clk) begin case(count) 3b000: Dout=LED7S1; 3b001:Dout=LED7S2; 3b010:Dout=LED7S3; 3b011:Dout=LED7S4; 3b100: Dout=LED7S5; 3b101:Dout=LED7S6; 3b110:Dout=LED7S7; 3b111:Dout=LED7S8; endcase end endmodule module DECL7S (A, LED7S);input 3:0 A;output 6:0 LED7S;reg 6:0 LED7S;always (A)begincase(A)4b0000