集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2417|回复: 2

fpga实例集合(最具价值):LED控制VHDL程序与仿真,FPGA驱动LED静态显示

[复制链接]
ddr 发表于 2010-4-12 12:04:50 | 显示全部楼层 |阅读模式
--文件名:decoder.vhd

--功能:译码输出模块,LED为共阳接法

--最后修改日期:2004.3.24

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity decoder is

Port (seg:in std_logic_vector(3 downto 0 );   --四位二进制码输入

q3ut std_logic_vector(6 downto 0) );   --输出LED七段码

end decoder;



architecture Behavioral of decoder is

begin

process(seg)

begin

case seg is

when "0000" => q3<="0000001";--0   

when "0001" => q3<="1001111";--1

when "0010" => q3<="0010010";--2

when "0011" => q3<="0000110";--3

when "0100" => q3<="1001100" --4

when "0101" => q3<="0100100";--5

when "0110" => q3<="0100000";--6

when "0111" => q3<="0001111";--7

when "1000" => q3<="0000000";--8

when "1001" => q3<="0000100";--9

when others => q3<="1111111";

end case;

end process;

end Behavioral;
 楼主| ddr 发表于 2010-4-12 12:05:08 | 显示全部楼层
例2:FPGA驱动LED动态显示(4位)

--文件名:dynamic.vhd。

--功能:动态扫描模块,位选信号高电平有效。

--最后修改日期:2004.3.24。

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进制数据

通过例1中的decoder模块译码得到din1,din2,din3,din4)

       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);      --位选信号

       bus4 : 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(17 downto 0);

begin

if reset='1' then

scan:="000000000000000000";

       scan_clk<="00";

elsif clk'event and clk='1'then

scan:=scan+1;

end if;

       scan_clk<=scan(17 downto 16);

end process;



process(scan_clk,din1,din2,din3,din4)       --扫描进程

begin

case scan_clk is

when "00"=>

         bus4<=din1;

         shift<="0001";

       when "01"=>

         bus4<=din2;

         shift<="0010";

       when "10"=>

         bus4<=din3;

         shift<="0100";

when "11"=>

         bus4<=din4;

         shift<="1000";

       when others=> bus4<="0000000";shift<="0000";

end case;

end process;  



end Behavioral;
阿甘正传 发表于 2012-1-31 14:36:53 | 显示全部楼层
很好很强大!学习中,谢谢!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-18 19:51 , Processed in 0.134906 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表