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;
以前没有弄过分频语句,现在终于又学会了一招,呵呵……
还是俺那句口号:
每天进步一点点,开心多一点^_^
xucun915_925777961 2010-11-28 22:03
用户612565 2010-11-26 15:33
用户404329 2010-11-26 15:32