懒猫爱飞

VHDL周学习总结(二)--数码管动态显示

0
阅读(36260)

3月21晚上弄的是静态显示,今天俺就弄一个动态显示吧,因为俺以前弄过单片机,所以对动态显示和静态显示还是弄的比较清的,嘻嘻……不过俺当年学单片机时可以对这些概念一窍不通呀,呵呵,所以俺想学习VHDL一定弄好数电这一定是真理,如果连逻辑关系都弄不清,那还是不要弄VHDL了,下面把俺消化的例子弄上来:

--------------------------------------------------------------------------------------------
--这是俺的第二个程序,采用共阴极数码管
--每天进步一点点,开心一大点^_^
--功能:LED动态显示
--作者:萤火虫II号
--日期:2010.03.22
--------------------------------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY dynamic IS
 PORT(clk: IN STD_LOGIC;    ---输入时钟信号
    reset: IN  STD_LOGIC;  ---复位信号
    din1:  IN  STD_LOGIC_VECTOR(6 DOWNTO 0);   ---译码后的数据信号1(4位2进制数据)
                 ---我把它改成就用一个数据通道,只换位选
                 ---来达到动态显示的目的,这样才更有动态的意思,嘻嘻……
   --din2:  IN  STD_LOGIC_VECTOR(6 DOWNTO 0);  ---译码后的数据信号2
    --din3:  IN  STD_LOGIC_VECTOR(6 DOWNTO 0); ---译码后的数据信号3
    --din4:  IN  STD_LOGIC_VECTOR(6 DOWNTO 0); ---译码后的数据信号4
    shift: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); ----位选信号
    Q:  OUT STD_LOGIC_VECTOR(6 DOWNTO 0)  ----数据信号 
    );
END dynamic;
ARCHITECTURE behavioral OF dynamic IS
 SIGNAL scan_clk: STD_LOGIC_VECTOR(1 DOWNTO 0);
 BEGIN
 PROCESS(clk,scan_clk,reset)         ----分频进程
  variable scan: STD_LOGIC_VECTOR(5 DOWNTO 0);
 BEGIN
  IF reset='1' THEN
     scan:="000000";
     scan_clk<="00";
  ELSIF clk'event and clk='1' then
   scan:=scan+1;
  END IF;
    scan_clk<=scan(5 downto 4);
  END PROCESS;
  PROCESS (scan_clk,din1)  ---扫描进程PROCESS (scan_clk,din1,din2,din3,din4)(原来是这样写的^_^)
  BEGIN
   CASE scan_clk IS
    WHEN "00"=> Q <=din1;shift<="1110";  ---原程序上是共阳极数码管,我改成共阴极了
    WHEN "01"=> Q <=din1;shift<="1101";
    WHEN "10"=> Q <=din1;shift<="1011";
    WHEN "11"=> Q <=din1;shift<="0111";
    WHEN OTHERS=> Q <="0000000";shift<="1111";
   END CASE;
  END PROCESS;
END behavioral;
 
      以前没有弄过分频语句,现在终于又学会了一招,呵呵……
      还是俺那句口号:
      每天进步一点点,开心多一点^_^