• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

异步清零同步置数计数器设计VHDL代码ISE仿真

09/07 13:11
1462
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-2409291131232Z.doc

共1个文件

名称:异步清零同步置数计数器设计VHDL代码ISE仿真

软件:ISE

语言:VHDL

代码功能:

异步清零同步置数计数器

1.计数器类型和功能

计数器类型为异步清零,同步置数可调加减的十进制计数器。计数器除可正常进行加减功能计数外,还可在清零信号控制下异步清零,在Load信号控制下置数。计数器为十进制,即计数范围为0000~1001。

2.详细说明设计思路和工作原理

设计思路

根据计数器的接口框图和真值表分析,计数器的控制信号主要有3个,即RST、LD、U/D,当RST为0时,LD和U/D无效,即无论LD和U/D信号是0还是1,都执行异步复位功能;当RST为1,且LD也为1时,U/D无效,即无论U/D信号是0还是1,都执行Parallel Load功能,当RST为1,且LD为0时,U/D为0控制countdown,为1控制count up。由此可以得到如下的设计思路:采用带有优先级判断的if else 语句设计RST 和 LD功能,然后使用不带优先级的CASE when 语句设计U/D的功能。

工作原理

根据框图,计数器的顶层端口信号为LD、D3、D2、D1、D0、UD、RST、CLK、Q3、Q2、Q1、Q0,其中Q3~Q0为输出端口,其他为输入端口。使用Process进行整体功能控制,为实现RST异步复位功能,将RST作为最先判断的IF条件,当满足RST为0的条件时,输出0000,然后为了实现LD的同步置数功能,需要先加入同步时钟CLK信号,即使用CLK'EVENT AND CLK = '1'语句,使LD同步于CLK信号的上升沿。当LD为1,输出Q3~Q0;再用case when实现UD的功能,UD也是同步于CLK信号,因此也是在CLK'EVENT AND CLK = '1'判断语句里面,即CLK信号上升沿时计数器加1或者减1。当UD为0 时,为count down 功能,当为1时为count up 功能。由于是十进制计数器,计数范围为0000~1001,因此再计数的过程中,若计数值高于1001时需要变回0000,若计数值小于0000时需要变回1001。最终将计数值通过Q3、Q2、Q1、Q0端口输出。

3.仿真图分析

上图为异步清零,同步置数可调加减的十进制计数器的仿真图,图中可看到在0~50ns的时间段RST信号为低电平,对应的输出Q3~Q0均为低电平,实现了异步清零功能。在200ns~260ns的时间段,RST为高电平,LD信号为低电平应该执行同步置数功能,即输出Q3~Q0等于D3~D0,观察仿真图可以看到,

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

演示视频:

设计文档:

1. 工程文件

2. 程序文件

3. 程序编译

4. Testbench

5. 仿真图

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
--universal decimal counter
entity decimal_counter is
   port (
      LD   : in std_logic;-- Synchronous Parallel Load
  D3   : in std_logic;-- Parallel Data In
  D2   : in std_logic;-- Parallel Data In
  D1   : in std_logic;-- Parallel Data In
  D0   : in std_logic;-- Parallel Data In
  UD  : in std_logic;--Count up/down
  RST  : in std_logic;--Asynchronous Reset Input
  CLK  : in std_logic;--system clock
      Q3    : out std_logic;--Data Outputs
  Q2    : out std_logic;--Data Outputs
  Q1    : out std_logic;--Data Outputs
  Q0    : out std_logic--Data Outputs
   );
end decimal_counter;
ARCHITECTURE RTL OF decimal_counter is
   signal Q_out : std_logic_vector(3 downto 0);
begin
   
   process (CLK, RST)
   begin
      if (RST = '0') then--Asynchronous Reset
         Q_out <= "0000";
      elsif (CLK'EVENT AND CLK = '1') then
         if (LD = '1') then--Synchronous Parallel Load
            Q_out <= D3 & D2 & D1 & D0;
 else
 case UD is 
 when '0'=>--0 is down
if (Q_out = "0000") then--min
   Q_out <= "1001";
else
   Q_out <= Q_out - "0001";--sub
end if;
 when '1' =>--1 is up
if (Q_out = "1001")then--max
Q_out <= "0000";
else
Q_out <= Q_out + "0001";--add
end if;
 when others =>
  Q_out <= Q_out;
end case;

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1157

  • 2-2409291131232Z.doc
    下载

相关推荐