文档库

最新最全的文档下载
当前位置:文档库 > EDA技术课程设计:可控计数器的设计

EDA技术课程设计:可控计数器的设计

EDA技术课程设计:可控计数器的设计

设计要求:

①设计一个五进制计数器,由两个控制键sel控制不同的计数方式;

②当sel=00时,按0、1、2、3、4、0、1、2、3、4……顺序计数;

③当sel=01时,按0、2、4、6、8、0、2、4、6、8……顺序计数;

④当sel=10时,按1、3、5、7、9、1、3、5、7、9……顺序计数;

⑤当sel=11时,按5、4、3、2、1、5、4、3、2、1……顺序计数;

⑥由数码管分别译码显示控制信号和计数状态,分别用3位数码管动态显示;

⑦给出VHDL设计的源程序。

以下程序已通过软件仿真和硬件验证,完全符合设计要求。

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity sheji3 is

port(clk,ck:in std_logic;--clk是计数时钟,ck是扫描时钟

sel:in std_logic_vector(1 downto 0);--计数模式控制信号

sm:out std_logic_vector(6 downto 0);---数码管的七段

duan:out std_logic_vector(5 downto 0));--6个数码管

end sheji3;

architecture art of sheji3 is

signal cnt:std_logic_vector(3 downto 0);--信号cnt用来计数

signal temp:integer range 0 to 5;

signal x: std_logic_vector(3 downto 0);--数码管动态显示的值

signal y: std_logic_vector(3 downto 0);--接收cnt的计数值

begin

p1:process(clk)--进程p1主要用来实现4种模式的计数功能,由信号sel来控制选择具体是哪种模式

begin

if(clk'event and clk='1')then

case sel is

when "00"=>if(cnt>="0100")then

cnt<="0000";

else cnt<=cnt+1;

end if;

when "01"=>if(cnt>="1000" or cnt="0001" or cnt="0011" or cnt="0101" or cnt="0111")then

cnt<="0000";

else cnt<=cnt+2;

end if;

when "10"=>if(cnt>="1001" or cnt="0000" or cnt="0010" or cnt="0100" or cnt="0110" or cnt="1000")then

cnt<="0001";

else cnt<=cnt+2;

end if;

when "11"=>if(cnt>"0101" or cnt="0001" or cnt="0000")then

cnt<="0101";

else cnt<=cnt-1;

end if;

when others=>cnt<="1111";

end case;

y<=cnt;

end if;

end process p1;

p2:process(ck) --进程p2主要用来扫描6个数码管,其中3个用来显示计数值,3个用来显示控制信号的值

begin

if(ck'event and ck='1') then

case temp is

when 0=>duan<="000001";

x<=y;

when 1=>duan<="000010";

x<=y;

when 2=>duan<="000100";

x<=y;

when 3=>duan<="001000";

x<="00"&sel;

when 4=>duan<="010000";

x<="00"&sel;

when others=>duan<="100000";

x<="00"&sel;

end case;

temp<=temp+1;

end if;

end process p2;

p3:process(x) --进程p3主要用来对数码管进行驱动译码

begin

case x is

when "0000"=>sm<="1111110";

when "0001"=>sm<="0110000";

when "0010"=>sm<="1101101";

when "0011"=>sm<="1111001";

when "0100"=>sm<="0110011";

when "0101"=>sm<="1011011";

when "0110"=>sm<="1011111";

when "0111"=>sm<="1110000";

when "1000"=>sm<="1111111";

when "1001"=>sm<="1111011";

when others=>sm<="0000000";

end case;

end process p3;

end art;

附引脚设置:

端口名称ck clk duan5-0 sel1,sel0 sm6-0

引脚43 1 5-10 54,58 17-19,21-24