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