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

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

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

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
    下载

相关推荐