EDA设计报告数字秒表设计.docx
《EDA设计报告数字秒表设计.docx》由会员分享,可在线阅读,更多相关《EDA设计报告数字秒表设计.docx(13页珍藏版)》请在冰豆网上搜索。
EDA设计报告数字秒表设计
JIUJIANGUNIVERSITY
数字逻辑系统
课程设计报告
设计课题:
数字秒表设计
专业:
电子信息工程
班级学号:
学生姓名:
指导教师:
设计时间:
2012-12-24——2012-12-28
数字秒表
1.设计任务与要求
1.1、设计出的是一个能够精确反映计时时间,且具有复位、计时、暂停功能的数字秒表,老师要求是计下的时间存储下来并能以后调出显示出来。
1.2、设计的秒表输入脉冲为3MHz,秒表的最大计时范围为1h,精确度为0.01s,其度量单位有0.1s、1s、1min等档位,并且各档位可实现进位。
2.方案设计及主要技术思路
2.1、方案一:
用LED灯来显示计数结果。
将系统分为四个模块,分别为:
顶层模块程序、3MHz--->100Hz分频模块、十进制计数器模块、六进制计数器模块。
顶层模块:
由于十进制计数模块和六进制计数模块会产生计数溢出信号,而这些溢出信号有可能作为下一计数模块的时钟输入脉冲,因此需要使用一个顶层模块将这些基本模块通过元件调用与映射的关系进行有机结合。
分频模块:
就是实现3MHz到100Hz的分频,实体定义3MHz时钟频率输入端和100Hz的时钟脉冲输出端。
十进制计数器模块:
用来实现0.01s、0.1s、1s和1min单位单元的计数。
六进制计数器模块:
用来实现10s、10min为单位单元的计数。
2.2、方案二:
用数码管来显示计数结果。
将系统分为六个模块,分别为:
3MHz->100Hz分频模块、48MHz->1KHz分频模块、十进制计数模块、六进制计数模块、锁存模块、数码管显示模块。
3MHz->100Hz分频模块:
由于系统的精度是0.01s,因此要设置周期为100Hz的时钟脉冲。
又因为数字秒表输入的脉冲为3MHz,所以外界每输入3000Hz的脉冲系统就输出一个频率,这时频率的时间周期刚好为0.01s,还有就是实现48MHz—>1KHz的功能给显示模块时钟信号的,而分频模块就是完成这样的功能。
48MHz—>1KHz分频模块:
用于数码管显示的分频,使计数显示更清晰、更准确。
十进制计数器模块:
用来实现0.01s、0.1s、1s和1min单位单元的计数。
六进制计数器模块:
用来实现10s、10min为单位单元的计数。
锁存模块:
用来实现计数的锁存,功能实现就是实现计数的暂停。
数码管显示模块:
用数码管来精确显示计数结果。
2.3、优劣分析及方案选定
LED灯显示是以二进制的形式显示出来的,而数码管则直接显示数字,所以数码管显示来的更直观,再一个方案一涉及到元件例化语句,各分模块要实现元件调用和映射。
由于本人对元件例化语句不熟,所以方案一不考虑。
所以我选用方案二来完成本设计。
2.4采用的硬件平台及主要技术
本设计采用的硬件平台是编程片上系统,简称SOPC。
主要技术有以处理器和实时多任务操作系统(RTOS)为中心的软件中心技术、以PCB和信号完整性分析为基础的高速电路设计技术。
3.模块设计过程
3.1、3MHz->100Hz分频模块的设计
实现3MHz—>100Hz的分频,模块图
程序代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityszmb3is
port(clk_3m:
instd_logic;
clk_100:
outstd_logic);--定义输入输出端口,输入为3MHz,输出为100Hz
endszmb3;
architectureoneofszmb3is
signalclk_100_r:
std_logic;
signalcount:
integerrange0to10#15000#;--用于计数
begin
process(clk_3m)
begin
ifclk_3m'eventandclk_3m='1'then--上升沿
ifcount=10#15000#thencount<=0;clk_100_r<=notclk_100_r;--当count=10#1500#时,本身取反,输出为零
elsecount<=count+1;--计数加一
endif;
endif;
endprocess;
clk_100<=clk_100_r;
endone;
3.2、48MHz—>1KHz分频模块的设计
实现48MHz—>1KHz的分频,模块图
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfp1is
port(clk_48m:
instd_logic;
clk_1k:
outstd_logic
);----定义输入输出端口
endfp1;
architecturebehavoffp1is
signalclk_1k_r:
std_logic;
signalcount:
std_logic_vector(14downto0);--用于计数
begin
process(clk_48m)
begin
ifclk_48m'eventandclk_48m='1'then
ifcount=""then
count<=(others=>'0');--当count=""时取反
clk_1k_r<=notclk_1k_r;
elsecount<=count+1;--否则的话计数加一
endif;
endif;
endprocess;
clk_1k<=clk_1k_r;
endbehav;
3.3、十进制计数模块的设计
用来实现0.01s、0.1s、1s和1min单位单元的计数。
模块图
程序代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityszmb2is
port(clk,rst:
instd_logic;
cq:
outstd_logic_vector(3downto0);
cout:
outstd_logic);--定义输入输出端口
endszmb2;
architectureoneofszmb2is
signalcq1:
std_logic_vector(3downto0);
signalcout1:
std_logic;--定义计数
begin
process(clk,rst)
begin
ifrst='1'thencq1<="0000";cout1<='0';--复位清零
elsifclk'eventandclk='1'then
ifcq1<"1001"thencq1<=cq1+1;cout1<='0';--上升沿时,若cq1小于9的话,自身加一,不进位
elsecq1<="0000";cout1<='1';--否则的话,cq1为零,计数进位加一
endif;
endif;
endprocess;
cq<=cq1;
cout<=cout1;
endone;
3.4、六进制计数模块的设计
用来实现10s、10min为单位单元的计数。
模块图
程序代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityszmb1is
port(clk,rst:
instd_logic;
cq:
outstd_logic_vector(3downto0);
cout:
outstd_logic);--定义输入输出端口
endszmb1;
architectureoneofszmb1is
signalcq1:
std_logic_vector(3downto0);
signalcout1:
std_logic;--用于计数
begin
process(clk,rst)
begin
ifrst='1'thencq1<="0000";cout1<='0';--复位清零
elsifclk'eventandclk='1'then
ifcq1<"0101"thencq1<=cq1+1;cout1<='0';--若有上升沿,且cq1小于5的话,本身加一,计数为零
elsecq1<="0000";cout1<='1';--否则的话,cq1为零,计数进位加一
endif;
endif;
endprocess;
cq<=cq1;
cout<=cout1;
endone;
3.5、锁存模块的设计
用来实现计数的锁存,功能实现就是实现计数的暂停。
模块图
程序代码:
libraryieee;
useieee.std_logic_1164.all;
entityscqis
port(gate:
instd_logic;
d:
instd_logic_vector(23downto0);
data:
outstd_logic_vector(23downto0));--定义输入输出端口
end;
architecturetwoofscqis
signaldata1:
std_logic_vector(23downto0);
begin
process(gate,d)
begin
ifgate='1'then
data1<=d;--若门信号有脉冲,则门打开,d信号赋给data1
endif;
endprocess;
data<=data1;
endtwo;
3.6、数码管显示模块的设计
用数码管来精确显示计数结果。
模块图
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_Arith.ALL;
USEIEEE.STD_LOGIC_Unsigned.ALL;
ENTITYszmb4IS
PORT(
clk_1:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(23DOWNTO0);
dig:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
seg:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);--定义输入输出端口
ENDENTITY;
ARCHITECTUREoneOFszmb4IS
SIGNALseg_r:
STD_LOGIC_VECTOR(7DOWNTO0);--用于缓存对当前BCD码译码的结果
SIGNALdig_r:
STD_LOGIC_VECTOR(7DOWNTO0);--用于缓存位码信息
SIGNALdisp_dat:
STD_LOGIC_VECTOR(3DOWNTO0);--缓存待显示的BCD码
SIGNALcount:
STD_LOGIC_VECTOR(2DOWNTO0);--用于计数
BEGIN
dig<=dig_r;
seg<=seg_r;
PROCESS(clk_1)
BEGIN
IFRISING_EDGE(clk_1)THEN
count<=count+1;--上升沿来时,计数加一
ENDIF;
ENDPROCESS;
PROCESS(clk_1)
BEGIN
IFRISING_EDGE(clk_1)THEN
CASEcountIS
--WHEN"000"=>dig_r<="";
--WHEN"001"=>dig_r<="";--两位数码管不显示
WHEN"000"=>dig_r<="";disp_dat<=data(23DOWNTO20);--对应10min单位的一位数码管
WHEN"001"=>dig_r<="";disp_dat<=data(19DOWNTO16);--对应1min单位的一位数码管
WHEN"010"=>dig_r<="";disp_dat<=data(15DOWNTO12);--对应10s单位的一位数码管
WHEN"011"=>dig_r<="";disp_dat<=data(11DOWNTO8);--
对应1s单位的一位数码管
WHEN"100"=>dig_r<="";disp_dat<=data(7DOWNTO4);--
对应0.1s单位的一位数码管
WHEN"101"=>dig_r<="";disp_dat<=data(3DOWNTO0);--
对应0.01s单位的一位数码管
whenothers=>null;--其他不显示
ENDCASE;
ENDIF;
ENDPROCESS;
PROCESS(disp_dat)
BEGIN
CASEdisp_datIS
WHENX"0"=>seg_r<=X"c0";
WHENX"1"=>seg_r<=X"f9";
WHENX"2"=>seg_r<=X"a4";
WHENX"3"=>seg_r<=X"b0";
WHENX"4"=>seg_r<=X"99";
WHENX"5"=>seg_r<=X"92";
WHENX"6"=>seg_r<=X"82";
WHENX"7"=>seg_r<=X"f8";
WHENX"8"=>seg_r<=X"80";
WHENX"9"=>seg_r<=X"90";
WHENX"a"=>seg_r<=X"88";
WHENX"b"=>seg_r<=X"83";
WHENX"c"=>seg_r<=X"c6";
WHENX"d"=>seg_r<=X"a1";
WHENX"e"=>seg_r<=X"86";
WHENX"f"=>seg_r<=X"8e";
ENDCASE;--输入相应的BCD码,则相应的输出的数
ENDPROCESS;
ENDone;
4.整体设计及分析
4.1.整体设计说明
首先是两个分频模块同时分频,系统输入3MHz和48MHz的时钟信号脉冲,两个分频模块分别产生100Hz和1KHz的分频信号,1KHz的分频信号进入到数码管显示模块。
100Hz的分频信号进入到一个十进制计数模块,十进制计数模块产生的进位信号进入到下一个十进制计数模块,再产生进位信号又进入下一个十进制计数模块,接下来产生的进位信号进入一个六进制计数模块,六进制计数模块产生的进位信号再一次的进入十进制计数模块,产生的进位信号进入再次进入六进制模块,由于本设计的计数范围为1小时,所以到了这里就不需要在进位了。
计数部分共用到了六个模块,即四个十进制计数模块和两个六进制计数模块。
各计数模块的计数输出先接到锁存模块,进行计数结果的暂存,用总线连接。
最后锁存的的输出接到数码管显示模块,用总线连接。
4.2整体设计过程及遇到问题的解决方法
设计功能显示八位数码管只要求六位显示就可以了,而剩下的两位却依然乱码式的显示,所以我想修改显示模块的代码来去掉这两位显示,但自己或是请同学帮忙不管是怎么修改不是报错就是功能不显示,达不到效果,后来请老师来帮忙找下问题,结果他重新在编译下就实现了,说就是这样的问题。
这样的事情我们每次修改代码以后也做了啊,并没有出现他那样的效果啊。
所以到现在为之我还是不理解怎么实现的。
4.3设计整体逻辑图
4.4引脚配置
5.下载与调试
5.1、下载步骤
(a)将ByteBlaster电缆一端与微机并行口相连,另一端与实验箱的JTAG下载口相连。
并打开实验箱电源。
(b)点击HardwareSetup按钮,将出现一个对话框。
再点击对话框中的AddHardware按钮,在下拉条中选择ByteBlaster(MV),指定配置时使用的并行口LPT1,点击Close按钮退出。
(c)在编程器窗口中检查编程文件和目标器件型号是否正确。
如果选择的编程文件不正确,可以通过Delete、Addfile、Changefile按钮来删除、添加和更换文件。
注意:
对于该型号器件配置(编程)文件的扩展名为“.sof”。
(d)连接好试验箱及编程插座线,单击Start按钮启动编程下载。
5.2、测试的设置及测试方法
拨下设置的开始计数拨码开关,系统开始计数,数码管开始显示计数数字,拨下锁存拨码开关,系统计数暂停,数码管显示暂停时的计数结果,再拨下锁存拨码开关,系统紧接上次计数结果开始计时,拨下复位拨码开关,系统计数复位清零,数码管显示为零。
5.3、测试的结果
初步大概的完成设计要求,基本实现了秒计时的功能,但调用存储的功能没法实现。
5.4、测试中遇到的问题级解决方法
拨下锁存拨码开关,暂停秒计时,再次拨下,重新开始计时,但计时开始不是接着暂停时的计时结果,而是跳过一段时间开始计时的,跳过的时刻刚好等于暂停的时间。
解决方法是把锁存模块的输入脉冲用系统输入脉冲代替。
6.结论与心得
开始做设计时总是会犯一些错误,只有经过不停的改错不停的编译才能得到正确的程序。
在编程时,我充分使用了结构化的思想,这样程序检查起来也比较方便,调试时也给了我很大方便,只要一个模块一个模块的进行调就可以了,充分体现了结构化编程的优势。
在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法在数字系统设计中发挥越来越重要的作用。
还有就是要求实现的那个功能我到现在还没想明白怎么弄,所以暂时就这样的结果了。
7.参考文献:
[1]李国洪,胡辉,沈明山灯.《EDA技术与实验》,机械工业出版社
[2]徐志军、王金明、尹廷辉、苏勇.《EDA技术与PLD设计》,人民邮电出版社
[3]雷伏容.《VHDL电路设计》,清华大学出版社
[4]陈忠平,高金定,高见芳.《基于Quartus2的FPGA/CPLD设计与实践》,电子工业出版社
[5]潘松.《EDA技术使用教程》,科学出版社
[6]康光华.《电子技术基础-数字部分》,高等教育出版社
电子工程学院数字逻辑系统课程设计成绩评定表
课题名称
数字秒表设计
设计任务与要求
设计报告成绩
作品成绩
课程设计成绩
指导教师:
2012年12月日