|
FPGA 数字秒表
一. 设计意义及功能
随着人们生活水平的日益提高,社会体系的日益完善,人们对于各种应用器材的要求也越来越高.秒表作为日常生活中,特别是体育运动中应用的特别广泛,所以精确且方便使用的秒表就被越来越多的人所选择.本秒表计时器用于体育竞赛及各种要求有较精确时的各领域。此计时器是用一块专用的芯片,用VHDL语言描述的。它具有开关、时钟和显示功能,其体积小,携带方便。
计时器的设计功能:
(1)精度应大于1/100s
(2)计时器的最长计时时间为1小时
在一般的短时间计时应用中,1小时应该足够了。为此需要一个6位显示器,显示最长时间为59分59.99秒。
(3)设置复位和启/停开关
复位开关用来使计时器清0,并作好清0准备。启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程应立即终止,并对计时器清零。
二. 实现原理
1.秒表各位的进制:一个计时范围为0.01秒~1小时的数字秒表由六个位构成,分别是0.01秒位、0.1秒位、1秒位、10秒位、1分位、10分位;0.01秒位、0.1秒位、1秒位是10进制的,10秒位是6进制的,1分位是10进制的,10分位是6进制的;所以本系统应该包括4个10进制计数器(如图1中CNT0)和2个6进制计数器(如图1中CNT6)。
注:其中输入端口:RST为计数器清零端,高电平有效;CIN为计数器使能端,高电平有效;CLK为时钟输入端;输出端口:COUNT[3..0]为计数值输出;COUT为计数器进位输出。
2.秒表的计时基准信号:以周期为0.01秒的计时脉冲作为一个比较精准的计时基准信号输入到0.01秒位计数器的时钟端;由于实验箱上不具备周期为0.01秒的时钟信号,所以需要采用分频器(如图1中CNT100)将10KHZ的时钟信号或者是其他频率的时钟信号经分频得到周期为0.01秒的计时基准信号,其分频数根据实际情况而定。
注:其中分频器输入端口:CLK为待分频的时钟输入;输出端口:NEWCLK为被分频后的时钟输出。
3. 数码管译码显示和动态扫描电路:将计数器输出的值用数码管显示需要BCD-七段数码管译码显示(如图1中DELED)程序(实验四已经做过);而将秒表的各位动态显示在数码管上,需要扫描电路(如图1中SEL4)。
注:其中扫描电路输入端口:CLK为扫描时钟输入;COUNT1~COUNT6为6组待扫描数据;输入端口:S[2..0]为当前时刻扫描的位值编码,若当前S[2..0]=000,COUNT1[3..0]为当前扫描到的值,则DOUT[3..0]的值为COUNT1[3..0]值。
4.芯片74161的调用主要是产生片选信号S[2..0].
5. 系统整体实现:新建原理图设计文件,将以上各个子模块按图1连接起来,构成一个秒表设计系统。
三. 实现步骤
1. 系统方框图如图1
图1.系统方框图
2. 各模块的设计
(1)CNT100模块
该模块的功能是产生100Hz的计时允许信号CARRY.
VHDL原代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt100 IS
PORT (reset,en,clk:IN STD_LOGIC;
carry:OUT STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END CNT100;
ARCHITECTURE rtl OF cnt100 IS
SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ca :STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
IF(reset='1')THEN
qs<="0000";
ELSIF(en='1') THEN
IF(qs="1001") THEN
qs<= "0000";
ca<='0';
ELSIF(qs="1000")THEN
qs<= qs+1;
ca<='1';
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(ca,en)
BEGIN
q<=qs;
carry<=ca AND en;
END PROCESS;
END rtl;
(2)CNT10模块
此模块的功能是10进制计数.
VHDL源代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt10 IS
PORT (reset,en,clk:IN STD_LOGIC;
carry:OUT STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END CNT10;
ARCHITECTURE rtl OF cnt10 IS
SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ca :STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
IF(reset='1')THEN
qs<="0000";
ELSIF(en='1') THEN
IF(qs="1001") THEN
qs<= "0000";
ca<='0';
ELSIF(qs="1000") THEN
qs<= qs+1;
ca<='1';
ELSE
qs<=qs+1;
ca<='0';
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(ca,en)
BEGIN
q<=qs;
carry<=ca AND en;
END PROCESS;
END rtl;
(3)CNT6模块
此模块的功能是进行6进制计数
VHDL源代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt6 IS
PORT (reset,en,clk:IN STD_LOGIC;
carry:OUT STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END CNT6;
ARCHITECTURE rtl OF cnt6 IS
SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ca :STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
IF(reset='1')THEN
qs<="0000";
ELSIF(en='1')THEN
IF(qs="0101") THEN
qs<= "0000";
ca<='0';
ELSIF(qs="0100") THEN
qs<= qs+1;
ca<='1';
ELSE
qs<=qs+1;
ca<='0';
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(ca,en)
BEGIN
q<=qs;
carry<=ca AND en;
END PROCESS;
END rtl;
(3)SEL4模块
此模块的功能是对输入信号进行简单的扫描,并且输出扫描值.
VHDL源代码:
SUBDESIGN sel4
(
d1[3..0],d2[3..0],d3[3..0],d4[3..0],d5[3..0],d6[3..0],sel[2..0]:INPUT;
q[3..0]: OUTPUT;
)
BEGIN
CASE sel[] IS
WHEN 0 => q[]=d1[];
WHEN 1 => q[]=d2[];
WHEN 2 => q[]=d3[];
WHEN 3 => q[]=d4[];
WHEN 4 => q[]=d5[];
WHEN 5 => q[]=d6[];
END CASE;
END;
(4)DELED模块
此模块的功能是控制输出显示.
VHDL源代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY deled IS
PORT(
a: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
y: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END deled;
ARCHITECTURE a OF deled IS
BEGIN
with a select
y <= "0111111" when "0000",
"0000110" when "0001",
"1011011" when "0010",
"1001111" when "0011",
"1100110" when "0100",
"1101101" when "0101",
"1111101" when "0110",
"0000111" when "0111",
"1111111" when "1000",
"1101111" when "1001",
"1110111" when "1010",
"1111100" when "1011",
"0111001" when "1100",
"1011110" when "1101",
"1111001" when "1110",
"1110001" when "1111",
"0000000" when others;
END a;
(5)系统原理图
四. 仿真结果及分析判断
1. 仿真结果
2.分析判断
由于时间长度的限制,无法达到预期的仿真结果,但从上面的仿真结果中可以观察到一组数据,此组数据为正确的.另外由程序源代码编译仿真和原理图的编译均可判断设计满足要求,但也有不足的地方,希望以后设计实验中可以加以完善.
五. 结论
1.问题解决
实验过程中自然会遇到许多意想不到的情况,不讨论外界因素,仅就设计本身而言主要问题如下:
(1) 实验设计中很难准确的获得100HZ的分频信号,所以利用计数的方法,实现50%的占空比,会相对精确一些.
(2) 片选信号产生电路和扫描选择电路可以利用一个集成模块来代替 ,更方便简洁, 但是相对而言不易理解.
(3) DELED模块的作用是控制数码管显示,可以利用VHDL和AHDL两种语言来进行描述.但实际操作过程中,只能使用VHDL语言,因为系统发出警告与错误AHDL占用的空间太大,不可以用,所以只能改用VHDL.
(4) 系统无法在暂停之后继续计数,只能复位从新开始,有待研究解决.
3. 感想
真正体验了一个简单系统设计的复杂性.好多的东西没有真正的理解,导致许多错误产生,不过也真正的学到了东西,虽然系统的某些功能还不是很完善,到终究是自己的努力产生的成果.希望以后可以继续学习与制作,将理论联系实际,融与实际,一便能更好的理解. |
|