计数器的VHDL设计

简介: 计数器的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电路图微信图片_20221012173711.png

(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 时序仿真波形图微信图片_20221012173714.png

微信图片_20221012173716.png

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为信号,因为在结构体里面信号具有全局性,它能将一个进程中的数据带入另一个进程。

做出的时序仿真波形如下图:

微信图片_20221012173818.png

(注:我的这个时序仿真是十四进制的计数器,就是在上面的程序上面改了两个参数,可以试着自己探索一下,有问题了问我哈哈)

相关文章
|
存储 开发工具 异构计算
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(下)
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑
856 0
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(下)
|
5月前
LabVIEW编程NI 6602计数器DMA冲突例程与相关资料
LabVIEW编程NI 6602计数器DMA冲突例程与相关资料
47 7
|
芯片 异构计算
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
254 0
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
|
存储 缓存 算法
m基于FPGA的交织解交织系统verilog实现,包含testbench
m基于FPGA的交织解交织系统verilog实现,包含testbench
295 0
|
算法 关系型数据库 MySQL
FPGA:Verilog HDL程序的基本结构
FPGA:Verilog HDL程序的基本结构
160 0
FPGA:Verilog HDL程序的基本结构
|
算法 异构计算
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
303 0
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
|
开发工具 芯片 异构计算
Verilog 设计方法
Verilog 的设计多采用自上而下的设计方法(top-down)。即先定义顶层模块功能,进而分析要构成顶层模块的必要子模块;然后进一步对各个模块进行分解、设计,直到到达无法进一步分解的底层功能块。这样,可以把一个较大的系统,细化成多个小系统,从时间、工作量上分配给更多的人员去设计,从而提高了设计速度,缩短了开发周期。
152 1
|
移动开发 算法 异构计算
m基于FPGA的半带滤波器verilog设计,对比普通结构以及乘法器复用结构
m基于FPGA的半带滤波器verilog设计,对比普通结构以及乘法器复用结构
286 0
m基于FPGA的半带滤波器verilog设计,对比普通结构以及乘法器复用结构
|
异构计算
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(中)
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑
292 0
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(中)
|
算法 芯片 计算机视觉
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(上)
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑
842 0
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(上)