实验二时序逻辑电路的设计.docx

上传人:b****6 文档编号:4176709 上传时间:2022-11-28 格式:DOCX 页数:18 大小:468.35KB
下载 相关 举报
实验二时序逻辑电路的设计.docx_第1页
第1页 / 共18页
实验二时序逻辑电路的设计.docx_第2页
第2页 / 共18页
实验二时序逻辑电路的设计.docx_第3页
第3页 / 共18页
实验二时序逻辑电路的设计.docx_第4页
第4页 / 共18页
实验二时序逻辑电路的设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验二时序逻辑电路的设计.docx

《实验二时序逻辑电路的设计.docx》由会员分享,可在线阅读,更多相关《实验二时序逻辑电路的设计.docx(18页珍藏版)》请在冰豆网上搜索。

实验二时序逻辑电路的设计.docx

实验二时序逻辑电路的设计

实验二时序逻辑电路的设计

一、实验目的:

1、掌握时序逻辑电路的分析方法。

2、掌握VHDL设计常用时序逻辑电路的方法。

3、掌握时序逻辑电路的测试方法。

4、掌握层次电路设计方法。

5、理解时序逻辑电路的特点。

二、实验的硬件要求:

1、EDA/SOPC实验箱。

2、计算机。

三、实验原理

1、时序逻辑电路的定义

数字逻辑电路可分为两类:

组合逻辑电路和时序逻辑电路。

组合逻辑电路中不包含记忆

单元(触发器、锁存器等),主要由逻辑门电路构成,电路在任何时刻的输出只和当前时刻的输入有关,而与以前的输入无关。

时序电路则是指包含了记忆单元的逻辑电路,其输出不

仅跟当前电路的输入有关,还和输入信号作用前电路的状态有关。

2、同步时序逻辑电路的设计方法

同步时序逻辑电路的设计是分析的逆过程,其任务是根据实际逻辑问题的要求,设计出

能实现给定逻辑功能的电路。

同步时序电路的设计过程:

由给定逻辑功能建立原始状

+

状态

*

状态

+■

选择触发器

■>

确定激励方程组

画岀逻辑图并检查

态图和原始状态表

化简

分配

类型

输岀方程

自启动能力

(1)根据给定的逻辑功能建立原始状态图和原始状态表。

1明确电路的输入条件和相应的输出要求,分别确定输入变量和输出变量的数目和符号;

2找出所有可能的状态和状态转换之间的关系;

3根据原始状态图建立原始状态表;

(2)状态化简---求出最简状态图。

合并等价状态,消去多余状态的过程称为状态化简。

等价状态:

在相同的输入下有相同的输出,并转换到同一个次态去的两个状态称为等价

状态。

(3)状态编码(状态分配)。

给每个状态赋以二进制代码的过程。

根据状态数确定触发器的个数,2n=M乞2n(M为状态数;n为触发器的个数)。

(4)选择触发器的类型。

(5)求出电路的激励方程和输出方程。

(6)画出逻辑图并检查自启动能力。

3、时序逻辑电路的特点及设计时的注意事项

1时序逻辑电路与组合逻辑电路相比,输出会延时一个时钟周期。

2时序逻辑电路一般容易消除“毛刺”。

3用VHDL描述时序逻辑电路时,一般只需将时钟信号和异步控制(如异步复位)信号作为敏感信号。

4用IF语句描述时序逻辑电路时,异步控制逻辑应写在前面的分支中,最后一个ELSIF

分支作为时钟边沿检测,后面不允许再有ELSE语句。

5不能同时使用时钟的上升沿和下降沿。

四、实验内容:

1、带异步清零和异步置数的十进制加法计数器设计。

如图2.1所示,elk为时钟输入,Q为十进制的8421BCD码输出,CO为进位输出,CR为异步清零,LD为异步置数,CR具有最高优先级,D为LD有效时置入的数据。

(CR、LD

图2.1十进制加法计数器

般用按钮控制,通常为低电平有效。

Q、进位输出CO的变化情

下图是计数器VHDL代码及仿真波形,注意观察计数输出

况,CR和LD的控制作用。

LIEPilRYieee;

USEieee・std_logic_116Jl・all;

useieee■眸匚应logicunsigned丄上

ENTITYcounter10IS

PORT

|elk:

INWTD-LOGIG—时电申信号

D:

IWSTD_LOGIC_VECTOR(3downta0);--数据输入

CR.LD:

IN-ST^LMIC;--^1步清军、昇步春换

Q:

bufferSTD_LOGICVECTOR(3dovnto0)计数输出,touffer是可氐回读的输出端口CO:

OUTSTB_LOGIC~

);

ENDcounteclO;

ARCHITECTUREcount10_atGhitectu匚匕OFCOunCerlDIS

BEGIN

processCR,LD)--敏感信号只需包含时铀信号和异拂控制信号

begin

if(CR-'O1)uhen—异步槽蹲

Q<=rr0000";

C(X='101:

eisif[LD-'□')then—异步童数

Q<=D;

C(X='0l;

elsit[clJCeventuikii7匸hen--时¥申縉询也发

iftQ=H100il,,Jthen--计数権围OCiOO〜1001

CK-wOOOOiM;

CO<-'11;

else

Q5Q+l?

CO<=,D,;

endif;

endif;

endprocess;

ENDcount10archit皂c■匸ui:

皂;

2、数控分频器的设计。

要求:

将10KHZ时钟信号分频,分别输出10Hz、1kHz、1250Hz时钟信号,如图22

所示。

分频的原理与计数器差不多,需要定义一个信号量来控制计数范围为分频数,另外控制

在在一个计数周期内输出一段低电平“0”和另一段高电平“1”。

分频器部分源码如图2.4a、图2.4b所示:

libtaryieee;

useieee.std_logic_l164.all;

useieee・口

ussieee・丄■盘1.1;

entitydivclockis

port[ClUlOkHz

«

in

stdlogic;

-IS血时钟输入

Cllc10Hz:

out

std

logic;

—lOHzf

1■钟输H

J

C1H1kHz;

out

std

logic;

--IIcHeB"

1■钟输H

J

Clk2125OHz

:

out

stdlogic

—1250Hz时钟谕出

丿*

enddivclock;

图2.4a数控分频器VHDL代码

如果用于计数的信号量定义为“std_logic_vector”类型的。

如“Count10”,也可以将其最高位作为分频后的时钟输出:

即使用语句“Clk_1kHz<=Count10(3);”,此时输出时钟信号

占空比是多少?

是否可以改变?

process

begin

if[Clk_10kHz(eventandClk_10kHz--l1)then

if(Count10<9)then

CounclO<=Count10+1;

else

Count10<-="0000,r;

endif;

endif;

endprocess;

Cllc_llcH3<=CountlO(3);

如果分频数为2n,“n为整数”,如8分频,Count8定义为“std」ogic_vector”类型,使用下图的语句序列实现,更加简洁:

precess(Clk^lOkHz)

toejin

if(CIklOkHz'eventandCllc10kHz-111)thenCcunt8<=Count8+l;

endif;

endprocess*

ClklZ50Hz<=Count8

(2);

图2.4b数控分频器VHDL代码

同理,“Count8

(1)”是几分频输出?

“Count8(0)”是几分频输出?

3、8位七段数码管扫描电路设计。

SEL0

SEL1

SEL2

74LS138

图2.5八位数码管模块电路原理

1图2.5是实验箱中的八个数码管电路连接图,可以看到,八个数码管的a、b、c、d、

e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管

显示数据,其余关闭。

SEL[2..0]从“000”、“001”一直加到“111”,则八个数码管依次从左

到右显示。

如果SEL[2..0]变化频率很高,则数码管好像是“同时”显示的效果。

2要实现8位数码管扫描,首先应设计一个计数器,让SEL从“000”、“001”一直加

到“111”,实际上就是一个八进制计数器。

如图2.6的简单代码即可实现:

process(C1K_1KHe)

begin

if(Clk_lKHz1eventandClk_lKHE='l1)then

SEL<=-SEL+1;

endi£;

endprocess;

图2.6八位数码管扫描代码

SEL[2..O]的值即可确定数码管的位置,如要将“BCD码加法器”或“4位硬件乘法器”

的结果用数码管显示,可以再设计一个组合逻辑电路,用于选通数码管,使各个数字或符号显示在对应位置,如图2.7所示。

precess(SEL)

begin

case(SEL)is

when**OOOn->BCD_OUT<-101&A;--A

when*t0Ol*,->BCD2oUT<=,rinOOnH;一八p号when"010f,=>BCD2oUT<=101£E:

—E

when011=>BC10001rr;号

wlien,T100*h->BCD_OUT<=101&rti_Result(7dounto4);一一乘才只十■■理when"101,r=>BCD_OUT<=10・£m_Result(3dounto□);一一乘积个位whenotlmmfECD-OUTyiWlE;--消隐

endcase;

endprocess;

图2.7八位数码管选通

注:

图2.7的代码使用组合逻辑电路实现,如果用时序逻辑电路实现,则前几句应改为:

process(ClkIKHz)

begin

if(ClklKHz'eventandClk_lKHa=ll1)then

case[SEL+1)is

uhenfTOON=>BCD_OUT<='01£A;--A

when,r001p,=>BCD-OUT<=t,10000ff;—7"号

为什么这里的CASE语句判断的是“SEL+1完整的代码如图2.8:

1ibteryleee}

useieee.std_logic_llS4.all;

useieee■吕匸h*日11;

useieee.stdlogicun3igned.all;

endseitime;

architecturebehaveofseitimeis

be^in

process(ClkIKHe)begin

if(Clk^lKHz,eventandClklKHz^'11)tlienSEL<-SEL+1;

endIt:

endprocess;

process(SEL)

bsgin

cage($EL)is

whenffOOOl*=>ECD_OUT<=101£i;一一A

when,,n01^=>BCD2oUT<-,*1000n**;—y号

when"010"->ECd3oUT<-1□'iB;—B

whenr,□11r,=>BCD_OUT<=r,10001";一一'、=”号

when*,1O0,f=>BCd2out<=101&ixi_Rjesult(7downtc4);一一乘积十位when,f101^=>BCd2^T<='O'£m^Result(3downtc□);一一乘积个位whenother3->BCD_OUT<-**11111^;肖隐

enclcase;

endprocess;

enclbehave;

3层次化电路设计及元件例化:

a)任何一个电路都可以看作是一个“元件”,我们只需要关心它的功能,而不需要了解

它的具体实现。

b)“元件”与其它电路的连接可以通过端口映射实现。

c)“元件”使用,可以通过“元件例化”实现,VHDL语言有专门的“元件例化”和

“端口映射”语句。

操作步骤请参考“元件例化和调用的操作步骤”部分。

4将“BCD码加法器”(或“4位硬件乘法器”)、“BCD译码器”、“8位七段数码管扫

描电路”的功能组合在一起,实现在数码管上显示结果,下载到实验箱进行测试。

如图2.10

所示(注:

图中“sel_time”模块和“deled”的BCD码扩展到5位,以显示“X”号、“=”号等特殊符号):

—d[40|a\・;i°"T_£]

L_I4rr^~T~r~r%

忙i■-»・;-

it;二;;:

;m

丨:

rsl|:

;;:

;;:

;;;:

;:

;;;:

ti~r"■!

■n_—r_ri-1—r_rt-1—=r-r■?

■■ti•■■■■■■・”・■■-■■■-■■i-i

*吧三亡亍丫岂圧期[;■;;;■;;;■;;;■;;;■;

图2.10在数码管上显示乘法器结果

4、4位硬件乘法器的流水线设计

流水线结构因其高速性在很多数字电路中得到了广泛的应用,目前的DSP、ARM等器

件也是基于流水线结构的。

本实验就是在掌握“4位硬件乘法器”实验的基础上,将其改为

流水线结构,从而提高其运算速度。

流水线可以简单的理解为在时钟的作用下,每一拍完成一个简单运算。

需要注意的是,

由于内部的运算都是在时钟作用下进行,所以涉及到运算的中间变量都必须定义成寄存器结构的。

另外对于一次运算可能要经过多个时钟周期才能得到结果,但是如果对于批量的数据,就可以认为是单周期得到运算结果。

所以流水线结构的乘法器在对于单个运算时它的高速性并不能得以体现,只有在批量数据运算过程中才能体现出其高速性。

本实验中的流水线乘法器针对无符号型的数据(对于有符号型的数据还必须进行符号扩张),大体上可以分为四拍,第一拍:

取数据并作适当整理;第二拍:

位乘法;第三步:

加法第一步;第四拍:

加法第二步,得到运算结果。

流水线结构的乘法器可以用下图2.11

来简要表示:

CLOCK

Step1

LoaW⑴K4I+

(2)

 

Step2

厂oaW^Q・

(2)

 

Step3

汛—M-LoadX+⑴+

(2)

Step4

—一一YLoadX+⑴+

(2)

图2.11流水线结构乘法器示意图

乘法器在时钟信号Clock的作用下,第一个时钟信号上升沿的时候第一拍先取数据,第

二个时钟上升沿时候第一拍对取得的数据进行位乘,同时第二拍开始取数据,第三个时钟上

升沿的时候第一拍进行第一步加法运算,第二拍进行位乘,同时第三拍开始取数据,第四个

时钟上升沿的时候第一拍完成第二次加法并送出结果,第二拍则完成第一步加法,第三拍完

成位乘,同时第四拍完成取数据,再往后走,会每一个时钟周期送出一个运算结果。

这就是

为什么流水线结构的乘法器在单次运算的过程中它的高速性不能得到体现原因。

libraryieee;

useieee»std_logic_l16电.all;

useieee.stdlogicarith.all;

useieee»std_Logic_unsigned.ell;

por匸(CLk

in

3td

logic;—时钟输入

reset

in

std_

logic;—聲步渚孚

A,B

in

std

Logic?

vector(3downto

0);

一数据输入

mResult

out

std

Logicvector(7downto

0)

--貉果输出

entitymuLt^1is

endmult41;

architecturebehaveofis

signalTempD^Temp1fTenip21Temp3:

std^Logic_veccor(7dounto0);signalTeimpOl,Temp23:

std_logic_vector(7downto0);begin

processreset)

begin

if(reset-1□')then一异步清琢

TenipO<=(otrhers=!

>101);

Temp1<-(others=>101)i;

Temp2<=(otliers=!

>101);

Temp3<=(ovhers=>101)i;

Tempo1<-(others=>1D1);

Temp23<-(others->1O');

elsif(Clk1eventandClk=111thenif(A(0)='1')then

Temp0<=*F000口”田

else

TenipO<=rrOO口口口口口严endif;

if(A(1J='lf)then

T皀mpK-^OOO^fiEi1□';else

TsmpK-^OOOOOOOO^;endif;

i±(A

(2)=*1*)thenTewpS<=,FaO,riE€,|h00N;

else

Temp2<=,F00000000F,;endif;

i±(A(3)='I1)then

Temp3<=,01£Bs,fOOOh;

eIse

Temp3<=,r00口口□□OD";

endif;

—获取数据

A(0)位乘的结

A

(1)位乘的结

A

(2)位乘的结

A(3)位乘的结

第一个时钟节拍后输出,

TempO、Tempi、Temp2、

Temp3比A和B延时一

个时钟周期

TenapO1<=TempO+Temp1;Tejnp23<-TeHip2+Temp3:

Temp23比TempO、Tempi、

\Temp。

1、

jTemp2、Temp3延时一个时钟周期。

in_Result<-TeinpO1+Temp23;

pnri1f!

--第二歩加法|m_Result比TempOl、Temp23延时一个时钟周期,比A和B延时三个时钟周期,才能得到输出结果。

endprocsss;endbehave;

图2.12流水线结构乘法器的主要源码

 

图2.12是流水线结构乘法器的主要源码,其中应定义TempO、Tempi、Temp2、Temp3、

TempOl、Temp23几个信号量存储中间结果。

图2.14流水线结构乘法器的测试电路

5、4位硬件乘法器的状态机设计

流水线乘法器速度快,但是占用资源较多,特别是当乘数的位数很大时。

如果乘法操作比较少,或对速度要求不高的应用,可以采用串行方式实现乘法器。

下面是用状态机实现串

行乘法器的实例:

1状态机可以模拟计算机CPU的运行机制,完成非常复杂的控制逻辑。

状态机有多种

结构,有关状态机的知识请参考相关书籍,本例采用单进程状态机设计,比较易于消除毛刺,

但输出结果会延时一个时钟周期。

2图2.15是本设计的状态图,一共4个状态,S0态接收输入,S1态将当前位加到m_result,S2态对A、B进行移位操作,S3态输出结果。

状态转换条件在后面的源码中讲述。

ri0000r,

cun-enlE

S2

 

图2.15串行乘法器的状态转换图

3图2.17是状态机的VHDL实现源码,可以看到整个设计只用到一个8位加法电路,

而“4位流水线乘法器”需要3个,当乘法位数很大时,串行加法器可以节约更多的硬件资源,但需要的时钟周期数更多。

④图2.16是仿真波形,注意观察需要几个周期才能输出结果(与A的值有关),A、B

的值需要维持几个周期才能保证结果的正确性?

Kl.O2

l.D,us

LCMue.L06-ns].12

MBx

1gUrfi

L.£?

讴I.2She1.32

i.紳笛

8.4TIE].4>

1.48x

Clk

LrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLnnrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrL

i~~ii~i~■

a*

fl

X

AX1

cXD

ZJC

tF

4

X

B

~T~

7

田■_Xsi.nl.lL

□3

⑷了UAr3

x

ODr10X胡

ntoox»x

LI7'

4E

fL»LL>i

|l

1

n_

图2.16串行乘法器的仿真波形

libraryieee;

useieeelogic116^*311;

useieee:

.3匸dlogic^ari匸h.aJJ.;

useieee,std_logic_unsigned.all;

entitymult4_2is

port(Clk

start

i.BfinishniResult

endmult理2;

inininout

buffer

std_logic;--时电申输入

std_logic;--汞法撫作开始控制

stdlogicvector(3do¥iit.o0);std_logic;--乘復操柞完成标志stdlogicvector(7downtoD)

architecturebehaveofmult42istypestateis(sO,slys3);signalsignalsignalsignalbeginprocess(Clk)begin

currentsTempATempBst.art-1

:

stare;

J

:

st-dlogicvec匸oi:

(3

:

std_logic_vectQr(7:

stdlogic;

状态量一般采用枚举类型

dounto0);dounto□);

if(Clk1eventandC1lc=111)thenstaxtl.匸;

finish<='01:

m_Result<=m_Result;casecurrent_sis

whens0=>―获取数据TempA<=A;TEinpB€=”C!

DC]Cl”&B;if('11andsLarCl='01)thencutrrent_s<=sl;tr_Result<:

=(others~>101);

eIsecuri:

ent_s<=sO;

finish<~'l1:

endif;

ahensl=>--按位加if(TerapA=,rOOOOF,)then「

cuurent_s<=s3;

else

if(TempA(0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1