基于vhdl语言的两位数简易记分板设计毕业设计(编辑修改稿)内容摘要:
VHDL 语言编写去抖程序,基本原理如下:事先规定,按键未按下时为高电平 1,按键按下时为低电平 0。 键值扫描脉冲反复扫描按钮当前的状态,若检测到按钮当前的输入值为 0 时,延时 5ms~ 10ms,再次检测,如果键值还是 0,那么就认为有按键按下。 反之则认为是抖动,程序不做任何处理,继续扫描按键状态。 而延时的 5ms~ 10ms 这段时间间隙刚好好避开了按钮的抖动时间,达到了去抖的目的 [13]。 图 313 按键抖 动示意图 ( 2) 程序设计 如图 31 到 35 所示步骤新建一个文本编辑文件,保存后在其中编写去抖程序,完成后如图 314 所示。 13 图 314 去抖程序编辑窗口 下面对去抖程序中去除抖动的进程进行分析: process(clk_200hz) variable count:integer range 0 to 3。 variable count1:integer range 0 to 1。 begin if clk_200hz39。 event and clk_200hz=39。 139。 then if anjian_in=39。 039。 then if count=2 then count:=0。 anjian_out=39。 039。 else count:=count+1。 end if。 else count:=0。 anjian_out=39。 139。 end if。 end if。 end process。 信号 clk_200hz 是一个周期为 5ms 的脉冲信号,用这一信号来检测是否有键按下。 变量 count 对脉 冲进行计数。 在 clk_200hz 信号的每个上升沿对按键的状态进行检测,当检测到按钮的键值为 0 时,即有键按下时, count 加 1[14]。 当 count 的值达到 2 时,在 clk_200hz 的第三个脉冲上升沿到来时,若键值仍为 0,则说明当前按钮按下的时间已过了 10ms,确实有键按下,并非抖动,则令去抖模块的输出为低电 14 平 ,否则将 count 清零并使输出为高电平。 ( 3) 波形图文件 按照图 38 到图 311 所示步骤新建一个波形图文件,然后设置各项参数并保存。 最后开始仿真,仿真时序图如图 315所示。 图 315 为了方便理解,我引入了 guancha_200hz 这一输出信号,实际上它就是按键的扫描脉冲信号。 再者,之所以该信号使用的是 2 分频,目的是为了方便观察。 从图中可以直观地看出以下结论:当按键第一次按下时,保持的时间是两个周期,当第三个脉冲上升沿到来时,按键已恢复到高电平,所以算是抖动;当按键第二次按下时,由于持续的时间大于两个周期,所以在第三个周期的上升沿令输出值为零,直到检测到按键松开时,置位输出值 [15]。 而第三次按下表示按键时长时间按下,在这里,程序设置的是只做一次按键处理,即在 anjian_in 长时间处 于低电平时, anjian_out始终是低电平,不会发生电平跳变。 这样做的目的是使每次按键时如果按键按下的时间比较长,分数只会增加一次,而不会连续自动地增加。 这样做的目的是防止程序产生错误的判断从而导致发出指令出现错误。 从而得出,该仿真图符合预期的设计要求。 译码显示模块 ( 1) 数码管的选取 将 多个 发光二极管 按照 8 字型 拼接在 一起,再在右下角加一个 LED 构成 小数点,这样就构成了我们常用的八段 数码管( LED Segment Displays)。 它的 引线在内部 已经 连接完成, 而外部引脚连接的是 它们的各个 段以及 公共 电极。 数码管 实际上是由七个发光管组成 8字形构成的,加上小数点就是 8段, 分别由字母 a,b,c,d,e,f,g,dp来表示。 数码管有共阴和共阳两种,在功能上二者没什么区别,只是为了增加它的使用范围才设计这两种。 本设计中选用的是共阴 8 段 数码管, BCD 显示字符真值表见表 31,根据真值表就可让数码管显示 09十个数字。 15 表 31 共阴数码管真值表 十进制数 hgfedcba 显示字符 十六进制数 0 01111110 0 7E 1 00110000 1 30 2 01101101 2 6D 3 01111001 3 79 4 00110011 4 33 5 01011011 5 5B 6 01011111 6 5F 7 01110000 7 70 8 01111111 8 7F 9 01111011 9 7B ( 2) 程序设计 以下两个进程是两位数记分板的编码译码显示进程: xianshiled1:process(leda1) begin case leda1 is when 0 = led1=B1111110。 when 1 = led1=B0110000。 when 2 = led1=B1101101。 when 3 = led1=B1111001。 when 4 = led1=B0110011。 when 5 = led1=B1011011。 when 6 = led1=B1011111。 when 7 = led1=B1110000。 when 8 = led1=B1111111。 when 9 = led1=B1111011。 when others = led1=B0000000。 end case。 end process。 xianshiled0:process(leda0) begin 16 case leda0 is when 0 = led0=B1111110。 when 1 = led0=B0110000。 when 2 = led0=B1101101。 when 3 = led0=B1111001。 when 4 = led0=B0110011。 when 5 = led0=B1011011。 when 6 = led0=B1011111。 when 7 = led0=B1110000。 when 8 = led0=B1111111。 when 9 = led0=B1111011。 when others = led0=B0000000。 end case。 end process。 这两个进程是译码并显示两位分数的进程。 信号 leda1 与 leda0 是分数显示的编码信号,当加分、减分、清零按键按下时,这两个信号的值在 09之间循环的增加、减少、归零。 这两个信号的变化触发相应的进程执行相应的译码程序,令数码管显示当前 leda1 或 leda0 的值,如图 所示。 图 316 数码管显示时序图 4 系统组态及调试 系统组态 系统综合模块图如图 所示,左边是信号输入引脚,从上到下依次是加分按键、减分按键、复位按键和清零按键;右边是信号输出 引脚,从上至下依次是加分和减分按键信号观察引脚、十位数数码管驱动总线端口、个位数数码管驱动总线端口、蜂鸣器驱动端口、按键扫描脉冲观察端口。 由于是软件仿真,所以加入一些辅助输出端口,这有助于后期波形分析及程序修改。 17 图 41 系统综合模块图 顶层程序设计及调试 首先,新建一个文本编辑文件,步骤参照图 到图 ,然后在其中编写顶层程序,如图 所示。 图 42 程序编写界面 使用 VHDL 语言进行多层次设计时,一个很大的难点就是元件例化语句的使用。 所谓元件例化语句就是首先把一 个现成的设计实体包装成一个元件,然后在其他设计实体中调用该元件连接电路 [16]。 下面借具体程序进行详细介绍: ponent qudou is 去抖元件定义 port(anjian_in:in std_logic。 anjian_out:out std_logic。 clkin:in std_logic。 res:in std_logic )。 end ponent。 18 ponent fenpin is 分频元件定义 generic(n:integer:=1)。 port(clkin1:in std_logic。 clkout:out std_logic。 res:in std_logic )。 end ponent。 以上是去抖和分频两个元件的定义,其格式为: COMPONENT 元件名 IS GENERIC(类属表 )。 PORT(端口名表 )。 END COMPONENT 元件名。 元件定义完成以后,接着就是 在程序中调用元件。 详细见下面程序: fenpin0: fenpin generic map(1) port map( clkin1=clkin, clkout=guancha_200hzq, res=res )。 该元件例化语句是扫描按键状态的脉冲调用分频模块,产生的脉冲供去抖模块使用以得出正确的键值。 jiafen0: qudou port map (anjian_in=jiafen, anjian_out=jiafen_out, clkin=clkin, res=res )。 jianfen0: qudou port map (anjian_in=jianfen, anjian_out=jianfen_out, clkin=clkin, res=res )。 qingling0:qudou port map 19 (anjian_in=qingling, anjian_out=qingling_out, clkin=clkin, res=res )。 这三个元件例化语句是加分、减分、分数清零三个按键调用去抖模块,为分数显示提供正确的键值。 元件例化语句的格式为: 例化名:元件名 PORT MAP([端口名 =]连接端口名,„ ); PORT MAP 语句是端口进行映射的关键字,端口映射有两种该方法,第一种是位置映射:只需把名所对应的各个端口的连接信号或端口名写在括号中,同时要注意端口的连接顺序。 第二种是名字关联方式:确定连接情况后,把元件中的端口名写在前面,通过连接符号“ =”和外接的端口或信号名连在一起 [17]。 顶层程序编写完成后开始编译查错,结果如图 所示,提示编译成功。 图 43 顶层程序编译界面 然后依照图 到图 的步骤新建一个波形图文件,添加需要观察的端口,设置好相关参数后保存,之后开始仿真。 结果如图 所示。 20 图 44 系统波形图 从图中可以看出,个端口的时序图基本都符合最初的设计要求:当按一次加分键 led0 就从 0 到 9依次变化, led0 每到 9一次 , led1 的值就从 0 到 9依次变化,同时 led0 又从 0 开始变化。 当清零按键按下时。基于vhdl语言的两位数简易记分板设计毕业设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。