创建工程啥的就不说了哈哈,我就直接上代码和思路分析了
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为信号,因为在结构体里面信号具有全局性,它能将一个进程中的数据带入另一个进程。
做出的时序仿真波形如下图:
(注:我的这个时序仿真是十四进制的计数器,就是在上面的程序上面改了两个参数,可以试着自己探索一下,有问题了问我哈哈)