EDA设计报告数字秒表设计Word文档格式.docx
《EDA设计报告数字秒表设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《EDA设计报告数字秒表设计Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
3MHz->
100Hz分频模块、48MHz->
1KHz分频模块、十进制计数模块、六进制计数模块、锁存模块、数码管显示模块。
3MHz->
100Hz分频模块:
由于系统的精度是0.01s,因此要设置周期为100Hz的时钟脉冲。
又因为数字秒表输入的脉冲为3MHz,所以外界每输入3000Hz的脉冲系统就输出一个频率,这时频率的时间周期刚好为0.01s,还有就是实现48MHz—>
1KHz的功能给显示模块时钟信号的,而分频模块就是完成这样的功能。
48MHz—>
1KHz分频模块:
用于数码管显示的分频,使计数显示更清晰、更准确。
锁存模块:
用来实现计数的锁存,功能实现就是实现计数的暂停。
数码管显示模块:
用数码管来精确显示计数结果。
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)
ifclk_3m'
eventandclk_3m='
1'
then--上升沿
ifcount=10#15000#thencount<
=0;
clk_100_r<
=notclk_100_r;
--当count=10#1500#时,本身取反,输出为零
elsecount<
=count+1;
--计数加一
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)
ifclk_48m'
eventandclk_48m='
then
ifcount="
110000000000000"
count<
=(others=>
'
0'
);
--当count="
时取反
clk_1k_r<
=notclk_1k_r;
--否则的话计数加一
clk_1k<
=clk_1k_r;
endbehav;
3.3、十进制计数模块的设计
用来实现0.01s、0.1s、1s和1min单位单元的计数。
模块图
entityszmb2is
port(clk,rst:
cq:
outstd_logic_vector(3downto0);
cout:
--定义输入输出端口
endszmb2;
architectureoneofszmb2is
signalcq1:
std_logic_vector(3downto0);
signalcout1:
--定义计数
process(clk,rst)
ifrst='
thencq1<
="
0000"
;
cout1<
='
--复位清零
elsifclk'
eventandclk='
then
ifcq1<
"
1001"
=cq1+1;
--上升沿时,若cq1小于9的话,自身加一,不进位
elsecq1<
--否则的话,cq1为零,计数进位加一
cq<
=cq1;
cout<
=cout1;
3.4、六进制计数模块的设计
用来实现10s、10min为单位单元的计数。
entityszmb1is
endszmb1;
architectureoneofszmb1is
0101"
--若有上升沿,且cq1小于5的话,本身加一,计数为零
3.5、锁存模块的设计
entityscqis
port(gate:
d:
instd_logic_vector(23downto0);
data:
outstd_logic_vector(23downto0));
end;
architecturetwoofscqis
signaldata1:
std_logic_vector(23downto0);
process(gate,d)
ifgate='
data1<
=d;
--若门信号有脉冲,则门打开,d信号赋给data1
endif;
data<
=data1;
endtwo;
3.6、数码管显示模块的设计
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:
--用于缓存位码信息
SIGNALdisp_dat:
STD_LOGIC_VECTOR(3DOWNTO0);
--缓存待显示的BCD码
SIGNALcount:
STD_LOGIC_VECTOR(2DOWNTO0);
--用于计数
BEGIN
dig<
=dig_r;
seg<
=seg_r;
PROCESS(clk_1)
IFRISING_EDGE(clk_1)THEN
--上升沿来时,计数加一
ENDIF;
ENDPROCESS;
PROCESS