library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_unsignedall;
entity mycont is
generic (width: integer := 5);
port(clr,clk: in std_logic; --时钟
updown : in std_logic; --计数方式
q : out std_logic_vector(width downto 0)); --输出
end entity mycont;
architecture fh1 of mycont is
signal temp: std_logic_vector(width downto 0);
begin
N1:process(clr,clk)
begin
if clr = '1' then
if updown = '1' then --顺序计数初始化
for i in width to 0 loop --各位置0
temp(i) <= '0';
end loop;
elsif updown = '0' then --逆序计数初始化
for i in width to 0 loop --各位置1
temp(i) <= '1';
end loop;
end if;
elsif clk 'event and clk = '1' then --计数
if updown = '1' then --顺序计数
temp <= temp + '1';
elsif updown = '0' then --逆序计数
temp <= temp - '1';
end if;
end if;
end process N1;
q <= temp;
end architecture fh1;
试试上面这个描述,通过编译了,但未仿真。
library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_arithall;
use ieeestd_logic_unsignedall;
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: 信号名:类型:=初值;
这两个的类型要注意,不要弄混了。
要看到比较好的效果,就一定要把频率调好
以上就是关于用VHDL语言设计n位二进制计数器全部的内容,包括:用VHDL语言设计n位二进制计数器、求各位大侠看个VHDL程序 解释下为什么这个下载后LED全亮无变化、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)