资源描述:
《七人表决器的VHDL程序设计.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一、题目用VHDL设计七人表决器二、分析讨论:七人表决器这一功能用C语言、汇编语言或VHDL编程然后下载到单片机上实现,不过用VHDL编程不仅技术含量高而且能让我们更熟练的掌握使用quartus软件的步骤和方法。所以我们使用VHDL完成。七人表决器就是当投票的人中,同意个数过半(即大于等于4)时,认为通过;否则,不通过。在编程中我们使用一个七位二进制输入变量表示投票人;一个七位二进制输出变量表示一个七段数码管显示同意的票数;一个一位的输出变量表示最终的投票结果。此结果能够在quartus软件中通过时序仿真。在硬件上我们用七个拨动开关来表示七个投票人,拨动开关为
2、‘1’时表示同意,为‘0’表示不同意;同意的票数和表决的时间分别通过一个七段数码管显示出来;最终的表决结果用一个LED表示。三、设计方案3.1实现原理首先,编写一个十进制的减法计数器,其输入为clk,clr,en,输出为q[3..0]。外部的时钟信号的频率选择为1KHz,此频率太大无法显示投票的限制时间,所以要用一个分频器来增大计数时间。设计一个分频器的程序,将时钟信号经过分频器输入到计数器中,输入为clk,输出为newclk。当clk有1000个上升沿是newclk产生一个脉冲,也就是计数器计数一次。其次,编辑七人表决器在主程序,其输入为clk,clr,en
3、,input[6..0],q[3..0],输出为output,led[6..0]。此程序的是时钟脉冲clk也为1KHz;当q从9到4期间投票是有效的,在4到0期间是无效的,此时就显示之前同意的票数。记录的票数通过casa语句转换到8位七段数码管显示出来。投票的时间和记录的票数要通过两个数码管显示,所以要用一个三八译码器来完成。接着编辑一个三八译码器的程序,其输入为clk,led[6..0],q[3..0],输出为choice,data[7..0]。程序中当用一个中间变量来选择数码管,由于clk的扫描的频率很大,所以两个数码管看上去是同时显示。3.2实现条件①在
4、quartus环境下编辑操作;②外部时钟信号;③控制引脚。3.3算法的描述首先,编写十进制的减法计数器,其输入为clk,clr,en,输出为q[3..0],运行之后生成模块器件。这个子程序中主要用到的算法是if语句:if(clr='0')thencount_4<="1001";elsif(clk'eventandclk='1')thenif(en='1')thenif(count_4="0000")thencount_4<="1001";elsecount_4<=count_4-'1';endif;endif;endif;其次,编辑七人表决器在主程序,其输入为
5、cl,clr,en,input[6..0],q[3..0],输出为led[6..0];生成模块器件。此程序中主要用到的算法有case语句和loop语句:foriin6downto0loopif(input(i)='1')thencnt:=cnt+1;elsecnt:=cnt;endif;endloop;casecntiswhen0=>x:="";when1=>x:="";when2=>x:="";when3=>x:="";when4=>x:="";when5=>x:="";when6=>x:="";when7=>x:="";whenothers=>x:="";
6、endcase;接着编辑三八译码器的程序,其输入为clk,led[6..0],q[3..0],输出为choice,data[7..0],生产模块器件。此程序中用到的算法主要有if语句和casa语句。ifclk'eventandclk='1'THENifcount='1'thencount<='0';elsecount<='1';endif;endif;casetemp1iswhen"0000"=>datain<="";when"0001"=>datain<="";when"0010"=>datain<="";when"0011"=>datain<="";whe
7、n"0100"=>datain<="";when"0101"=>datain<="";when"0110"=>datain<="";when"0111"=>datain<="";when"1000"=>datain<="";when"1001"=>datain<="";whenothers=>datain<="";endcase;最后,设计一个分频器的程序,将时钟信号经过分频器输入到计数器中,输入为clk,输出为newclk。此程序主要用到的算法是if语句。ifclk'eventandclk='1'thenifcnter=999thencnter<=0;els
8、ecnter<=cnter+1;end