求各位大侠看个VHDL程序 解释下为什么这个下载后LED全亮无变化
在线等libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_log...
在线等
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity clight is --实体开始
port (clk1:in std_logic; --定义时钟
light:buffer std_logic_vector(7 downto 0)); --彩灯输出端定义
end; --实体结束
architecture behave of clight is --结构体开始
constant len: integer:=7; --定义常量len
signal banner: std_logic:='0'; --定义信号banner为两种节拍转换信号
signal clk,clk2:std_logic; --定义信号clk,clk2作为辅助时钟信号
begin
process (clk1) --进程开始,由clk1二分频得到clk2
begin
if (clk1'event and clk1='1') then
clk2<=not clk2;
end if;
end process;
process (clk1,clk2,banner) --进程开始,实现彩灯循环
variable flag:bit_vector(2 downto 0):="000"; --定义标志变量flag
begin
clk<=(clk1 and banner) or (clk2 and not banner); --实现时钟clk,包括两种循环节拍clk1和clk2
if (clk'event and clk='1') then
if flag="000" then --第一种花型,顺序
light<='1'&light(len downto 1);
if light(1)='1' then flag:="001"; --彩灯全亮后,将flag赋值为001
end if;
elsif flag="001" then --第一花型,逆序
light<=light(len-1 downto 0)&'0';
if light(6)='0' then flag:="010"; --彩灯全灭后,将flag赋值为010
end if;
elsif flag="010" then --第二花型,渐亮
light(len downto 4)<=light(len-1 downto 4)&'1';
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then flag:="011"; --彩灯全亮后,将flag赋值为011
end if;
elsif flag="011" then --第二种花型,渐灭
light(len downto 4)<='0'&light(len downto 5);
light(len-4 downto 0)<=light(len-5 downto 0)&'0';
if light(2)='0' then flag:="100"; --彩灯全灭后,将flag赋值为100
end if;
elsif flag="100" then --第三花型
light(len downto 4)<='1'&light(len downto 5);
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then flag:="101"; --彩灯全亮后,将flag赋值为101
end if;
elsif flag="101" then
light<="00000000";
flag:="110"; --彩灯全灭后,将flag赋值为110
elsif flag="110" then --实现banner信号转换,实现第二种节拍
banner<=not banner;
flag:="000"; --所有过程结束,将flag置初始值
end if;
end if;
end process; --进程结束
end behave; --结构体结束
也可能是下载没有效果 开发板LED打开后就是全亮 哪位大侠能够详细给小弟解释下花型变换那部分 谢谢
顺便指点下用MAX_II_EPM240-570 开发板 要想去控制LED灯的熄灭 具体流程怎样 再加点悬赏 求教
分频改了还是看不到的 展开
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity clight is --实体开始
port (clk1:in std_logic; --定义时钟
light:buffer std_logic_vector(7 downto 0)); --彩灯输出端定义
end; --实体结束
architecture behave of clight is --结构体开始
constant len: integer:=7; --定义常量len
signal banner: std_logic:='0'; --定义信号banner为两种节拍转换信号
signal clk,clk2:std_logic; --定义信号clk,clk2作为辅助时钟信号
begin
process (clk1) --进程开始,由clk1二分频得到clk2
begin
if (clk1'event and clk1='1') then
clk2<=not clk2;
end if;
end process;
process (clk1,clk2,banner) --进程开始,实现彩灯循环
variable flag:bit_vector(2 downto 0):="000"; --定义标志变量flag
begin
clk<=(clk1 and banner) or (clk2 and not banner); --实现时钟clk,包括两种循环节拍clk1和clk2
if (clk'event and clk='1') then
if flag="000" then --第一种花型,顺序
light<='1'&light(len downto 1);
if light(1)='1' then flag:="001"; --彩灯全亮后,将flag赋值为001
end if;
elsif flag="001" then --第一花型,逆序
light<=light(len-1 downto 0)&'0';
if light(6)='0' then flag:="010"; --彩灯全灭后,将flag赋值为010
end if;
elsif flag="010" then --第二花型,渐亮
light(len downto 4)<=light(len-1 downto 4)&'1';
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then flag:="011"; --彩灯全亮后,将flag赋值为011
end if;
elsif flag="011" then --第二种花型,渐灭
light(len downto 4)<='0'&light(len downto 5);
light(len-4 downto 0)<=light(len-5 downto 0)&'0';
if light(2)='0' then flag:="100"; --彩灯全灭后,将flag赋值为100
end if;
elsif flag="100" then --第三花型
light(len downto 4)<='1'&light(len downto 5);
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then flag:="101"; --彩灯全亮后,将flag赋值为101
end if;
elsif flag="101" then
light<="00000000";
flag:="110"; --彩灯全灭后,将flag赋值为110
elsif flag="110" then --实现banner信号转换,实现第二种节拍
banner<=not banner;
flag:="000"; --所有过程结束,将flag置初始值
end if;
end if;
end process; --进程结束
end behave; --结构体结束
也可能是下载没有效果 开发板LED打开后就是全亮 哪位大侠能够详细给小弟解释下花型变换那部分 谢谢
顺便指点下用MAX_II_EPM240-570 开发板 要想去控制LED灯的熄灭 具体流程怎样 再加点悬赏 求教
分频改了还是看不到的 展开
2个回答
展开全部
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity WATER_LED is --实体开始
port (
clk:in std_logic; --定义时钟 ,我的是50Mhz的时钟
led:out std_logic_vector(7 downto 0)
);
end WATER_LED; --实体结束
architecture behave of WATER_LED is --结构体开始
signal light :std_logic_vector(7 downto 0);--中间信号,在程序中主要处理的对象,程序开始的时候是00000000
constant len: integer:=7; --定义常量len
signal banner: std_logic:='0'; --定义信号banner为两种节拍转换信号
signal clk1,clk2,clk3:std_logic; --定义信号clk1,clk2作为辅助时钟信号
begin
process (clk) --进程开始,由clk分得10hz clk1 和 5hz clk2
variable a:natural:=1;
variable b:natural:=1;
begin
if (clk'event and clk='1') then
if(a=2500000)then
a:=1;
clk1<=not clk1;
else
a:=a+1;
end if;
if(b=5000000)then
b:=1;
clk2<=not clk2;
else
b:=b+1;
end if;
end if;
end process;
process (clk1,clk2,banner) --进程开始,实现彩灯循环
variable flag:natural:=0; --定义标志变量flag
begin
clk3<=(clk1 and banner) or (clk2 and not banner); --实现时钟clk3,包括两种循环节拍clk1和clk2
if (clk3'event and clk3='1') then
if(flag=0)then --第一种花型,顺序
light<='1'&light(len downto 1);
if light(1)='1' then
flag:=1; --彩灯全亮后,将flag赋值为1
end if;
elsif(flag=1)then --第一花型,逆序
light<=light(len-1 downto 0)&'0';
if light(6)='0' then
flag:=2; --彩灯全灭后,将flag赋值为2
end if;
elsif(flag=2)then --第二花型,渐亮
light(len downto 4)<=light(len-1 downto 4)&'1';
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then
flag:=3; --彩灯全亮后,将flag赋值3
end if;
elsif(flag=3)then --第二种花型,渐灭
light(len downto 4)<='0'&light(len downto 5);
light(len-4 downto 0)<=light(len-5 downto 0)&'0';
if light(2)='0' then flag:=4; --彩灯全灭后,将flag赋值为4
end if;
elsif(flag=4)then --第三花型
light(len downto 4)<='1'&light(len downto 5);
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then
flag:=5; --彩灯全亮后,将flag赋值为5
end if;
elsif(flag=5)then
light<="00000000";
flag:=6; --彩灯全灭后,将flag赋值为6
elsif(flag=6)then --实现banner信号转换,实现第二种节拍
banner<=not banner;
flag:=0; --所有过程结束,将flag置初始值
end if;
end if;
led<=light;--将中间信号的值赋给输出端
end process; --进程结束
end behave; --结构体结束
第一种花型,顺序
light<='1'&light(len downto 1);
00000000=>10000000=>11000000......=>11111111
第一种花型,逆序
light<='1'&light(len downto 1);
00000000<=10000000<=11000000......<=11111111
第二种花型 渐亮
light(len downto 4)<=light(len-1 downto 4)&'1';
前四位的变化
0000=>0001=>0011=>0111=>1111
light(len-4 downto 0)<='1'&light(len-4 downto 1);
后四位的变化
0000=>1000=>1100=>1110=>1111
写到一起看
00000000=>10000001=>11000011=>11100111=>11111111
第二种花型 渐灭
light(len downto 4)<='0'&light(len downto 5);
前四位的变化
1111=>0111=>0011=>0001=>0000
light(len-4 downto 0)<=light(len-5 downto 0)&'0';
后四位的变化
1111=>1110=>1100=>1000=>0000
写到一起看
00000000<=10000001<=11000011<=11100111<=11111111
第三花型
light(len downto 4)<='1'&light(len downto 5);
1000=>1100=>1110=>1111
light(len-4 downto 0)<='1'&light(len-4 downto 1);
1000=>1100=>1110=>1111
最后说洗一下:
我把分得频率降下来了,频率太高,人眼就看不到变化了;
variable: 变量名:类型:=初值;
signal: 信号名:类型:=初值;
这两个的类型要注意,不要弄混了。
要看到比较好的效果,就一定要把频率调好
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity WATER_LED is --实体开始
port (
clk:in std_logic; --定义时钟 ,我的是50Mhz的时钟
led:out std_logic_vector(7 downto 0)
);
end WATER_LED; --实体结束
architecture behave of WATER_LED is --结构体开始
signal light :std_logic_vector(7 downto 0);--中间信号,在程序中主要处理的对象,程序开始的时候是00000000
constant len: integer:=7; --定义常量len
signal banner: std_logic:='0'; --定义信号banner为两种节拍转换信号
signal clk1,clk2,clk3:std_logic; --定义信号clk1,clk2作为辅助时钟信号
begin
process (clk) --进程开始,由clk分得10hz clk1 和 5hz clk2
variable a:natural:=1;
variable b:natural:=1;
begin
if (clk'event and clk='1') then
if(a=2500000)then
a:=1;
clk1<=not clk1;
else
a:=a+1;
end if;
if(b=5000000)then
b:=1;
clk2<=not clk2;
else
b:=b+1;
end if;
end if;
end process;
process (clk1,clk2,banner) --进程开始,实现彩灯循环
variable flag:natural:=0; --定义标志变量flag
begin
clk3<=(clk1 and banner) or (clk2 and not banner); --实现时钟clk3,包括两种循环节拍clk1和clk2
if (clk3'event and clk3='1') then
if(flag=0)then --第一种花型,顺序
light<='1'&light(len downto 1);
if light(1)='1' then
flag:=1; --彩灯全亮后,将flag赋值为1
end if;
elsif(flag=1)then --第一花型,逆序
light<=light(len-1 downto 0)&'0';
if light(6)='0' then
flag:=2; --彩灯全灭后,将flag赋值为2
end if;
elsif(flag=2)then --第二花型,渐亮
light(len downto 4)<=light(len-1 downto 4)&'1';
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then
flag:=3; --彩灯全亮后,将flag赋值3
end if;
elsif(flag=3)then --第二种花型,渐灭
light(len downto 4)<='0'&light(len downto 5);
light(len-4 downto 0)<=light(len-5 downto 0)&'0';
if light(2)='0' then flag:=4; --彩灯全灭后,将flag赋值为4
end if;
elsif(flag=4)then --第三花型
light(len downto 4)<='1'&light(len downto 5);
light(len-4 downto 0)<='1'&light(len-4 downto 1);
if light(1)='1' then
flag:=5; --彩灯全亮后,将flag赋值为5
end if;
elsif(flag=5)then
light<="00000000";
flag:=6; --彩灯全灭后,将flag赋值为6
elsif(flag=6)then --实现banner信号转换,实现第二种节拍
banner<=not banner;
flag:=0; --所有过程结束,将flag置初始值
end if;
end if;
led<=light;--将中间信号的值赋给输出端
end process; --进程结束
end behave; --结构体结束
第一种花型,顺序
light<='1'&light(len downto 1);
00000000=>10000000=>11000000......=>11111111
第一种花型,逆序
light<='1'&light(len downto 1);
00000000<=10000000<=11000000......<=11111111
第二种花型 渐亮
light(len downto 4)<=light(len-1 downto 4)&'1';
前四位的变化
0000=>0001=>0011=>0111=>1111
light(len-4 downto 0)<='1'&light(len-4 downto 1);
后四位的变化
0000=>1000=>1100=>1110=>1111
写到一起看
00000000=>10000001=>11000011=>11100111=>11111111
第二种花型 渐灭
light(len downto 4)<='0'&light(len downto 5);
前四位的变化
1111=>0111=>0011=>0001=>0000
light(len-4 downto 0)<=light(len-5 downto 0)&'0';
后四位的变化
1111=>1110=>1100=>1000=>0000
写到一起看
00000000<=10000001<=11000011<=11100111<=11111111
第三花型
light(len downto 4)<='1'&light(len downto 5);
1000=>1100=>1110=>1111
light(len-4 downto 0)<='1'&light(len-4 downto 1);
1000=>1100=>1110=>1111
最后说洗一下:
我把分得频率降下来了,频率太高,人眼就看不到变化了;
variable: 变量名:类型:=初值;
signal: 信号名:类型:=初值;
这两个的类型要注意,不要弄混了。
要看到比较好的效果,就一定要把频率调好
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询