资源描述
EDA课程设计报告
数字跑表
学院:机械与电子工程学院
专业:电子科学与技术
学号:1020630208
姓名:熊 ……
一:设计目的:
(1)学会利用QuartusⅡ发热宏单元和所学的数字电路知识,搭建复杂一点的数字电路或系统。
(2)学会使用EDA的程序语言FPGA/CPLD设计数字跑表,设计主要包括功能分析、方案设计和电路测试几个步骤。
二:设计内容:
1.设计一个数字跑表,具有如下功能。
(1)复位和暂停,秒表计时等功能。
(2)跑表计时长度可达1小时,计时精度为0.01 秒。
(3)通过6位数码管分别显示跑表的分、秒和百分秒。
控制端
取值
功能
复位(clr)
1
异步清零
0
计数
计数/暂停键(pause)
1
暂停
0
计数
2.方案论证:
数字跑表设三个输入端,分别为时钟输入(CLK),复位(CLR),启动、暂停按键(PUSE)。复位信号高电平有效,可对跑表异步清零;当启动、暂停键为低电平时跑表开始计时,为高电平时暂停,变低后在原来的数值基础上继续计数。数字跑表的结构示意图如下:
图2-1跑表示意图
3.模块电路设计:
数字跑表实际上为计数器,数据选择器,七段数码管译码器等模块构成,核心模块应为计数器,其次为暂停控制和清零控制。
计时电路
计时电路又分为百分秒计时电路、秒计时电路和分计时电路三个模块。百分秒计时电路是一个100进制的计数器,以100Hz输入信号作为计数时钟,其进位信号作为秒计数电路的计数时钟,当秒计数器计满时,产生的进位信号又作为分计数电路的计数时钟。电路的暂停和复位信号用于控制计时的开始、停止和清零。
计数器模块:数字跑表的计时器功能是,当PAUSE为低电平时开始计数,百分秒低位自加一,加到九时归零,百分秒高位自加一,加到九时归零,且向秒位发出一个高电平,秒低位自加一,加到九时归零,秒高位自加一,加到五时归零,且向分位发出一个高电平,分低位自加一,加到六时系统清零。
数据选择器:
数据选择模块:定义三位二进制数ss作为选择数码管的变量,ss自加一,当ss大于7时归零,当ss为5、4、3、2、1时分别将msl,msh,sl,sh,ml,mh的值赋给coder,当ss为6、7时赋值为零。
七段数码管显示译码器
七段数码管译码器模块:根据数字的显示形状编制真值表,当上一模块coder为0~9时,分别给seg赋以一组八位二进制数,使数码管显示相应的数字。
表1 七段数码管显示译码器真值表:
case
seg
0
1000000
1
1111001
2
0100100
3
0110000
4
0011001
5
0010010
6
0000010
7
1111000
8
0000000
9
0010000
4.数字跑表的流程图:
数字跑表主要由计时器,七段数码管译码器组成。流程框图如图所示。
数码管译码器
百分秒计数器
CLK msl
pause
秒计数器
clr
分计数器
图3-1程序流程图
表2控制信号的作用
复位clr
异步复位信号,高电平有效
pause
同步暂停信号,低电平有效计数。
sel
共阴数码管的位选信号
seg
共阴数码管的段选信号
三:设计总体框图
三:硬件电路设计与程序设计
设计思路
今需设计一个计时范围为0.01 秒~1 小时的数字秒表,首先需要获得一个比较精确的计时基准信号,这里是周期为1/100 s 的计时脉冲,可以把50MHz的信号经过100分频的分频器三次分频得到,其中分频器经过两次分频得到的信号还可作为数码管扫描电路的时钟。其次,还需对每一计数器设置清零信号输入和对六个计数器设置时钟使能信号,即计时允许信号,以便作为秒表的计时起、停控制功能。为了方便控制所有计数模块清零和使能功能设计了一个控制模块。最后把所有计数器的输出数据通过数码管扫描电路模块和七段译码显示模块作为输出,接到实验箱上的8字数码显示电路上就可显示结果了。因此数字秒表可由三个分频器、四个十进制计数器(1/100 秒、1/10 秒、1 秒、1分)、两个六进制计数器(10 秒、10 分)、一个控制器、一个数据选择器以及七段译码显示器组成,如总体框图所示。根据设计思路,本次设计就采用模块化设计,共分为分频器模块(fenpin)、控制模块(kongzhi)、十进制计数模块(cnt10)、六进制计数模块(cnt6)、数码管扫描模块(xuanze)、七段译码显示模块(decl7s)六个模块以及图形式顶层文件。下面我们分别对每个模块的功能进行描述、程序进行设计以及各个模块功能的仿真。
1、分频器模块
根据设计需要,首先需要获得一个比较精确的计时基准信号,这里是周期为1/ 100 s 的计时脉冲。我们可以把50MHz的信号经过100分频的分频器三次分频得到此基准信号,所以需要设计一个100分频的分频器。此外,经过两次分频的信号(10KHz)还可以同时作为数码管扫描电路的时钟。
其模块图如下图所示:Clk为时钟输入信号,newclk为100分频的输出信号。
2、控制模块
为了方便控制所有计数模块清零和使能功能需要设计一个控制模块,所以该模块的功能就是控制什么时候发出置零信号和使能信号来控制计数器工作。
其模块图如下图所示:
Clk为开始/暂停功能按钮(下降沿有效),初次按下它时clc(控制计数器清零)为低电平,en(使计数器计数)为高电平;再次按下它时,clc保持为低电平,en跳变为低电平,如此重复循环。Reset为清零按钮(下降沿有效),无论何时按下它时,clc跳变为高电平,en变为低电平,以达到使计数器清零的目的。
3、十进制计数模块
此模块的功能就是完成十进制的计数功能,同时输出进位信号。
其模块图如下图所示:
Clk为时钟信号输入端,rst为计数器清零端(高电平有效),en为计数器使能端(高电平有效);daout为数据输出端,cout为进位信号输出端。
4、六进制计数模块
此模块的功能就是完成六进制的计数功能,同时输出进位信号。
其端口功能同十进制计数模块,在次不再重复诉说。
5、数码管扫描模块
该模块的功能是选择各个计数端口来的数据,当相应的数据到来时,数据选择器选择数据后输出给七段译码器,同时输出位选信号,再接入到实验箱上的8字数码显示电路上就可显示了。
其模块图如下图所示:
Clk为时钟信号输入端,msec1…...minute2是各个计数端口来的数据的输入端,deout为数据选择器选择数据后输出端,sel为位选信号输出端。
6、七段译码显示模块
该模块的功能就是把输入的四位二进制数据转换为七段数码管的显示编码,再输入到七段数码管中显示出数据。
其模块图如下图所示:
A为数据输入端,led7s为数据输出端。
五:程序设计如下:
/************************************************************************************
*******************以下引脚锁定基于DE2-35,芯片为EP2C35F672C6***********************【例1】数字跑表(顶层模块)
信号定义如下:
Clk50m: 输入50MHz时钟信号;
Clr: 异步复位信号;
pause: 暂停信号;
dotout: 小数点;
ledl, led0: 百分秒的高位和低位;
led3, led2: 秒信号的高位和低位;
led5, 1ed4: 分信号的高位和低位 */
module paobiao (clk,pause,clr,led0,led1,led2,led3,led4,led5,dotout);
parameter WIDTH=7;
//input clk50m;
input clk;
input pause;
input clr;
output dotout;
output[WIDTH-1:0] led5;
output[WIDTH-1:0] led4;
output[WIDTH-1:0] led3;
output[WIDTH-1:0] led2;
output[WIDTH-1:0] led1;
output[WIDTH-1:0] led0;
wire isstop;
wire zero;
switch # (8) switchstop (clk50m,pause, isstop) ;
switch # (8) switchzero (clk50m, clr, zero) ;
//reg [18 : 0 ] counter_l00hz ;
reg clk100;
//assign clkl00=counter_l00hz [18];
assign dotout=1'b1;
/*always @(posedge clk50m)
begin if(!isstop)
begin if(counter_l00hz==19'b1111_0100_0010_0100_000) counter_l00hz<=0;
else counter_l00hz<=counter_l00hz+1;
end
end*/
always @(*)
begin if(!isstop)
clk100<=clk;
end
reg [ 3 : 0 ] fs0 ;
reg fscarry0;
reg [3 : 0] fs1;
reg fscarry1;
reg [3 :0 ] s0;
reg scarry0;
reg [3 :0 ] s1;
reg scarry1;
reg [3 :0 ] minu0;
reg miucarry0;
reg [3 :0 ] minu1;
always@ (posedge clk100 or posedge zero)
begin if (zero)
begin fs0<=0; fscarry0<=0; end
else if (clk100==1)
begin if(fs0==9)
begin fs0<=0; fscarry0<=1; end
else
begin fs0<=fs0+1; fscarry0<=0 ; end
end
end
always@ (posedge fscarry0 or posedge zero)
begin if (zero)
begin fs1<=0; fscarry1<=0;end
else if (fscarry0==1)
begin if(fs1==9)
begin fs1<=0;fscarry1<=1;end
else
begin fs1<=fs1+1; fscarry1<=0;end
end
end
always@ (posedge fscarry1 or posedge zero)
begin if (zero)
begin s0<=0; scarry0<=0;end
else if ( fscarry1==1)
begin if (s0==9)
begin s0<=0;scarry0<=1;end
else
begin s0<=s0+1;scarry0<=0;end
end
end
always@(posedge scarry0 or posedge zero)
begin if(zero)
begin s1<=0;scarry1<=0;end
else if (scarry0==1)
begin if(s1==5)
begin s1<=0;scarry1<=1;end
else
begin s1<=s1+1;scarry1<=0;end
end
end
always@ (posedge scarry1 or posedge zero)
begin if (zero)
begin minu0<=0;miucarry0<=0;end
else if (scarry1==1)
begin if (minu0==9)
begin minu0<=0;miucarry0<=1;end
else
begin minu0<=minu0+1;miucarry0<=0;end
end
end
always@ (posedge miucarry0 or posedge zero)
begin if (zero)
begin minu1<=0;end
else if (miucarry0==1)
begin if (minu1==5) minu1<=0;
else minu1<=minu1+1;
end
end
led ledfs0 (fs0,led0);
led ledfsl (fs1,led1);
led leds0 (s0,led2);
led ledsl (s1,led3);
led ledmiu0 (minu0,led4);
led ledmiul (minu1,led5);
endmodule
/*【例1】数字跑表(7段数码管译码显示模块)。
led.v:7段数码管(led)译码显示模块
datain: 4位,10进制数输入
ledout:7位,数码管的7段*/
module led(datain,ledout);
parameter INWIDTH=4;
parameter OUTWIDTH=7;
input [INWIDTH-1: 0] datain;
output [OUTWIDTH-1:0] ledout;
reg [OUTWIDTH-1:0] dataout;
assign ledout=dataout;
always begin
case (datain)
0 : dataout<=7'b1000000;
1 : dataout<=7'b1111001;
2 : dataout<=7'b0100100;
3 : dataout<=7'b0110000;
4 : dataout<=7'b0011001;
5 : dataout<=7'b0010010;
6 : dataout<=7'b0000010;
7 : dataout<=7'b1111000;
8 : dataout<=7'b0000000;
9 : dataout<=7'b0010000;
default : dataout<=7'b1000000;
endcase
end
endmodule
/*【例1】数字跑表(按键廾关消抖电路)。
switch-v: 对按键开关的消抖电路,采用一个频率较低的时钟,
对输入进行采样,消除抖动*/
module switch(clk,keyin,keyout);
parameter COUNTWIDTH=8;
input clk, keyin;
output reg keyout;
reg [COUNTWIDTH-1: 0] counter;
wire clk_use; //频率较低的时钟
assign clk_use=counter [COUNTWIDTH-1];
always@ (posedge clk)
counter<=counter+1'b1;
always@ (posedge clk_use)
keyout<=keyin;
endmodule
六:编译仿真及硬件测试
1、编译仿真
当完成了以上秒表系统各个模块的VHDL设计,就可以使用QuartusⅡ对本设计进行编译和仿真。首先使用文本编辑器输入本设计的所有模块的源程序,先对各个模块进行编译和仿真,当所有模块全部编译通过和仿真功能正确后,就可以利用图形编辑工具完成顶层设计,其设计图如顶层设计图所示。然后再对图形编辑器编辑出的顶层设计图进行全程编译,通过之后就可以进行系统的整体仿真了。其中各个模块的仿真已在模块设计中完成,在此从略,下面只说明系统的整体仿真。
2.顶层设计图:
在仿真中,clk取10ns的信号,合理选取start和reset信号,就可以进行系统的整体仿真了。
3.仿真后得到如下仿真波形图:
七.实验心得及体会
从实验中,我对整个流程有了初步了解;对实验进行了深入学习,让我掌握硬件描述语言Verilog HDL语言的语言规则,数据类型,语句结构和模块设计;接着是最关键的编程,需要根据任务书分析需要的模块,编程并仿真。
两天的课程设计已经结束,虽然时间很短,但我不仅学到了许多关于EDA的知识,认识到了EDA的强大功能,更重要的是增强了我的实践动手能力,使我深刻地认识到仅仅学习课本上的知识是远远不够的,必须要多多动手,多多实践,才能真正理解并掌握所学的知识,达到学以致用的目的,为以后的工作积累了宝贵的经验,同时我也深深地感受到严谨的态度对于科学研究的重要性。由于在设计的过程中,一点点的失误都可能造成整个系统的瘫痪,所以每一个细节都要认真思考,认真操作,不能有丝百分的大意。这使我认识到要想做一个科研工作者是多么的不易!自己身上的缺点还有很多,要靠以后艰苦的努力来克服! 这次的EDA课程设计给了我一次非常重要也非常难得的实践机会,使我可以将平时课本上学习的理论知识应用于实际操作。设计的过程是十分艰苦的,由于从未接触过类似的领域,所以刚开始的时候一片茫然,不知道该干些什么。随着研究的逐渐深入,自己渐渐的摸出头绪,掌握了一些规律和方法,设计的成果也逐步成型,最终按照要求完成了设计。在实际操作的过程中,碰到了许多的困难,但最终在老师的耐心指导和同学的热情帮助下,按时完成了任务。在此对老师和同学们表示衷心的感谢! 最后感谢老师给与我这次宝贵的实践机会!
展开阅读全文