基于vhdl的数字跑表技术内容摘要:

时序仿真验证 设计输入 器件编程 在线测试 投产 设计修改 图 MAX+plusⅡ 软件工作流程 17 VHDL 程序的结构 一、 VHDL 程序的基本单元 VHDL 程序的结构由结构体、实体、配置( CONFIGURATION)、程序包( PACKAGES)和库( LIBRARIES)组成。 在一个具体的应用程序中,最基本的部分为实体和结构体。 在应用程序中,实体是唯一的,结构体可以具有多个。 在具有多个结构体的情况下,具体使用哪一个结构体需要指定。 配置可以用于描述实体与结构体的连接关系,设计者可以利用配置为实体选择不同的结构体。 二、 VHDL 程序的结构体 VHDL 语言结构体的完整 格式如下: ARCHITECTURE 结构体 OF 实体名 IS [定义语句 ] BEGIN [并行语句 1; ] [并行语句 2; ] [……] END [ARCHITECTURE] [ 结构体名 ]; 三、 VHDL 程序的实体 VHDL 中实体的完整格式如下: ENTITY 实体名 IS [ GENERIC (类属表 )。 ] [ PORT (端口表 )。 ] [ BEGIN 实体语句部分。 ] END [ ENTITY ] 实体名。 实体可 以用来给所设计的系统或者电路命名,该所设计的系统或者电路定义一个与其他模块进行通信的接口。 它描述了一个系统或者电路的外观图。 实体中的类属( GENERIC)和端口说明( PORT)用来说明所设计的系统或者电路与其它模块通信的对象。 类属说明提供静态信息通道,适用于规定端口的大小、实体中包括元件的多少以及时间特性等。 端口说明是对外引脚的描述,它包括引脚的名称、信号的传输方向和传输的数据类型。 实体语句部分定义实体接口中的公共信息。 18 第三章 跑表 的设计 跑表 的功能描述 这里将要讨论的 跑表 经常应用在体育竞赛中 和一些要求准确计时的领域。 它的主要功能描述如下: (1) 要求设置复位开关。 当按下复位开关时, 跑表 清零并做好计时准备。 在任何情况下只要按下复位开关, 跑表 都要无条件地进行复位操作,即使是在计时过程中也要无条件地进行清零操作。 (2) 要求设置启 /停开关。 实际上启 /停开关的使用方法与传统的机械式计时器完全相同:当按下启 /停开关后,将启动 跑表 并开始计时;当再按一下启 /停开关时,将终止 跑表 的计时操作。 (3) 要求计时精度大于 秒。 在体育竞赛中运动员的成绩计时是以 秒为最小单位的,因此要求设计的计时器能 够显示 秒的时间。 (4) 要求 跑表 的最长计时时间为 24 小时。 在现今的各项体育竞赛中,最长时间为12 小时的 跑表 已经足够了。 (5) 要求有系统电源复位电路的电源复位信号。 根据上面 跑表 的功能描述,不难给出该 跑表 的输入和输出电路。 首先来描述一下 跑表 的输入电路: (1) 首先要按下复位开关 reset 进行 跑表 的服务清零操作,使 跑表 做好计时准备。 (2) 当做好计时准备后按下 跑表 的启 /停开关 on_off, 跑表 开始计时, 跑表 的最小计时单位是 秒;计时完毕后再按一下 跑表 的启 /停开关 on_off,将终止 跑表 的 计时操作。 (3) 由于 跑表 的计时精度为 秒,所以提供给 跑表 内部定时的时钟信号频率应该大于 100Hz。 这里取 1000Hz 的时钟输入信号 clk。 (4) 当对 跑表 进行更换电源操作时,由系统电源复位电路提供给该系统一个电源复位信号 sysreset。 对于该 跑表 的设计中,系统电源的复位电路是外加的,并不包含在设计当中。 接下来来描述 跑表 的输出电路: 19 (1) 由于 跑表 的最长计时时间为 24 小时,因此需要一个 8 位的显示器。 这样,在设计中就需要一个八条输出线,用来选通指定的一位 LED 七段显示数码管。 (2) 显示器的 每一位都采用 LED 七段显示数码管进行显示,因此输出电路要有一个七条输出线连接在 LED 七段显示数码管。 综上所述,可以确定 跑表 的基本方案如下: (1) 当对 跑表 进行更换电源操作时,由系统电源复位电路提供给 跑表 的电源复位信号 sysreset 来控制对 跑表 的复位操作,即使 跑表 清零。 (2) 计时操作过程如下:  首先按下复位开关 reset 进行 跑表 的复位清零操作,使 跑表 做好计时准备。  按下 跑表 的启 /停开关 on_off, 跑表 计时开始。 这 时 ,通过输出线 choose( 7 downto 0)来选择指定的一位 LED 七段显示数码管。 其中, choose( 7 downto 0)以 100Hz 的频率使 8 个 LED 七段显示数码管按次序依次点亮,由于频率很高,所以可以得到一个无闪烁的稳定的 跑表 计时输出。  计时完毕后,按下 跑表 的启 /停开关 on_off,将终止 跑表 的计时操作。  然后再次按下复位开关 reset 进行 跑表 的复位清零操作,为 跑表 的下次计时做准备。 (3) 跑表 进行计时操作的计时时钟是由外部时钟信号 clk 提供的。 根据上述考虑,可以画出 跑表 系统的结构框图, 如图 31 所示 , 它说明了整个系统的外部输入和输出情况。 图 跑表 系统的结构框图 20 顶层设计的 VHDL 源代码 顶层实体设计及 VHDL 源代码 在任何自顶向下的 VHDL 设计描述中,首先要做的第一步就是描述顶层信号的接口,正如图 31 所示。 系统的接口包括输入信号、输出信号、一些 输入输出双向信号以及需要传输的某些参数。 需要描述的不仅是信号的方 向,还包括信号的类型。 在上面的描述中,实际上已经规定了 跑表 的输入输出信号: (1) 输入信号  复位开关信号 reset;  启/停开关信号 on_off;  系统电源复位信号 sysreset;  外部时钟信号 clk。 (2) 输出信号  LED 七段显示数码管的选通信号 choose( 7 downto 0);  LED 七段显示数码管的输出信号 segment( 6 downto 0)。 我们知道, VHDL 的系统接口是由实体说明来描述的。 下面是用 图 31 所示的 结构框图生成的 跑表 顶层实体说明的 VHDL 源代码。 源代码 1 library ieee。 use。 use。 use。 entity stopwatch is port ( reset1 : in std_logic。 on_off : in std_logic。 sysreset : in std_logic。 clk : in std_logic。 choose : out std_logic_vector(7 downto 0)。 segment : out std_logic_vector(6 downto 0))。 end stopwatch。 21 顶层结构体的设计及 VHDL 源代码 在任何自顶向下的 VHDL 设计描述中,设计人员常常将整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。 现在我们就来根据前面描述的结构功能,确定使用哪些模块以及这些模块之间的关系。 由于 跑表 的复位开关和启 /停开关采用按键的输入方式,其产生时刻和持续时间的长短是随机不定的,且存在因开关簧片反弹引起的电平抖动现象,因此必须在每个开关后面安排一个消抖和同步化电路模块,以保证系统能捕捉到输入脉冲,并保证每按一键,只形成一个宽度为系统时钟周期的脉冲。 同步电路的方案很多 ,图 32 是一种 既有消抖功能又有同步功能的电路,应用的非常广泛。 图 一种常用的消抖同步电路 由于外部时钟信号 clk 的频率为 1000Hz,而实际需要的内部计时时钟频率为 100Hz和提供给消抖同步电路的频率为 25Hz,因此需要一个时钟分频电路。 通过分频电路,由外部时钟信号 clk 产生频率分别为 100Hz 和 25Hz 的时钟信号。 跑表 的计时操作是在复位开关信号无效并且两次启 /停开关信号有效之间才能够进行,因此需要一个电路来产生一个使能信号。 只有当使能信号有效时,才能够进行 跑表的定时计数操作。 当 跑表 开始 正常计时的时候,需要进行定时计数操作,由于时间显示器是由 8 个LED 七段显示数码管组成的,因此需要产生 8 位的计时信息:小时十位信号、小时个位信号、分十位信号、分个位信号、秒十位信号、秒个位信号、 秒位信号和 秒位 22 信号。 这个定时计数操作可以有一个定时计数器来完成,定时计数器的功能就是用来产生 8 位计时信息。 跑表 还要将定时计数的结果显示出来,为了节省资源,我们采用循环点亮 LED 七段显示数码管的方法来显示 跑表 的计时输出。 我们通过信号 choose( 7 downtown 0)来进行 8 个 LED 七段显示数码管的选 择,从而将输出信号 segment( 6 downtown 0)送到相应的 LED 七段显示数码管上以完成 跑表 计时的显示。 跑表 显示的功能可以通过一个单独的电路来实现。 通过上面的说明,不难看出我们可以将 跑表 系统划分为 5 个模块:键输入模块、时钟分频模块、控制模块、 跑表 计时模块、和显示 模块。 这 5 个模块的连接关系 如图 33所示。 图 跑表 各个模块之间的连接关系 下面我们就根据图 33 所示的各个模块的连接关系来确定各个模块的输入信号和输出信号。 (1) 键输入模块 输入信号  复位开关信号 reset;  启 /停开关 信号 on_off;  外部时钟信号 clk;  来消除抖动的时钟信号 clk1,由时钟分频模块提供。 23 输出信号  去除抖动后的复位信号 reset0;  去除抖动后的启 /停信号 on_off0。 (2) 时钟分频模块 输入信号  系统电源复位信号 sysreset;  外部时钟信号 clk。 输出信号  用来消除抖动的时钟信号 clk1;  跑表 的内部计时时钟信号 clk0。 (3) 控制模块 输入信号  去除抖动后的复位信号 reset0;  去除抖动后的启 /停信号 on_off0;  系统电源复位信号 sysreset;  跑表 的内部计时时钟信 号 clk0。 输出信号  跑表 定时计数的使能信号 enable。 (4) 跑表 计时模块 输入信号  去除抖动后的复位信号 reset0;  系统电源复位信号 sysreset;  跑表 的内部计时时钟信号 clk0;  跑表 定时计数的使能信号 enable。 输出信号  小时十位信号 hr10;  小时个位信号 hr;  分十位信号 min10;  分个位信号 min;  秒十位信号 sec10; 24  秒个位信号 sec;  秒位信号 sec01;  秒位信号 sec001。 (5) 跑表 显示模块 输入信号  系统电源复位信号 sysreset;  外部 时钟信号 clk;  小时十位信号 hr10;  小时个位信号 hr;  分十位信号 min10;  分个位信号 min;  秒十位信号 sec10;  秒个位信号 sec;  秒位信号 sec01;  秒位信号 sec001。 输出信号  LED 七段显示数码管的选通信号 choose;  LED 七段显示数码管的输出信号 segment。 下面根据 图 33 所示的各 个模块的连接关系,给出顶层结构体的 VHDL 源代码。 其中 5 个模块以元件的形式给出,首先在结构体的说明部分进行元件说明,然后在结构体中进行例化调用。 同时在结构体的说明部分还定义了 许多中间信号,主要用来在模块之间传递信息。 源代码 2 architecture structure of stopwatch is ponent keyin port ( reset : in std_logic。 on_off : in std_logic。 clk : in std_logic。 clk1 : in std_logic。 reset0 : out std_logic。 25 on_off0 : out std_logic)。 end ponent。 ponent clk_div port ( sysreset : in std_logic。 clk : in std_logic。 clk0 :out。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。