VerilogHDL简单计算器设计.docx
- 文档编号:28136512
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:12
- 大小:20.14KB
VerilogHDL简单计算器设计.docx
《VerilogHDL简单计算器设计.docx》由会员分享,可在线阅读,更多相关《VerilogHDL简单计算器设计.docx(12页珍藏版)》请在冰豆网上搜索。
VerilogHDL简单计算器设计
第一章设计目的及任务要求
1.1设计目的
〔1〕进一步加强熟练EDA根底知识。
〔2〕熟练掌握Quartus6.0软件的使用以及用该软件编程和仿真的全过程。
〔3〕培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计打下良好的设计根底。
1.2设计任务
设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、*、/四种运算,其中除法的结果显示分为商和余数两局部,分别用两位数码管显示。
1.3课设要求
〔1〕说明题目的设计原理和思路、采用方法及设计流程。
〔2〕系统框图、Verilog语言设计程序或原理图。
〔3〕对各子模块的功能以及各子模块之间的关系做较详细的描述。
〔4〕详细说明调试方法和调试过程。
〔5〕说明测试结果:
仿真时序图和结果显示图,并对其进展说明和分析。
第二章设计思路
2.1设计总体框图
有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描模块,输出模块以及显示模块。
图一设计总体框图
2.2设计原理
2.2.1计算其原理
Verilog语言中可直接用运算符+、-、*、/、%来实现四则运算,系统会根据程序自动综合出相应的计算器。
分别是加法器模块,减法器模块,乘法器模块和除法器模块,当程序变得正确的话则各个程序会按照一定的步骤一步步的往下执行的。
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”。
注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段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分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。
图三8位数码管显示驱动电路
扫描电路通过可调时钟输出片选地址SEL[2..0]。
由SEL[2..0]通过3-8译码器决定了8位中的哪一位显示,SEL[2..0]变化的快慢决定了扫描频率f扫描的快慢。
扫描频率大于人眼的分辨率时,呈现出八个数码管同时点亮。
第三章设计源程序及分析
3.1计算器模块
3.1.1计算器源程序
mdulejsq(a,b,c,out);
input[7:
0]a,b;
input[1:
0]c;
otput[15:
0]out;
reg[15:
0]out
reg[7:
0]out1,out2;
always(a,b,c,out)
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
endmodule
3.1.2计算器程序分析
该模块是本次设计的核心局部,用于实现四则运算,两位八位二进制数a、b作为待计算的输入,并输入两位二进制数c作为计算功能选择,00代表加法运算、01代表减法运算、10代表乘法运算、11代表除法运算。
输出16位二进制数out位运算结果。
并在总体设计中把输入、输出端接到数码管上。
3.2数码管显示局部
3.2.1数码管显示源程序
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.2.2数码管显示程序分析
该模块是整个设计中的显示局部,是一个编码器组合逻辑设计,每个数码管可显示十六进制0至F,对应4位二进制数,因此输入端a、b分别用两个数码管显示,输出out用四个数码管显示,该设计中需要八个同样的数码管显示器,即。
此模块将在总程序中被调用八次。
3.3循环扫描模块
3.3.1循环扫描程序
module*hsm(clk,rst,count,Dout);
inputclk,rst;
output[6:
0]Dout;
output[2:
0]count;
reg[6:
0]Dout;
reg[2:
0]count;
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循环程序分析
该模块是一个循环计数器,在时钟和复位信号的控制下,从000—111循环计数分别控制八个数码管循环点亮,由于时钟的频率比较快,大于人眼的分辨率,所以显示出八个数码管同时点亮,即同时显示计算器的输入、输出。
3.4总程序及其分析
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
该程序是本次设计的最终程序,主要是将以上三个模块联系起来。
其中反复调用数码管显示模块,将其与计算器模块相连。
其输入A在u1中与计算器输入a的高四位相连,输出LED7S与LED7S1相连,在硬件上实现用一个数码管显示输入a的高四位,以此类推u2模块实现用数码管显示a的低四位,u3对应b的高四位,u4对应b的第四位,u5对应out的高四位,u6对应out次高四位,u7对应out的次低四位,u8对应out的低四位。
循环计数器模块,与八个数码管显示模块相连,当输出count为*一确定时,将不同数码管的输出赋给程序的总输出Dout点亮相应的数码管,例如当count=3‘b000时,LED7S1赋给Dout,此时试验箱是对应输入a的高四位的数码管被点亮。
通过以上连接该程序实现了输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、*、/四种运算,其中除法的结果显示分为商和余数两局部,分别用两位数码管显示的设计要求。
第四章时序仿真和结果验证
4.1计算器时序仿真及其分析
图四计算器时序仿真图
如图四所示为计算器的实序仿真图,当输入a为00000001、b为00000001、c为01时输出out为00000即1-1=0;当输入a=00000010,b=00000010,c=10时输出out=00100.即2*2=4,当输入a=00000011,b=00000011,c=11时输出out1=00000001,out2=00000000,即3/3=1余数为0当输入a=00000100,b=00000100,c=00时输出out=00001000即4+4=8.经此验证分析证明此计算器计算准确无误。
模块设计成功。
4.2数码管时序仿真及分析
图五数码管时序仿真图
如图五所示为数码管显示器的时序仿真波形,当输入为0011时七段数码管中abcdefg的上下电平分别为1111001即abcdg点亮显示数字3,当输入为0000时七段数码管对应显示1111110即abcdef被点亮显示数字0.经历证其他数字显示均正确,七段数码管显示器模块设计仿真成功。
4.3总体时序仿真图
图六所示为整个设计的仿真波形图,对其分析如下,首先分析最下边三行的循环计数器局部,当复位信号为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,正确。
经历证,其他数码管显示与相应的输入也是一一对应,因此时序仿真成功。
图六总体时序仿真图
4.4结果验证
如以下图所示在试验箱中输入a=00000010,b=00001100,c=00即显示如下结果:
02+0C=000E,即2+12=14,验证结果正确
图七结果验证图
第五章心得体会
为期五天的EDA课程设计很快就完毕了,原则上是必须独立完成这次课程设计的,但是由于平时学习的理论知识不够扎实,所以在课程设计环节遇到了很多困难。
遇到困难不可怕,关键是要专心的去学习,研究,最终在教师和同学的大力帮助之下我还是顺利里的完成了课程设计的所有内容。
现在回过头来想想这次的课设给我本人还是带来了很多的收获。
首先,通过本次课程设计,我对EDA这门课程有了更深入的体会和了解,也加深了我在理论课堂和实验课程中所学知识的理解,从拿到题目开场,就分析完成这样的设计需要用到哪些模块,这些模块根本上都是课上讲过的,关键是怎样把他们连接起来,构思好之后就要分模块写程序,在软件上编译、仿真以及搭接电路实现他的功能。
其次,通过这次课设也然我认识到了自己的缺乏之处---知识的运用能力太差经了。
课程设计是在强硬的理论根底上进展的,在上理论课的时候觉得自己的理论知识学习的还可以,刚开场觉得有了过硬的理论知识再来做课设那是很简单的事情,然而当自己真正的动手做起来的时候缺老感觉力不从心,感觉理论课上学习的知识一无是处,处处碰壁。
后来分析才知道是自己的能力了太差,不能联系理论与实际。
所以在以后的学习和生活过程一定要注意这方面的锻炼。
最后,这次的课设让我认识到了坚持精神的可贵之处。
由于本人没有把EDA课程的里路知识学习的很扎实,所以在整个过程中遇到了许多的难处,一次次的打击让我对本次课设失去了信心,正在这时候,我的以为要好的朋友抚慰我说,没事的,自己尽量的做,做到多少是多少,不行的话他还可以是不是的帮助我一下。
就是这样,我在教师和朋友的帮助和耐心的辅导下顺利的完成了课程设计的整个过程。
这次是大学四年里最后一次课程设计了,这次课程设计的经历我将永远记住,也算是明年毕业设计前的一次热身吧。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VerilogHDL 简单 计算器 设计