异步计数器.docx
《异步计数器.docx》由会员分享,可在线阅读,更多相关《异步计数器.docx(14页珍藏版)》请在冰豆网上搜索。
异步计数器
实验报告
SUNYAT-SENUNIVERSITY
院(系)信息科学与技术学院学号审批
专业计算机科学类实验人
实验题目:
计数器的设计年月日
1、实验目的
熟悉J-K触发器的逻辑功能,掌握J-K触发器构成异步计数器。
2、实验仪器及器件
Proteus7.8
ISEDesignSuite14.2
三、实验原理
四、实验内容
1、利用四个J-K触发器和门电路设计一个16进制异步计数器
2、利用四个J-K触发器和门电路设计一个具有74LS194功能的二进制四位计数器
3、用Verilog语言在ISE上实现时序逻辑电路
5、实验分析
1、设计16进制异步计数器时,其实相当于设计除频功能。
因为J-K触发器只在上升沿和下降沿输出的波形发生变化,只要在需要变化的时候实现反转功能就可以。
所以将J-k触发器的J、K输入端都接高电平,由于74LS73时钟输入端是低电平有效,所以要将前一个的输出端Q作为下一个J-K触发器的时钟输出端。
在proteus上实现如下:
输出波形如图:
其中A1为时钟信号,A3,A5,A7,A9,分别为四个j-k触发器的Q输出端的波形。
2、设计具有置零,保持,左移,右移,并行送数功能的二进制四位计数器模仿74LS194的功能。
74LS194功能表
~Cr
S1
S0
工作状态
0
X
X
置零
1
0
0
保持
1
0
1
右移
1
1
0
左移
1
1
1
并行送数
保持时,Q的输出为原来的状态
左移时,Q的输出为右边J—K触发器原来的状态(第一个触发器的输出由左移数据输入端Dsl确定。
)
右移时,Q的输出为左边的J-K触发器原来的状态(最后一个触发器的输出由右移数据输入端Dsr确定。
)
保持时,Q的输出由并行数据输入端D0~D3确定。
分析:
只要确定J为要输出的状态,K为J的取反,就可以让输出Q为要输出的状态。
S1S0
J
K
00
Qn
~Qn
01
Qn-1
~Qn-1
10
Qn+1
~Qn+1
11
Dn
~Dn
用四选一数据选择器确定J的输入。
位选端由S1S0确定。
用74LS197作为并行数据输入
用proteus设计如下(用开关控制S1,S0的输入):
实验结果如下:
其中A0为时钟信号,A1,A2为S1,S0,A3~A6为Q0~Q3,
A9为左移数据输入端,A10为右移数据输入端,A11~A14为并行数据输入端D0~D3.
~CR为0,置零:
~Cr为1,S1=0,S0=0:
~Cr为1,S1=0,S0=1,右移:
~Cr为1,S1=1,S0=0,左移:
~Cr为1,S1=1,S0=1,并行送数:
实验过程出现的问题及解决方案:
1、设计74LS194时,刚开始没有考虑到用四选一数据选择器,分析出J=(~S1)(~S0)Qn+(~S1)S0Qn-1+S1(~S0)Qn+1+S1S0Dn后直接想用门电路来确定J,但是这样所需要的门电路太多,连线也较为复杂,所以改用74LS153四选一数据选择器。
2、在设计S1,S0的输入的时候,只有设置高电平输入。
但是开关断开时并没有输入,导致错误。
3、左移数据和右移数据的输入,刚开始都是接时钟输入,但是此时J、K的变化与时钟同步,输出并没有发生改变,所以改接其他输入。
3、用Verilog在ISE上实现十六进制计数器(74LS197)和移位寄存器(74LS194)
过程:
1、新建工程,输入工程名
2、新建文件,类型选择VerilogModule
3、编辑顶层模块代码
4、新建文件,类型选择VerilogModule,分别编辑74ls197和74ls194子模块代码。
5、对文件进行综合
6、新建仿真文件,文件类型为VerilogTestFixture选择仿真的模块,(如图)
7、修改仿真文件的时序逻辑部分
8、进行仿真
实验结果:
74LS197
74LS194
实验过程出现的问题及解决:
仿真结果显示的只有前四个周期的波形
解决:
将仿真软件的这个地方的时间从1.00us调为10.00us。
实验总结与体会:
本次实验在proteus上用J-K触发器设计74LS197和74LS194和用Verilog在ISE上实74LS197和74LS194的目的主要是体会时序逻辑电路的设计,并学习用不同方法实现。
总体而言,时序逻辑电路的设计比组合逻辑电路更为复杂,但是基本的分析思路还是要依靠组合逻辑电路的分析思路来确定输入端,需要有清晰的思路和分析过程才能完整的设计出来。
16进制同步计数器的实现相比74LS194的实现要简单的多。
74LS194的实现过程需要多个数据输入,而且每个功能J-K触发器的J和K输入端都是不一样的。
这个时候需要换一种思路,考虑用数据选择器来实现。
所以在设计的时候要联想到之前所学的内容,如果光靠门电路来实现所需要的器件就更多了,连线也更为复杂。
而ISE这款软件来实现的话,输入输出端口的对应关系要明确,这样才能写好顶层模块。
同时这款软件的功能很强大,很多功能都需要我们自己去探索。
顶层文件代码:
`timescale1ns/1ps
`include"sixteenCounter.v"
`include"fourBitBidirectionalUniversalShiftRegister.v"
moduleTop(p43,p45,p46,p47,p48,p49,p50,p51,p54,p55,p56,p57,p143,p144,p145,p146,p147,p148,p149,p150,p151,p152,p154,p155,p158,p159);
inoutwirep43,p45,p46,p47,p48,p49,p50,p51,p54,p55,p56,p57,p143,p144,p145,p146,p147,p148,p149,p150,p151,p152,p154,p155,p158,p159;
sixteenCounteric_74ls197(.P0(p48),.P1(p49),.P2(p50),.P3(p51),.Q0(p43),.Q1(p45),.Q2(p46),.Q3(p47),._CP0(p54),._CP1(p55),._MR(p57),._PL(p56));
fourBitBidirectionalUniversalShiftRegisteric_74ls194(.A(p152),.B(p154),.C(p155),.D(p158),.QA(p143),.QB(p144),.QC(p145),.QD(p146),.CLK(p147),.S0(p149),.S1(p148),._CLR(p150),.SRS(p151),.SLS(p159));
endmodule
子模块代码
`timescale1ns/1ps
modulesixteenCounter(P0,P1,P2,P3,Q0,Q1,Q2,Q3,_CP0,_CP1,_MR,_PL
);
inputwireP0,P1,P2,P3,_CP0,_CP1,_MR,_PL;//端口说明
outputwireQ0,Q1,Q2,Q3;
reg[3:
0]Q;
assignQ0=Q[0];
assignQ1=Q[1];
assignQ2=Q[2];
assignQ3=Q[3];
initial//寄存器初始化
begin
Q<=0;
end
always@(negedge_CP0ornegedge_MRornegedge_PL)//一位计数触发逻辑
begin
if(!
_MR)//清零
Q[0]<=0;
elseif(!
_PL)//置数
Q[0]<=P0;
else
Q[0]<=~Q[0];//计数
end
always@(negedge_CP1ornegedge_MRornegedge_PL)//三位计数触发逻辑
begin
if(!
_MR)//清零
Q[3:
1]<=0;
elseif(!
_PL)//平行置数
begin
Q[3]<=P3;
Q[2]<=P2;
Q[1]<=P1;
end
else//自然计数
begin
if(Q[3:
1]>=7)
Q[3:
1]<=0;
else
Q[3:
1]<=Q[3:
1]+1;
end
end
endmodule
`timescale1ns/1ps
modulefourBitBidirectionalUniversalShiftRegister(A,B,C,D,QA,QB,QC,QD,CLK,S0,S1,_CLR,SRS,SLS
);
inputwireA,B,C,D,S0,S1,CLK,_CLR,SRS,SLS;//端口说明
outputwireQA,QB,QC,QD;
reg[3:
0]Q;
initial
begin
Q<=0;
end
assignQA=Q[0];
assignQB=Q[1];
assignQC=Q[2];
assignQD=Q[3];
always@(posedgeCLKornegedge_CLR)
begin
if(!
_CLR)
Q<=0;
else
begin
if(S1&&S0)//平行置数
begin
Q[0]<=A;
Q[1]<=B;
Q[2]<=C;
Q[3]<=D;
end
elseif((!
S1)&&(S0))//右移一位
begin
Q[3]<=Q[2];
Q[2]<=Q[1];
Q[1]<=Q[0];
Q[0]<=SRS;
end
elseif(S1&&(!
S0))//左移一位
begin
Q[0]<=Q[1];
Q[1]<=Q[2];
Q[2]<=Q[3];
Q[3]<=SLS;
end
else//保持不变
Q<=Q;
end
end
endmodule