好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

VHDL课程设计--两位数简易计分板.doc

7页
  • 卖家[上传人]:cl****1
  • 文档编号:559065145
  • 上传时间:2022-09-21
  • 文档格式:DOC
  • 文档大小:272KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 两位数简易计分板 摘要 计分板可以记录并显示0—99的数有4个输入端,分别为CLK时钟输入,RSET复位清零端,INC计分加输入端,DEC计分减输入端为用户提供输入有2路八段数码管数据输出,用作显示外围电路有时钟发生电路,八段数码管显示电路如右图所示芯片设计1:BCD码转换芯片设计 BCD码转换芯片的作用是将计数的BCD值转换为八段数码管相应的码值八段数码管编码如下0 00111111 1 000001102 01011011 3 010011114 01100110 5 011011016 01111101 7 000001118 01111111 9 01101111计数值采用的是BCD码方式,因此程序核心如下:PROCESS(LED0) BEGIN CASE LED0 IS WHEN "0000" => eight0<="00111111"; WHEN "0001" => eight0<="00000110"; WHEN "0010" => eight0<="01011011"; WHEN "0011" => eight0<="01001111"; WHEN "0100" => eight0<="01100110"; WHEN "0101" => eight0<="01101101"; WHEN "0110" => eight0<="01111101"; WHEN "0111" => eight0<="00000111"; WHEN "1000" => eight0<="01111111"; WHEN "1001" => eight0<="01101111"; WHEN OTHERS => NULL;END CASE;因为用到了两路输出,因此需要两个PROCESS来分别处理两个BCD码转换。

      BCD转换芯片仿真如下:从上图中可以看到,当LED[3..0]分别输入BCD码0-9时,eight[7..0]分别对应输出相应的八段数码管值2计分器设计计分器需要用户在按“+”或“-”时能相应的增加计数值或者减少计数值,该计数器采用的不是记录用户输入脉冲数而是采用记录系统脉冲数,因此,用户的按键“+”或“-”实质上是计分器增或减的使能端,当系统时钟设置得比较合适,大约在500ms左右,用户可以长按按键,让计分器增加或减少,甚至可以一直按住,实现连续增加或者减少计数值,这样可以在计分值输入错误的情况下,减去输入的计分值重新输入正确的计分值计分器除了有计数输入外,还需要一个复位清零,方便重新开始计分计数器核心是用BCD码来实现计数,关键代码如下: if clock'event and clock = '1' then if rest ='1' then --若输入复位,则计数清零 count0:="0000"; count1:="0000"; elsif inc ='1' and dec='0' then --若输入加,则增加计 if count0 < "1001" then --分值。

      count0:= count0+1; count1:= count1; --PS 见总结 elsif count1<"1001" then count1:=count1+1; count0:="0000"; end if; elsif dec='1' and inc ='0' then --若输入减,则减少计 if count0>"0000" then --分值 count0:=count0-1; count1:= count1; --PS 见总结 elsif count1>"0000" then count1:=count1-1; count0:="0000"; end if; ……仿真情况如下:从上图中可以看到,当rest信号为1时,BCD码计数值清零,当INC(按键加)信号为1时,记录脉冲数,LED0为个位,LED1为十位。

      当DEC(按键减)信号为1时,BCD计数值减去脉冲数这样就达到了计分目的3芯片总设计完成两个模块的设计后,打开图形编辑界面,将制作好的元件添加进去,并画好电路图电路图如下:其中CNT_SCORE为计分模块,BCD_CONV为BCD码转换模块CLK为外部时钟输入,REST为复位清零按键,INC为计分值增加输入,DEC为计分值减少输入SEG0[7..0]和SEG1[7..0]分别为八段数码管个位与十位显示输出电路完成后,编译仿真,仿真图如下:从上图中可以看到,当输入REST(复位清零信)为1时,SEG0[7..0]和SEG1[7..0](八段数码管编码值)为3F(即‘0’的编码,后面同理),当INC(按键计分加)信号为1是,SEG0[7..0]和SEG1[7..0]相应的增加,当DEC(按键计分减)信号为1时,SEG0[7..0]和SEG1[7..0]相应的减少计分板完成所需功能,仿真正确,设计完成总结在程序的编写中,碰到了一个非常难以解决的问题,就是在编写计分器CNT_SCORE.VHD程序的时候,程序语法正确,CHECK通过,但是一点击START生成元件的时候就会出错提示的语句如下: Error:Node:’144.INI’missing sourceError:Node:’151.INI’missing sourceError:Node:’158.INI’missing sourceError:Node:’164.INI’missing source……百度上查找资料,有相似的问题但是没能解决问题,最后在ALTERA官方网站 IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BCD_conv IS PORT(LED0,LED1: IN STD_LOGIC_VECTOR(3 downto 0); eight0,eight1: OUT STD_LOGIC_VECTOR(7 downto 0));END BCD_conv;ARCHITECTURE turn of BCD_conv isBEGIN PROCESS(LED0) BEGIN CASE LED0 IS WHEN "0000" => eight0<="00111111"; WHEN "0001" => eight0<="00000110"; WHEN "0010" => eight0<="01011011"; WHEN "0011" => eight0<="01001111"; WHEN "0100" => eight0<="01100110"; WHEN "0101" => eight0<="01101101"; WHEN "0110" => eight0<="01111101"; WHEN "0111" => eight0<="00000111"; WHEN "1000" => eight0<="01111111"; WHEN "1001" => eight0<="01101111"; WHEN OTHERS => NULL; END CASE; END PROCESS; PROCESS(LED1) BEGIN CASE LED1 IS WHEN "0000" => eight1<="00111111"; WHEN "0001" => eight1<="00000110"; WHEN "0010" => eight1<="01011011"; WHEN "0011" => eight1<="01001111"; WHEN "0100" => eight1<="01100110"; WHEN "0101" => eight1<="01101101"; WHEN "0110" => eight1<="01111101"; WHEN "0111" => eight1<="00000111"; WHEN "1000" => eight1<="01111111"; WHEN "1001" => eight1<="01101111"; WHEN OTHERS => NULL; END CASE; END PROCESS;END turn;2:CNT_score代码library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity cnt_score is port(clock,rest,inc,dec:in std_logic; LED0,LED1:out std_logic_vector(3 downto 0));end cnt_score;architecture score of cnt_score isbegin process(clo。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.