异步十二进制加减计数器 课程设计报告.docx
《异步十二进制加减计数器 课程设计报告.docx》由会员分享,可在线阅读,更多相关《异步十二进制加减计数器 课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
异步十二进制加减计数器课程设计报告
集成电路课设报告
VHDL语言描述能力强,覆盖面广,抽象能力强,所以用VHDL语言作为硬件模型建模很合适。
设计者的原始描述是非常简练的硬件描述,经过EDA工具综合处理,最终生成付诸生产的电路描述或版图参数描述的工艺文件。
整个过程通过EDA工具自动完成,大大减轻了设计人员的工作强度,提高了设计质量,减少了出错的机会。
VHDL语言可读性好。
VHDL既能被人容易读懂又能被计算机识别,作为技术人员编写的原文件,既是计算机程序、技术文档和技术人员硬件信息交流文件,又是签约双方的合同文件。
VHDL语言中设计实体、程序包、设计库,为设计人员重复利用别人的设计提供了设计手段。
重复利用他人的IP模块和软核是VHDL的特色,许多设计不必个个都从头再来,只要在更高层次上IP模块利用起来,就能达到事半功倍的效果。
本实验就是用VHDL语言设计一个异步十二进制加减计数器。
一、题目:
异步十二进制加减计数器
二、电路工作原理
所谓计数器就是指能够记忆时钟信号脉冲个数的时序逻辑电路,它是数字电路中应用及其广泛的一种基本逻辑单元,不仅能用于脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。
其原理就是将几个触发器按照一定的顺序连接起来,然后根据触发器的状态按照一定的规律随时钟信号的变化来记忆时钟的个数。
1、同步计数器和异步计数器
名称
时钟提供
功能实现过程
缺点
优点
异步计数器
往往高位触发器的时钟信号由低位触发器的输出提供
在低位触发器翻转后高位触发器才能翻转
计数速度比较慢。
由于各触发器输出存在偏移,对各触发器的输出的译码输出会出现尖峰信号
结构简单,所用元件较少
同步计数器
同一脉冲提供
各触发器同时翻转。
其最高工作频率只和触发器传输延迟以及有关控制门传输延迟之和有关
其工作频率比异步计数器要高。
由于采用同一脉冲控制,可有效减小译码后产生的尖峰信号宽度
结构比较复杂,所用元件较多
根据计数器脉冲引入方式的不同,计数器分为同步计数器和异步计数器两大类。
(功能比较如下表所示)
其中同步计数器是将计数脉冲同时引入到各级触发器,当输入计数时钟脉冲触发时,各级触发器的状态同时发生转移,而异步计数器是将计数器的低位计数触发器的输出作为相邻计数触发器的时钟脉冲,这样逐级串行连接起来的一类计数器。
也就是说,每一个触发器的翻转时刻并不是由时钟信号来同步的,而是由它下一位触发器的输出决定的。
2、置“0”方式——异步置“0”和同步置“0”
异步置“0”方式:
其置零信号Rd是经缓冲门直接加在触发器的R端的。
同步置“0”方式:
当置“0”信号到达时,计数器并不立即置“0”,而是在有CP脉冲上升沿到来时,电路才被置零。
可逆计数器就是指在输入时钟信号脉冲的控制下,既可以进行递增计数也可以进行递减计数的一类特殊计数器。
对于具体的可你计数器来说,需要定义一个用来控制计数器方向的控制端口updown:
当控制端口updown的值为逻辑‘1’时,可逆计数器进行加1操作,即递增计数,当控制端口updown的值为逻辑‘0’时,可逆计数器进行减1操作,即递减计数。
可逆计数器真值表:
Rd(Clr)
UPDOWN
CP(Clk)
Q0——Q3
0
X
X
0000
1
1
下降沿
加1操作
1
0
下降沿
减1操作
通过上述分析就可以明确地了解:
程序1是异步置0的同步可逆计数器
程序2是由低位触发器的输出提供高位触发器的时钟信号的,从而实现了异步加减计数。
三、VHDL设计思路与程序
(一)程序1
1、VHDL设计思路
设计中,CP是时钟输入端,下降沿有效;Rd为清零控制端,低电平有效;updown为计数方式控制端,updown=“1”时作加法计数,updown=“0”时作减法计数。
在计数工作之前,先由Rd给一个清零信号,使四个数据输入值都为“0”。
y3,y2,y1,y0为四个数据输出端,这就实现了异步清零。
当updown=“1”,Rd=“1”时,计数器进行加法计数,即从“0000”依次计数到“1011”,当updown=“0”,Rd=“1”时,计数器进行减法计数。
2、源程序及注释
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityyuis实体说明
port(cp,rd,updown:
instd_logic;定义端口
q:
outstd_logic_vector(3downto0));
endyu;
architectureyuofyuis结构体
signaly:
std_logic_vector(3downto0);定义信号
begin
process(cp,rd)进程开始
begin
ifrd='0'then清零
y<="0000";
else
if(cp'eventandcp='0')then时钟信号为下降沿时
if(updown='1')then进行加法计数
ify="1011"then到11有进位,清零
y<="0000";
else
y<=y+1;结果加1
endif;
else否则进行减法计数
ify="0000"then到0有借位
y<="1011";
else
y<=y-1;结果减1
endif;
endif;
endif;
endif;
endprocess;进程结束
q<=y;输出结果
endyu;程序结束
(二)程序2
1、VHDL设计思路
设计中,clk是时钟输入端,上升沿有效;updn为计数方式控制端,updn=“1”时作加法计数,updn=“0”时作减法计数;c是进位/借位输出端;c0为个位最高位输出。
在计数工作之前,个位q和十位k全部置0。
个位由时钟上升沿触发加/减1,十位由个位的进位/借位触发,从而实现十位的变化,即异步可逆计数。
当updown=“1”时,计数器进行加法计数,个位从“0”依次计数到“9”,进位,十位由“0”到“1”,当计数到11时清零;同理,当updown=“0”时,计数器进行减法计数。
2、源程序及注释
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityyu1is
port(clk,updn:
instd_logic;
c:
outstd_logic;
y0,y1:
outstd_logic_vector(3downto0));
endyu1;
architectureyu1ofyu1is
signalq:
std_logic_vector(3downto0):
="0000";个位q赋初值为0
signalk:
std_logic_vector(3downto0):
="0000";十位k赋初值为0
signalc0,c1:
std_logic;
begin
process(updn,clk)个位的进程
begin
ifupdn='1'then进行加法计数
ifq=1andk=1then到11时,有进位输出信号C1
c1<='1';
else
c1<='0';
endif;
ifclk'eventandclk='1'then时钟端为上升沿时
ifc1='1'orq=9then有进位输出信号C1,即到11时
q<="0000";或个位到9该进位时,个位清零
else
q<=q+1;个位加1
endif;
endif;
else进行减法计数
ifclk'eventandclk='1'then
ifq=0andk=0then到0时
c1<='1';有借位输出信号,输出11
q<="0001";即个位q置1
elsifq=0andk=1then到10,减1,个位输出9
q<="1001";
c1<='0';
else
q<=q-1;
c1<='0';
endif;
endif;
endif;
y0<=q;个位输出
c0<=q(3);个位最高位输出
endprocess;
process(c0,c1)十位的进程
begin
ifupdn='1'then
ifc1'eventandc1='0'then
k<="0000";
elsifc0'eventandc0='0'then个位由9加1进位,变为0时
k<="0001";十位k置1
endif;
else
ifc1='1'then
k<="0001";
elsifc0'eventandc0='1'then个位由0减1到借位,变为9时
k<="0000";十位k置0
endif;
endif;
endprocess;
y1<=k;
c<=c1;
endyu1;
四、仿真验证程序与仿真结果
(一)测试程序1
1、仿真验证程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityt_yuis
endt_yu;
architecturet_yuoft_yuis
componentyuis
port(cp,rd,updown:
instd_logic;
q:
outstd_logic_vector(3downto0));
endcomponent;
signalcp:
std_logic:
='0';
signalrd:
std_logic;
signalupdown:
std_logic;
signalq:
std_logic_vector(3downto0);
begin
u0:
yuportmap(cp,rd,updown,q);
cp<=notcpafter50ns;
rd<='0','1'after300ns;
updown<='0','1'after200ns,'0'after1600ns;
endt_yu;
2、仿真结果:
下图所示为异步十二进制加减计数器的波形图:
(二)测试程序2
1、仿真验证程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityt_yu1is
endt_yu1;
architecturet_yu1oft_yu1is
componentyu1is
port(clk,updn:
instd_logic;
c:
outstd_logic;
y0,y1:
outstd_logic_vector(3downto0));
endcomponent;
signalclk:
std_logic:
='0';
signalupdn:
std_logic;
signalc:
std_logic;
signaly0:
std_logic_vector(3downto0);
signaly1:
std_logic_vector(3downto0);
begin
u0:
yu1portmap(clk,updn,c,y0,y1);
clk<=notclkafter50ns;
updn<='1','0'after2000ns;
endt_yu1;
2、仿真结果:
下图所示为异步十二进制加减计数器的波形图:
五、逻辑综合
逻辑综合,就是将较高抽象层次的描述自动的转换到较低抽象层次描述的一种方法,就现有技术而言,就是将RTL级也就是行为级的描述转换成门级网表的过程。
其输入为RTL级描述程序,约束条件,支持工艺库等,输出是门级网表或电路图。
1、所用工具:
SynplifyPro7.1
2、综合结果及分析
编写完程序成后,用synoplify软件进行逻辑综合,先加载子程序再加载主程序进行逻辑综合后得出电路图。
综合结果电路图:
综合结果电路图比想象中的电路图要复杂很多,多处与非门的应用使电路功能与设计要求相符。
synoplify软件逻辑综合完后,还可观察一些元件的内部结构电路图,三个D触发器的内部都可以显示。
以下是它们的内部结构电路图(由于完全相同,只给出了其中一个的内部电路图):
下表为同步D触发器功能表:
Rd非
Sd非
CP
D
Q
Q非
0
1
X
X
0
1
1
0
X
X
1
0
1
1
上升
0
0
1
1
1
上升
1
1
0
由上表所知,当CP处于上升沿时,D触发器发生状态转移变化。
D触发器逻辑图如下图(a)所示。
它由六个“与非”门组成,其中G1,G2组成基本触发器,G3,G4组成时钟控制电路,G5,G6组成数据输入电路。
如上图所示,D触发器具有在时钟脉冲上升沿触发的特点,其逻辑功能为:
输出端Q的状态随着输入端D的状态而变化,但总比输入端状态的变化晚一步,即某个时钟脉冲来到之后Q的状态和该脉冲来到之前D的状态一样。
其图形符号,状态表和工作波形图如上图(b),(c)和(d)所示。
为了与下降沿触发相区别,在图形符号中时钟脉冲C输入端靠近方框处不加小圆圈。
在对D触发器的工作原理进行回忆性了解后,可以知道应用四个带有置数端的D触发器可以实现最多十六进制计数器(JK触发器也可)。
所以得出结论:
最终的电路主体应该是由四个触发器构成的,与所得到的电路图相符。
六、收获体会
这次课设已经结束,通过这次课程设计,我学到了许多新的知识,其中对VHDL设计有了一定的初步认识。
VHDL语言作为一种标准的硬件描述语言,具有结构严谨,描述力强的特点,其语法结构以严谨著称,适合于复杂逻辑电路的设计。
由于VHDL语言来源于计算机高级语言,所以在VHDL语言中保留了部分高级语言的原语句,如if语句,子程序和函数等,便于阅读和应用。
从这次集成电路课程设计中我对VLSI也有了一个感性的认识,初步掌握了EDA的设计思路和设计流程。
本次课设使用的EDA工具主要是中国华大集成电路设计公司开发的Zeni系统,该系统是一种主要面向全定制及半定制大规模集成电路设计的综合开发环境。
通过在Zeni系统环境中的上机操作,我基本掌握了该系统的应用。
这次课设的题目并不难,老师的目的主要是让我们熟悉设计的过程。
主要是靠自己通过查书,上网等多种途径查找自己设计所需要的知识和一些设计参数,培养自己动手解决问题的能力。
而且经过理论论证之后还要进行计算机的仿真,以便证明设计方案的可行性。
这之中会遇到许多问题,有些是在课本上学不到的,需要我们利用理论知识并且结合实践过程进行分析和解决。
这就需要我们有扎实的理论基础,同时又要具有设计的创新性和灵活性,而且也要具备每一个设计人员都应具备的耐心,细心,反应敏捷等设计素养。
虽然现在做的题目还很容易和幼稚,但每一项大的工程都是由一部分一部分的基本因素所组成的,如果使一个大的工程成功,就必须搞好每一小部分的工程,使它们协调一致,构成一个有机的整体。
而我们的任务则是设计,调试每一个小的部分,而最终组成一个大的工程。
能否成为一个好的设计人员,主要取决于理论知识是否扎实和实践是否成功。
现在所做的课设其目的就是培养我们的实践能力,为今后的就业做准备。
总之,课程设计是一门非常重要的实践课程,考验了我们的动手能力,激发了我们的学习兴趣。
教会我们用科学的严谨认真的精神去解决问题,几周的课设教会了我许多知识和技能,使我知道干任何事情都要专心和耐心,这是我以后投入工作时最需要的和最必要的,要想成为一个合格的设计人员就一定要从现在开始努力。