用VHDL语言设计n位二进制计数器

用VHDL语言设计n位二进制计数器,第1张

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全亮无变化、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9621123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存