FPGA数字秒表的设计_第1页
FPGA数字秒表的设计_第2页
FPGA数字秒表的设计_第3页
FPGA数字秒表的设计_第4页
FPGA数字秒表的设计_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学院fpga设计实践报告题目: 数字秒表的设计 院系: 计算机与信息工程学院 专业: 电子科学与技术 年级 姓名: 学号: 指导老师: 一、课程设计目的: 本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。本课程有助于培养学生的数字电路设计方法、掌握模块划分、工程设计思想与电路调试能力,为以后从事各种电路设计、制作与调试工作打下坚实的基础。二、课程设计要求: l. 设计用于体育比赛用的数字秒表, 要求: 计时精度应大于l/100s, 计时器能显示1/100s的时间, 提供给计时器内部定时的时钟脉冲频率应大于l00hz, 这里选用 1kh

2、z 。 计时器的最长计时时间为l小时, 为此需要一个6位的显示器, 显示的最长时间为59分59.99秒。2. 设置有复位和起/停开关 复位开关用来使计时器清零, 并作好计时准备。 起/停开关的使用方法与传统的机械式计时器相同, 即按一下起/停开关, 启动计时器开始计时, 再按一下起/停开关计时终止。 复位开关可以在任何情况下使用,即使在计时过程中, 只要按一下复位开关, 计时进程立刻终止, 并对计时器清零。3. 复位和起/停开关应有内部消抖处理。4. 采用vhdl语言用层次化设计方法设计符合上述功能要求的数字秒表。5. 对电路进行功能仿真, 通过有关波形确认电路设计是否正确。6. 完成电路全部

3、设计后, 通过系统实验箱下载验证设计课题的正确性。三、系统组成与工作原理:数字秒表框图: 1、电路原理图 : 2、工作原理:l.计时控制器作用是控制计时。计时控制器的输入信号是启动、暂停和清零。为符合惯例, 将启动和暂停功能设置在同一个按键上, 按一次是启动, 按第二次是暂停, 按第三次是继续。所以计时控制器共有2个开关输入信号, 即启动/暂停和清除。计时控制器输出信号为计数允许/保持信号和清零信号。2. 计时电路的作用是计时, 其输入信号为lkhz 时钟、计数允许/保持和清零信号, 输出为l0ms、l00ms、s 和 min 的计时数据。3. 时基分频器是一个l0分频器, 产生l0ms周期的

4、脉冲, 用于计时电路时钟信号。4. 显示电路为动态扫描电路, 用以显示十分位、min、10s、s、100ms 和10ms 信号。三、系统设计的实现:要满足数字秒表的精度,首先应该获得精确的计时基准信号,这里的系统精度要求为l/100s, 计时器能显示1/100s的时间, 提供给计时器内部定时的时钟脉冲频率应大于l00hz, 这里选用1khz,因此每来1000个外界输入脉冲就输出一个频率,该频率的时间周期正好为0.01s,即先将外界脉冲进行1mhz100hz的分频。 0.1s、1s、1min等计时单位之间的进位转换可以通过十进制与六进制计数器来实现。每位计数器均能输出相应计时单位计数结果,其中十

5、进制计数器可以实现0.01s、0.1s、1s和1min单位单元的计数;六进制可以实现10s、10min为单位的计数。由于秒表需要具有异步清零和启动/暂停功能,因此可以将每个计数器都设置异步清零和启动/暂停输入端口,再将各计数器进行级联,即可同步显示不同量度单位的计时内容,如图所示 图中,u0模块用于将外界脉冲进行1mhz100hz的分频,从而得到0.01s的脉冲信号,u1用于实现0.1s的脉冲信号,u2用于实现1s的脉冲信号,u3和u4用于实现1min的脉冲信号,u5和u6用于实现1h的脉冲信号。除u0外,u1u6的cq可驱动显示带译码器的七段led进行数字显示。通过上述分析可知,数字秒表的构

6、成实际上依赖于三个基本模块,即1mhz100hz的分频模块、十进制计数器模块和六进制计数器模块,然后使用一个顶层模块将这些基本模块通过元件调用与映射的关系进行有机的结合。start程序初始化clk、clr、ena计时显示结果总体流程图如下:1、顶层模块程序 由于十进制计数器模块和六进制计数器模块会产生计数溢出信号,而这些溢出信号有可能作为下一计数器的时钟输入脉冲,因此在顶层模块程序结构体中需要定义相应的暂存计数溢出信号。顶层模块程序编写如下:-数字秒表的顶层模块程序miaobiao.vhdlibrary ieee;use ieee.std_logic_1164.all;entity miaob

7、iao is port(clr:in std_logic; -定义清零输入端 clk:in std_logic; -定义外界时钟脉冲输入端 ena:in std_logic; -定义启动/暂停输入端 dout:out std_logic_vector(23 downto 0); -定义秒表显示输出端end miaobiao;architecture art of miaobiao iscomponent clkgen -定义3mhz到100hz的分频计数器元件 port(clk:in std_logic; -定义3mhz到100hz的分频计数器所使用的端口 newclk:out std_log

8、ic);end component;component cnt10 -定义十进制计数器元件 port(clk,clr,ena:in std_logic; -定义十进制计数器所使用的端口 cq:out std_logic_vector(3 downto 0); carry_out:out std_logic);end component;component cnt6 -定义六进制计数器元件 port(clk,clr,ena:in std_logic; -定义六进制计数器所使用的端口 cq:out std_logic_vector(3 downto 0); carry_out:out std_lo

9、gic);end component;signal newclk:std_logic;signal carry1:std_logic;signal carry2:std_logic; -暂存计数溢出信号signal carry3:std_logic;signal carry4:std_logic;signal carry5:std_logic;begin-使用元件例化语句,通过基本模块的级联实现数字秒表u0:clkgen port map(clk=clk,newclk=newclk);u1:cnt10 port map(clk=newclk,clr=clr,ena=ena, cq=dout(3

10、 downto 0),carry_out=carry1);u2:cnt10 port map(clk=carry1,clr=clr,ena=ena, cq=dout(7 downto 4),carry_out=carry2);u3:cnt10 port map(clk=carry2,clr=clr,ena=ena, cq=dout(11 downto 8),carry_out=carry3);u4:cnt6 port map(clk=carry3,clr=clr,ena=ena, cq=dout(15 downto 12),carry_out=carry4);u5:cnt10 port map

11、(clk=carry4,clr=clr,ena=ena, cq=dout(19 downto 16),carry_out=carry5);u6:cnt6 port map(clk=carry5,clr=clr,ena=ena, cq=dout(23 downto 20);end art;顶层仿真波形: 2、 50mhz1khz分频模块程序 50mhz1khz分频模块程序流程图如图所示,使用vhdl编写程序时,在实体中应定义1kmhz的时钟频率输入端和100hz的时钟脉冲输出端。1khz时钟输入每来一个脉冲,cnter是否为999?cente清零newclk输出为高电平得到100hz的输出脉冲c

12、nter+1newclk输出为低电平ny 在结构体的说明语句中,定义一个频率脉冲计数信号(cnter),该信号的类型为整数型,计数范围为0999。在结构体的功能描述语句中,可使用个进程(u1和u2)来完成 50mhz1khz的频率描述。在u1中,每次检测到一个上升沿输入脉冲时,先通过if语句检测输入信号是否为上升沿。若是上升沿,再使用if语句判断当前计数值(cnter)是否等于999,如果相等,则将cnter清零,为输出下一个100hz的频率做准备,否则将cnter加1。在u2中判断cnter是否等于999,若果相等,将newclk输出为高电平,否则输出为低电平。1kmhz100hz分频模块程

13、序编写如下:library ieee;use ieee. std_logic_1164.all;entity clkgen is port( clk:in std_logic; -定义3mhz脉冲输入端 newclk:out std_logic ); -定义100hz脉冲输出端end clkgen;architecture art of clkgen is signal cnter:integer range 0 to 10#299999#; -暂存输入脉冲个数 begin u1: process(clk) begin if clkevent and clk=1 then if cnter=1

14、0#299999# then cnter=0; -判断输入脉冲个数是否为3000(029999) else cnter=cnter+1; end if; end if; end process u1; u2: process(cnter) -计数溢出信号控制 begin if cnter=10#299999# then newclk=1; -3mhz信号变为100hz else newclk=0; end if; end process u2; end art;分频仿真波形:3、十进制计数器模块程序 十进制计数模块程序流程图如下,使用vhdl编写程序时,在实体中定义时钟脉冲输入端(clk)、异

15、步清零输入端(clr)、启动暂停控制端(ena)、计数脉冲输出端cq和计数脉冲溢出端(carry_out)。y开始清零信号是否有效?输出脉冲是否为上升沿?是否允许计数?cq清零计数值是否等于9?计数值加1溢出信号输出为高电平计数值清零溢出信号输出为低电平ynynnyn 由于cq的方向定义为out,在结构体中不能对输入脉冲进行加1计数,因此在结构体的说明语句中应定义一个频率脉冲计数信号(cqi),通过cqi来进行加1控制。 在结构体的功能描述语句中可使用2个进程(u1和u2)来完成十进制计数器的功能描述。在u1中,先判断清零信号(clr)是否有效,若有效时,将cqi清零,否则检测输入脉冲。每次检

16、测到一个上升沿输入脉冲时,通过if语句检测输入信号是否为上升沿。若是上升沿,在判断是否允许计数(即ena是否有效)。若ena无效,则暂停计数,否则再使用if语句判断当前计数值(cqi)是否等于“1001”(即整数9),如果相等,则将cqi清零,肉则cqi加1,。在u2中判断cqi是否等于“1001”,如果相等,产生溢出信号(carry_out=1),否则carry_out输出为低电平(carry_out=0).十进制计数器模块程序编写如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entit

17、y cnt10 isport(clk:in std_logic; clr:in std_logic; ena:in std_logic; cq:out std_logic_vector(3 downto 0);carry_out:out std_logic);end cnt10;architecture art of cnt10 issignal cqi:std_logic_vector(3 downto 0);begin u1:process(clk,clr,ena) begin if clr=1then cqi=0000; elsif clkevent and clk=1then if e

18、na=1then u1:for n in 15 downto 0 loop u2:for i in 15 downto 0 loop end loop u2; end loop u1; if ena=1 then if cqi=1001 then cqi=0000; else cqi=cqi+1; end if; end if; end if; end if; end process u1;u2:process(cqi)begin if cqi=0000 then carry_out=1; else carry_out=0; end if; end process u2; cq=cqi;end

19、 art;十进制仿真波形:4、六进制计数器模块程序 六进制计数器模块的程序编写思路与十进制计数器模块类似,只不过将cqi的判断值由“1001”改为“0101”即可。六进制计数器模块程序编写如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt6 isport(clk:in std_logic; clr:in std_logic; ena:in std_logic; cq:out std_logic_vector(3 downto 0);carry_out:out std_log

20、ic);end cnt6;architecture art of cnt6 issignal cqi:std_logic_vector(3 downto 0);begin u1:process(clk,clr,ena) begin if clr=1then cqi=0000; elsif clkevent and clk=1then if ena=1then u1:for n in 15 downto 0 loop u2:for i in 15 downto 0 loop end loop u2; end loop u1; if ena=1 then if cqi=0101 then cqi=0000; else cqi=cqi+1; e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论