名称:异步清零同步置数计数器设计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
1462