《VerilogHDL简单计算器设计.pdf》由会员分享,可在线阅读,更多相关《VerilogHDL简单计算器设计.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录 第一章 设计目的及任务要求 .错.误!.未.定义书签 设计目的.错误!未定义书签 设计任务.错误!未定义书签 课设要求.错误!未定义书签 第二章 设计思路 .错误!未定义书签 设计总体框图.错误!未定义书签 设计原理.错误!未定义书签 计算其原理 .错 误!未定义书签 数码显示原理 .错 误!未定义书签 八位数码管扫描的原理 .错 误!未定义书签 第三章 设计源程序及分析 .错误!未定义书签 计算器模块.错误!未定义书签 计算器源程序 .错 误!未定义书签 计算器程序分析 .错 误!未定义书签 数码管显示部分 .错.误!.未 定.义书签 数码管显示源程序 .错.误!.未.定.义书签 数码
2、管显示程序分析 .错 误.!.未.定义书签 循环扫描模块 .错.误!.未 定.义书签 循环扫描程序 .错 误.!.未.定.义书签 循环程序分析 .错 误.!.未.定.义书签 总程序及其分析 .错.误!.未 定.义书签 第四章 时序仿真和结果验证 .错.误!.未.定义书签 计算器时序仿真及其分析 .错 误!.未.定义书签 数码管时序仿真及分析 .错 误!.未.定.义书签 总体时序仿真图 .错 误!.未 定.义书签 结果验证 .错 误!.未 定.义.书签 第五章 心得体会 .错 误.!.未 定.义书签第一章 设计目的及任务要求 设计目的(1)进一步加强熟练 EDA 基础知识。(2)熟练掌握 Qua
3、rtus 软件的使用以及用该软件编程和仿真的全过程。(3)培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计 打下良好的设计基础。设计任务 设计一个简单计算器,输入为 8 位二进制数,分别用两位数码管显示,输出的计算结果为 16 位二进 制数,并用四位数码管显示,能够实现+、-、*、/四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。课设要求 1)说明题目的设计原理和思路、采用方法及设计流程。2)系统框图、Verilog 语言设计程序或原理图。3)对各子模块的功能以及各子模块之间的关系做较详细的描述。4)详细说明调试方法和调试过程。5)说
4、明测试结果:仿真时序图和结果显示图,并对其进行说明和分析。第二章 设计思路 设计总体框图 有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描 模块,输出模块以及显示模块。图一 设计总体框图 设计原理 计算其原理 Verilog 语言中可直接用运算符+、-、*、/、%来实现四则运算,系统会根据程序自动综合出相应的计 算器。分别是加法器模块,减法器模块,乘法器模块和除法器模块,当程序变得正确的话则各个程序会按照 一定的步骤一步步的往下执行的。数码显示原理 7 段数码是纯组合电路,通常的小规模专用 IC,如 74 或 4000 系列的器件只能作十进制 BCD 码
5、译码,然而数字系统中的数据处理和运算都是 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”。注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段 h。共阴极七段数码管的原理图如下 图二所示。图二 共阴极七段数码管 八位数码
6、管扫描的原理 图三所示的是 8 位数码扫描显示电路,其中每个数码管的 7 个段:g、f、e、d、c、b、a 都分别连在 一起,8个数码管分别由 8 个选通信号 k1、k2、k8 来选择。被选通的数码管显示数据,其余关闭。如在 某一时刻,k3 为高电平,其余选通信号为低电平,这时仅 k3 对应的数码管显示来自段信号端的数据,而 其它 7 个数码管呈现关闭状态。根据这种电路状况,如果希望在 8 个数码管显示希望的数据,就必须使得 8 个选通信号 k1、k2、k8 分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显 示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。图三 8
7、 位数码管显示驱动电路 扫描电路通过可调时钟输出片选地址 SEL2.0。由 SEL2.0 通过 3-8 译码器决定了 8 位中的哪一位显 示,SEL2.0变化的快慢决定了扫描频率 f 扫描的快慢。扫描频率大于人眼的分辨率时,呈现出八个数码管 同时点亮。第三章 设计源程序及分析 计算器模块 计算器源程序 mdule jsq(a,b,c,out);input7:0a,b;input1:0c;otput15:0out;reg 15:0out reg7:0out1,out2;always(a,b,c,out)case(c)2b00:out=a+b;2b01:out=a-b;2b10:out=a*b;2
8、b11:begin out1=a/b;out2=a%b;out=out1,out2;end default:;endcase endmodule计算器程序分析 该模块是本次设计的核心部分,用于实现四则运算,两位八位二进制数 a、b 作为待计算的输入,并 输入两位二进制数 c 作为计算功能选择,00 代表加法运算、01 代表减法运算、10 代表乘法运算、11 代表 除法运算。输出 16 位二进制数 out 位运算结果。并在总体设计中把输入、输出端接到数码管上。数码管显示部分 数码管显示源程序 module DECL7S(A,LED7S);input 3:0 A;output 6:0 LED7S;
9、reg 6:0 LED7S;always(A)begin case(A)4b0000:LED7S=7b0111111;4b0001:LED7S=7b0000110;4b0010:LED7S=7b1011011;4b0011:LED7S=7b1001111;4b0100:LED7S=7b1100110;4b0101:LED7S=7b1101101;4b0110:LED7S=7b1111101;4b0111:LED7S=7b0000111;4b1000:LED7S=7b1111111;4b1001:LED7S=7b1101111;4b1010:LED7S=7b1110111;4b1011:LED7
10、S=7b1111100;4b1100:LED7S=7b0111001;4b1101:LED7S=7b1011110;4b1110:LED7S=7b1111001;4b1111:LED7S=7b1110001;endcase end endmodule数码管显示程序分析 该模块是整个设计中的显示部分,是一个编码器组合逻辑设计,每个数码管可显示十六进制 0 至 F,对应 4 位二进制数,因此输入端 a、b 分别用两个数码管显示,输出 out 用四个数码管显示,该设计中需 要八个同样的数码管显示器,即。此模块将在总程序中被调用八次。循环扫描模块 循环扫描程序 modulexhsm(clk,rst,c
11、ount,Dout);inputclk,rst;output6:0Dout;output2:0count;reg6:0Dout;reg2:0count;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=LED7
12、S4;3b100:Dout=LED7S5;3b101:Dout=LED7S6;3b110:Dout=LED7S7;3b111:Dout=LED7S8;endcase end endmodule 循环程序分析 该模块是一个循环计数器,在时钟和复位信号的控制下,从 000 111 循环计数分别控制八个数码管 循环点亮,由于时钟的频率比较快,大于人眼的分辨率,所以显示出八个数码管同时点亮,即同时显示计 算器的输入、输出。总程序及其分析 module jsq9(a,b,c,Dout,count,clk,rst);input7:0a,b;input clk,rst;input1:0c;output6:0
13、Dout;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: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 u
14、6(.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)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 always(posedge clk or negedge begin if(!r
15、st)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);i
16、nput 3:0 A;output 6:0 LED7S;reg 6:0 LED7S;always(A)begin case(A)4b0000:LED7S=7b0111111;4b0001:LED7S=7b0000110;4b0010:LED7S=7b1011011;4b0011:LED7S=7b1001111;4b0100:LED7S=7b1100110;4b0101:LED7S=7b1101101;4b0110:LED7S=7b1111101;4b0111:LED7S=7b0000111;4b1000:LED7S=7b1111111;4b1001:LED7S=7b1101111;4b1010
17、:LED7S=7b1110111;4b1011:LED7S=7b1111100;4b1100:LED7S=7b0111001;4b1101:LED7S=7b1011110;4b1110:LED7S=7b1111001;4b1111:LED7S=7b1110001;endcase end endmodule 该程序是本次设计的最终程序,主要是将以上三个模块联系起来。其中反复调用数码管显示模块,将其与计算器模块相连。其输入 A 在 u1 中与计算器输入 a 的高四位 相连,输出LED7S 与 LED7S1 相连,在硬件上实现用一个数码管显示输入 a 的高四位,以此类推 u2 模块 实现用数码管显示
18、 a 的低四位,u3 对应 b 的高四位,u4 对应 b 的第四位,u5 对应 out 的高四位,u6 对 应 out 次高四位,u7 对应 out 的次低四位,u8 对应 out 的低四位。循环计数器模块,与八个数码管显示模块相连,当输出 count 为某一确定时,将不同数码管的输出赋 给程序的总输出 Dout 点亮相应的数码管,例如当 count=3 b000 时,LED7S1 赋给 Dout,此时试验箱是对 应输入 a 的高四位的数码管被点亮。通过以上连接该程序实现了输入为 8 位二进制数,分别用两位数码管显示,输出的计算结果为 16 位二 进制数,并用四位数码管显示,能够实现+、-、*
19、、/四种运算,其中除法的结果显示分为商和余数两部 分,分别用两位数码管显示的设计要求。rst)第四章 时序仿真和结果验证 计算器时序仿真及其分析 图四 计算器时序仿真图 如图四所示为计算器的实序仿真图,当输入 a 为 00000001、b 为 00000001、c 为 01 时输出 out 为 0000000000000000 即 1-1=0;当输入 a=00000010,b=00000010,c=10 时输出 out=0000000000000100.即 2*2=4,当输入 a=00000011,b=00000011,c=11 时输出 out1=00000001,out2=00000000,
20、即 3/3=1 余数为 0 当输入 a=00000100,b=00000100,c=00 时输出 out=00001000 即 4+4=8.经此验证分析证明此 计算器计算准确无误。模块设计成功。数码管时序仿真及分析 图五 数码管时序仿真图 如图五所示为数码管显示器的时序仿真波形,当输入为 0011 时七段数码管中 abcdefg 的高低电平分 别为 1111001 即 abcdg 点亮显示数字 3,当输入为 0000 时七段数码管对应显示 1111110 即 abcdef 被点亮 显示数字 0.经验证其他数字显示均正确,七段数码管显示器模块设计仿真成功。总体时序仿真图 图六所示为整个设计的仿真
21、波形图,对其分析如下,首先分析最下边三行的循环计数器部分,当复位 信号为 0 时 count 计为 000 当复位为 1 每当时钟上升沿来临时 count 加 1,计满后恢复 000 继续循环,此 部分验证成功。接下来看控制显示部分,输入 a=00000000,b=00000000,c=00,当 count=000 时显示 a 的高四位 0000,Dout=01111111,显示数字 0;正确。当 count=001 时显示 a 的低四位 0000,Dout=01111111,显示数字 0,正确。经验证,其他数码管显示与相应的输入也是一一对应,因此时序仿真成功。图六总体时序仿真图 结果验证 如
22、下图所示在试验箱中输入 a=00000010,b=00001100,c=00 即显示如下结果:02+0C=000E,即 2+12=14,验证结果正确 00031 nr ncl J L u c 1 图七结果验证图 第五章心得体会 为期五天的 EDA 课程设计很快就结束了,原则上是必须独立完成这次课程设计的,但是由于平时学习 的理论知识不够扎实,所以在课程设计环节遇到了很多困难。遇到困难不可怕,关键是要专心的去学习,研究,最终在老师和同学的大力帮助之下我还是顺利里的完成了课程设计的所有内容。现在回过头来想想 这次的课设给我本人还是带来了很多的收获。首先,通过本次课程设计,我对 EDA 这门课程有了
23、更深入的体会和了解,也加深了我在理论课堂和实 验课程中所学知识的理解,从拿到题目开始,就分析完成这样的设计需要用到哪些模块,这些模块基本上 都是课上讲过的,关键是怎样把他们连接起来,构思好之后就要分模块写程序,在软件上编译、仿真以及 搭接电路实现他的功能。其次,通过这次课设也然我认识到了自己的不足之处-知识的运用能力太差经了。课程设计是在强 硬的理论基础上进行的,在上理论课的时候觉得自己的理论知识学习的还可以,刚开始觉得有了过硬的理 论知识再来做课设那是很简单的事情,然而当自己真正的动手做起来的时候缺老感觉力不从心,感觉理论 课上学习的知识一无是处,处处碰壁。后来分析才知道是自己的能力了太差,不能联系理论与实际。所以 在以后的学习和生活过程一定要注意这方面的锻炼。最后,这次的课设让我认识到了坚持精神的可贵之处。由于本人没有把 EDA 课程的里路知识学习的很 扎实,所以在整个过程中遇到了许多的难处,一次次的打击让我对本次课设失去了信心,正在这时候,我 的以为要好的朋友安慰我说,没事的,自己尽量的做,做到多少是多少,不行的话他还可以是不是的帮助 我一下。就是这样,我在老师和朋友的帮助和耐心的辅导下顺利的完成了课程设计的整个过程。这次是大 学四年里最后一次课程设计了,这次课程设计的经验我将永远记住,也算是明年毕业设计前的一次热身吧。
限制150内