基于FPGA数字秒表设计报告

基于FPGA数字秒表设计报告
基于FPGA数字秒表设计报告

标准实验报告实验项目:基于FPGA数字秒表设计

毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:

指导教师签名:日期:

使用授权说明

本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:

学位论文原创性声明

本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日

导师签名:日期:年月日

注意事项

1.设计(论文)的内容包括:

1)封面(按教务处制定的标准封面格式制作)

2)原创性声明

3)中文摘要(300字左右)、关键词

4)外文摘要、关键词

5)目次页(附件不统一编入)

6)论文主体部分:引言(或绪论)、正文、结论

7)参考文献

8)致谢

9)附录(对论文支持必要时)

2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。

4.文字、图表要求:

1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写

2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画

3)毕业论文须用A4单面打印,论文50页以上的双面打印

4)图表应绘制于无格子的页面上

5)软件工程类课题应有程序清单,并提供电子文档

5.装订顺序

1)设计(论文)

2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订

教研室(或答辩小组)及教学系意见

目录

1.秒表设计要求 (1)

2.设计思路 (1)

2.1功能模块 (1)

2.1.1分频器 (1)

2.1.2计数器 (1)

2.1.3数据锁存器 (1)

2.1.4控制器 (1)

2.1.5扫描显示的控制电路 (2)

2.1.6显示电路 (3)

2.1.7按键消抖电路 (3)

3.电路实现 (4)

4.程序仿真 (10)

4.1分频器 (10)

4.1.1计数器电路综合 (11)

4.1.2计数器电路仿真 (11)

4.2同步计数器 (13)

4.2.1计数器实现 (13)

4.2.2计数器仿真 (15)

4.2.3同步计数器电路综合 (17)

4.3按键消抖电路 (18)

4.3.1按键消抖电路实现 (18)

4.3.2按键消抖电路仿真 (18)

4.3.3按键消抖电路综合 (20)

4.4八段译码器 (20)

4.4.1八段译码器实现 (20)

4.4.2八段译码器仿真 (21)

4.4.3八段译码器电路综合 (22)

4.5控制器 (23)

4.5.1控制器 (23)

4.5.1控制器仿真 (24)

4.5.3控制器电路综合 (25)

5.2View Technology Schematic : (26)

5.3管脚锁定: (27)

6.实验结论 (27)

1.秒表设计要求

(1)秒表的计时范围为00:00:00 ~ 59:59:99。

(2)两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:

在秒表已经被复位的情况下,按下“Start/Stop”键,秒表开始计时。在秒表正常运行的情况下,如果按下“Start/Stop”键,则秒表暂停计时;再次按下该键,秒表继续计时。在秒表正常运行的情况下,如果按下“Split/Reset”键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。在秒表暂停计时的情况下,按下“Split/Reset”键,秒表复位归零。

2.设计思路

2.1功能模块

2.1.1分频器

对晶体振荡器产生的时钟信号进行分频,产生时间基准信号

2.1.2计数器

对时间基准脉冲进行计数,完成计时功能

2.1.3数据锁存器

锁存数据使显示保持暂停

2.1.4控制器

通过产生锁存器的使能信号来控制计数器的运行、停止以及复位

设计分析:

2.1.5扫描显示的控制电路

包括扫描计数器、数据选择器和7段译码器,控制8个数码管以扫描方式显示计时结果,原理图如下:

2.1.6显示电路

2.1.7按键消抖电路

消除按键输入信号抖动的影响,输出单脉冲

按键按下时,FPGA 的输入为低电平;松开按键时,FPGA 的输入为高电平 但是在按下按键和松开按键的瞬间会出现抖动现象

2.2

电路框图

实验板上的数码管为共阳LED 数码管

实验电路板上的按键

3.电路实现

---------------------------------------------------------------------------------- -- Company:

-- Engineer:

--

-- Create Date: 09:08:39 03/12/2011

-- Design Name:

-- Module Name: stopwatch_1 - Behavioral

-- Project Name:

-- Target Devices:

-- Tool versions:

-- Description:

--

-- Dependencies:

--

-- Revision:

-- Revision 0.01 - File Created

-- Additional Comments:

--

---------------------------------------------------------------------------------- library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity stopwatch_1 is

Port (

Clk : in STD_LOGIC;

start_stop : in STD_LOGIC;

split_reset : in STD_LOGIC;

ncs : out STD_LOGIC;

s : out STD_LOGIC_VECTOR(2 downto 0);

seg : out STD_LOGIC_VECTOR (7 downto 0)

);

end stopwatch_1;

architecture Behavioral of stopwatch_1 is

signal k1,k2,k3,k4: STD_LOGIC;

signal cnt_1,cnt_2 : STD_LOGIC_VECTOR(1 downto 0);

signal start_stop_out,split_reset_out: STD_LOGIC;

signal count: STD_LOGIC_VECTOR(15 downto 0):=(others=>'0');

signal clk_1k: STD_LOGIC;

signal z0,z1,z2,z3,z4,z5,z6,q1,q2,q3,q4,q5,q6 : STD_LOGIC_VECTOR(3 downto 0):=(others=>'0');

signal count_2: STD_LOGIC_VECTOR(2 downto 0 ):=(others=>'0');

signal in_7: STD_LOGIC_VECTOR(3 downto 0);

signal sreg: STD_LOGIC_VECTOR(2 downto 0):="111";

signal snext: STD_LOGIC_VECTOR(2 downto 0);

Begin

---------------------------------------------------------为三八译码器置入使能信号ncs <= '0';

---------------------------------------------------------分频电路

process(clk)

begin

if rising_edge(clk) then

if count = 47999 then

count <=(others=>'0');

else

count <= count+1;

end if;

end if;

end process;

clk_1k <= count(15);

---------------------------------------------------------同步计数电路process(clk_1k,sreg(2))

begin

if rising_edge(clk_1k) then

if sreg(2) = '1' then

z0<=(others=>'0');

z1<=(others=>'0');

z2<=(others=>'0');

z3<=(others=>'0');

z4<=(others=>'0');

z5<=(others=>'0');

z6<=(others=>'0');

elsif sreg(1) = '1' then

z0 <= z0+1;

if z0 = 9 then

z0 <=(others=>'0');

z1 <= z1+1;

if z1 = 9 then

z1 <=(others=>'0');

z2 <= z2+1;

if z2 = 9 then

z2 <=(others=>'0');

z3 <= z3+1;

if z3 = 9 then

z3 <= (others=>'0');

z4 <= z4+1;

if z4 = 5 then

z4 <= (others=>'0');

z5 <= z5+1;

if z5 = 9 then

z5 <= (others=>'0');

z6 <= z6+1;

if z6 = 5 then

z6 <= (others=>'0');

end if;

end if;

end if;

end if;

end if;

end if;

end if;

end if;

end if;

end process;

---------------------------------------------------------扫描计数器process(clk_1k)

begin

if rising_edge(clk_1k) then

count_2 <= count_2+1;

end if;

end process;

s <= count_2;

---------------------------------------------------------锁存器process(sreg(0),z1,z2,z3,z4,z5,z6)

begin

if sreg(0) = '1' then

q1 <= z1;

q2 <= z2;

q3 <= z3;

q4 <= z4;

q5 <= z5;

q6 <= z6;

end if;

end process;

---------------------------------------------------------

process(count_2,q1,q2,q3,q4,q5,q6)

begin

case count_2 is

when "000" => in_7 <= q1;

when "001" => in_7 <= q2;

when "011" => in_7 <= q3;

when "100" => in_7 <= q4;

when "110" => in_7 <= q5;

when "111" => in_7 <= q6;

when others => in_7 <= "1111";

end case;

end process;

---------------------------------------------------------八段译码器process(in_7)

begin

case in_7 is

when "0000" => seg <="00000011";

when "0001" => seg <="10011111";

when "0010" => seg <="00100101";

when "0011" => seg <="00001101";

when "0100" => seg <="10011001";

when "0101" => seg <="01001001";

when "0110" => seg <="01000001";

when "0111" => seg <="00011111";

when "1000" => seg <="00000001";

when "1001" => seg <="00001001";

when others => seg <="11111101";

end case;

end process;

---------------------------------------------------------按键去抖电路process(clk_1k,start_stop)

begin

if clk_1k'event and clk_1k='0' then

if cnt_1 = 3 then

k1 <= '1';

else

k1 <= '0';

cnt_1 <= cnt_1+1;

end if;

k2 <= k1;

end if;

if start_stop = '0' then

cnt_1 <= "00";

end if;

end process;

start_stop_out <= not k1 and k2;

process(clk_1k,split_reset)

begin

if clk_1k'event and clk_1k='0' then

if cnt_2 = 3 then

k3 <= '1';

else

k3 <= '0';

cnt_2 <= cnt_2+1;

end if;

k4 <= k3;

end if;

if split_reset = '0' then

cnt_2 <= "00";

end if;

end process;

split_reset_out <= not k3 and k4;

---------------------------------------------------------控制器

process(clk_1k,start_stop_out,split_reset_out)

begin

if rising_edge(clk_1k) then

sreg <= snext;

end if;

end process;

process(start_stop_out,split_reset_out,sreg)

begin

case sreg is

when "111" => if start_stop_out = '1' and split_reset_out = '0' then

snext <= "011";

else snext <= sreg;

end if;

when "011" => if start_stop_out = '1' and split_reset_out = '0' then

snext <= "001";

elsif start_stop_out = '0' and split_reset_out = '1'

then snext <= "010";

else snext <= sreg;

end if;

when "001" => if start_stop_out = '0' and split_reset_out = '1' then

snext <= "111";

elsif start_stop_out = '1' and split_reset_out = '0'

then snext <= "011";

else snext <= sreg;

end if;

when "010" => if start_stop_out = '0' and split_reset_out = '1' then

snext <= "011";

else snext <= sreg;

end if;

when others => snext <= "111";

end case;

end process;

end Behavioral;

注:控制器设计时,巧妙地将状态编码和控制器输出的控制信号编码合二为一,即状态编码也是控制信号编码,使得程序形式上更为简单、清晰。

4.程序仿真

4.1分频器

entity fp is

Port ( clk_48M : in STD_LOGIC;

clk_1k : out STD_LOGIC);

end fp;

architecture Behavioral of fp is

signal count: STD_LOGIC_VECTOR(15 downto 0):=(others=>'0'); begin

process(clk_48M)

begin

if rising_edge(clk_48M) then

if count = 47999 then

count <= (others=>'0');

else

count <= count+1;

end if;

end if;

end process;

clk_1k <= count(15);

end Behavioral;

tb : PROCESS

BEGIN

clk_48M <= '1'; wait for 10.4 ns;

clk_48M <= '0'; wait for 10.4 ns;

END PROCESS;

4.1.1计数器电路综合

4.1.2计数器电路仿真

由图可得分频后的信号周期T=999333718ps≈0.001s即的到了1KHz的信号

相关主题
相关文档
最新文档