计数器的VHDL设计

创建工程啥的就不说了哈哈,我就直接上代码和思路分析了

1、实用计数器的VHDL设计

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
  PORT (CLK,RST,EN,LOAD:IN STD_LOGIC;
       DATA:IN STD_LOGIC_VECTOR(0 to 3);--四位预置数
		 DOUT:OUT STD_LOGIC_VECTOR(0 to 3);--计数值输出
		 COUT:OUT STD_LOGIC );--计数进位输出
ENd CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN 
  PROCESS(CLK,RST,EN,LOAD)
    VARIABLE Q:STD_LOGIC_VECTOR(0 to 3) ;
BEGIN
   IF RST='0' THEN Q:=(OTHERS=>'0');--复位低电平时,计数寄存器清0
	ELSIF CLK'EVENt AND CLK='1' THEN--测试时钟上升沿
	  IF EN='1' THEN                --计数使能高电平,允许计数
	    IF(LOAD='0')THEN Q:=DATA;ELSE--预置控制低电平,允许加载
		  IF Q<9 THEN Q:=Q+1;        --计数小于9,继续累加
		    ELSE Q:=(OTHERS=>'0');   --否则计数器清0
		   END IF;
		  END IF;
		END IF;
	 END IF;
	 IF Q="1011"THEN COUT<='1';--当计数器为9时,进位输出1
	   ELSE COUT <='0';        --否则进位输出为0
	 END IF;                   --计数寄存器的值输出端口
    DOUT <= Q;
	END PROCESS;
END behav;
	

提醒:PROCESS(CLK,RST,EN,LOAD)括号里面的输入量称为敏感信号,任何一个敏感信号发生变化则进程语句被启动。
1.1实用计数器的RTL电路图在这里插入图片描述

(1)第一个IF语句中的条件语句IF CQI<9 THEN构成了比较器。
(2)语句IF RST=‘0’ THEN Q:=(OTHERS=>‘0’)构成RST在锁存器上的异步清0端“CLR”。
(3)语句ELSE Q:=(OTHERS=>‘0’)构成了多路选择器。
(4)不完整的条件语句与语句Q:=Q+1构成了多路选择器。
(5)语句IF(LOAD=‘0’)THEN Q:=DATA构成了另一多路选择器。
(6)第二个IF语句构成了纯组合电路模块:4位数据比较器。
1.2 时序仿真波形图

在这里插入图片描述
在这里插入图片描述
1.3另一种设计方法"多进程写法"
代码如下:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
  PORT (CLK,RST,EN,LOAD:IN STD_LOGIC;
       DATA:IN STD_LOGIC_VECTOR(0 to 3);--四位预置数
		 DOUT:OUT STD_LOGIC_VECTOR(0 to 3);--计数值输出
		 COUT:OUT STD_LOGIC);--计数进位输出
ENd CNT10;
ARCHITECTURE behav OF CNT10 IS
SIGNAL Q:STD_LOGIC_VECTOR(0 to 3);
BEGIN
  REG:PROCESS(CLK,RST,EN,Q,LOAD) BEGIN--时序进程
   IF RST='0' THEN Q<=(OTHERS=>'0');--复位低电平时,计数寄存器清0
	  ELSIF CLK'EVENT AND CLK='1' THEN--测试时钟上升沿
	   IF EN='1' THEN                --计数使能高电平,允许计数
	    IF(LOAD='0')THEN Q<=DATA;ELSE--预置控制低电平,允许加载
		  IF Q<9 THEN Q<=Q+1;        --计数小于9,继续累加
		    ELSE Q<=(OTHERS=>'0');   --否则计数器清0
		   END IF;
		  END IF;
		END IF;
	 END IF;
  END PROCESS;
  DOUT <= Q;
  COM:PROCESS(Q) BEGIN --组合进程
	 IF Q="1011"THEN COUT<='1';--当计数器为9时,进位输出1
	   ELSE COUT <='0';        --否则进位输出为0
	 END IF;                   --计数寄存器的值输出端口
  END PROCESS;
END behav;

明显可以观察到第一种写法里有两个独立的IF语句,第一个产生的是计数器时序电路;第二个产生纯组合逻辑的多路选择器。从程序结构上面讲,更一般常用的表述就是将这两个独立的IF语句分别用两个独立的进程语句来表达,一个是时序进程,或时钟进程;另一个为组合进程。在这里面“SIGNAL Q:STD_LOGIC_VECTOR(0 to 3);”的含义是定义Q为信号,因为在结构体里面信号具有全局性,它能将一个进程中的数据带入另一个进程。
做出的时序仿真波形如下图:
在这里插入图片描述
(注:我的这个时序仿真是十四进制的计数器,就是在上面的程序上面改了两个参数,可以试着自己探索一下,有问题了问我哈哈)

  • 12
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信汪的美好生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值