第5章基本逻辑门电路设计(VHDL)_第1页
第5章基本逻辑门电路设计(VHDL)_第2页
第5章基本逻辑门电路设计(VHDL)_第3页
第5章基本逻辑门电路设计(VHDL)_第4页
第5章基本逻辑门电路设计(VHDL)_第5页
已阅读5页,还剩127页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章基本逻辑电路设计

5.1组合逻辑电路设计5.2

时序逻辑电路设计5.3存储器设计5.4状态机的VHDL设计

12/20/2023第5章基本逻辑电路设计

教学目标教学重点教学过程12/20/2023掌握组合逻辑电路的设计掌握总线接口电路的设计掌握存储器和状态机的设计通过若干数字电路设计实例掌握复杂逻辑电路的设计方法第5章教学目标12/20/2023第5章教学重点

掌握组合逻辑电路的设计掌握总线接口电路的设计掌握存储器和状态机的设计

12/20/20235.1组合逻辑电路设计5.1.1基本门电路

1.基本门电路的VHDL语言描述基本门电路用VHDL语言来描述十分方便。为方便起见,在下面的两输入模块中,使用VHDL中定义的逻辑运算符,同时实现一个与门、或门、与非门、或非门、异或门及反相器的逻辑。

本节的组合逻辑电路设计主要有:基本门电路、3-8译码器、8-3线优先编码器、8位比较器、多路选择器、三态门电路、单向总线驱动器、双向总线缓冲器等设计实例。12/20/2023

【例5.1.1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYGATEISPORT(A,B:INSTD_LOGIC;

YAND,YOR,YNAND,YNOR,YNOT,YXOR:OUTSTD_LOGIC);

ENDGATE;ARCHITECTUREARTOFGATEIS12/20/2023BEGINYAND<=AANDB; --与门输出

YOR<=AORB; --或门输出

YNAND<=ANANDB;--与非门输出

YNOR<=ANORB; --或非门输出

YNOT<=ANOTB; --反相器输出

YXOR<=AXORB; --异或门输出

ENDART;12/20/20232.3-8译码器下面我们分别以4种方法描述一个3-8译码器。【例5.1.2】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED_ALL;ENTITYDECODERISPORT(INP:INSTD_LOGIC_VECTOR(2DOWNTO0);

OUTP:OUTBIT_VECTOR(7DOWNTO0));ENDDECODER;12/20/2023方法1:使用SLL逻辑运算符ARCHITECTUREART1OFDECODERISBEGINOUTP<="11111110"SLL(CONV_INTEGER(INP));----输出低有效译码ENDART1;

12/20/2023方法2:使用PROCESS语句ARCHITECTUREART2OFDECODERISBEGINPROCESS(INP)BEGINOUTP<=(OTHERS=>‘1’)--对输出所有位全赋0OUTP(COVN_INTEGER(INP))<=‘1’--仅对其中的一位赋值

ENDPROCESS;ENDART212/20/2023方法3:使用CASE_WHEN语句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDECODERISPORT(SEL:INSTD_LOGIC_VECTOR(2DOWNTO0);

EN:INSTD_LOGIC;---加使能控制端

Y:OUTBIT_VECTOR(7DOWNTO0));ARCHITECTUREART3OFDECODERISBEGINPROCESS(SEL,EN)BEGINY<=”11111111”;IF(EN=’1’)THEN12/20/2023CASESELISWHEN"000"=>Y(0)<=‘0’;--输出低有效

WHEN"001"=>Y(1)<=’0’;

WHEN"010"=>Y(2)<=‘0’;

WHEN"011"=>Y(3)<=‘0’;

WHEN"100"=>Y(4)<=‘0’;

WHEN"101"=>Y(5)<=‘0’;

WHEN"110"=>Y(6)<=‘0’;

WHEN"111"=>Y(7)<=‘0’;

WHENOTHERS=>NULL;

ENDCASE;ENDPROCESS;ENDART3;

12/20/2023方法4:使用条件选择WHENELSE语句

ARCHITECTUREART4OFDECODERISBEGINY(0)<=‘0’WHEN(EN=’1’ANDSEL="000")ELSE’1’;

Y(1)<=‘0’WHEN(EN=’1’ANDSEL="001")ELSE’1’;

Y(2)<=‘0’WHEN(EN=’1’ANDSEL="010")ELSE’1’;

Y(3)<=‘0’WHEN(EN=’1’ANDSEL="011")ELSE’1’;

Y(4)<=‘0’WHEN(EN=’1’ANDSEL="100")ELSE’1’;

Y(5)<=‘0’WHEN(EN=’1’ANDSEL="101")ELSE’1’;

Y(6)<=‘0’WHEN(EN=’1’ANDSEL="110")ELSE’1’;

Y(7)<=’0’WHEN(EN=’1’ANDSEL="111")ELSE’1’;ENDART4;12/20/20233.8-3线优先编码器下面我们用三种方法设计8-3线优先编码器。8-3线优先编码器,输入信号为y0、y1、y2、y3、y4、y5、y6和y7,输出信号为OUT0、OUT1和OUT2。输入信号中y0的优先级别最低,依次类推,y7的优先级别最高。【例5.1.3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYENCODERISPORT(y0,y1,y2,y3,y4,y5,y6,y7:INSTD_LOGIC;

OUT0,OUT1,OUT2:OUTSTD_LOGIC);ENDENCODER;12/20/2023方法1:使用条件赋值语句ARCHITECTUREART1OFENCODERISSIGNALOUTS:STD_LOGIC_VECTOR(2DOWNTO0);

BEGINOUTS(2DOWNTO0)<="111"WHENy7=‘1’ELSE"110"WHENy6=‘1’ELSE"101"WHENy5=‘1’ELSE"100"WHENy4=‘1’ELSE"011"WHENy3=‘1’ELSE"010"WHENy2=‘1’ELSE"001"WHENy1=‘1’ELSE"000"WHENy0=‘1’ELSE"XXX";OUT0<=OUTS(0);

OUT1<=OUTS(1);

OUT2<=OUTS(2);

ENDART1;12/20/2023

方法2:使用IF语句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYENCODERISPORT(IN1:INSTD_LOGIC_VECTOR(7DOWNTO0);

OUT1:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDENCODER;ARCHITECTUREART2OFENCODERISBEGINPROCESS(IN1)12/20/2023BEGINIFIN1(7)=‘1’THENOUT1<="111";ELSIFIN1(6)=‘1’THENOUT1<="110";ELSIFIN1(5)=‘1’THENOUT1<="101";ELSIFIN1(4)=‘1’THENOUT1<="100";ELSIFIN1(3)=‘1’THENOUT1<="011";ELSIFIN1(2)=‘1’THENOUT1<="010";ELSIFIN1(1)=‘1’THENOUT1<="001";ELSIFIN1(0)=‘1’THENOUT1<="000";ELSEOUT1<="XXX";ENDIF;

ENDPROCESS;ENDART2;12/20/2023

4.加法器—带进位的4位加法器【例5.1.4】用FOR-LOOP语句实现LIBRARYIEEE;方法1:USEIEEE.STD_LOGIC_1164.ALL;ENTITYADDER4IS

PORT(A,B:INSTD_LOGIC_VECTOR(3DOWNTO0);

CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUNT:OUTSTD_LOGIC);ENDADDER4;12/20/2023ARCHITECTUREARTOFADDER4ISSIGNALC:STD_LOGIC_VECTOR(4DOWNTO0);

BEGINPROCESS(A,B,CIN,C)BEGINC(0)<=CIN;FORIIN0TO3LOOP---用FOR循环语句实现多位相加

SUM(I)<=A(I)XORB(I)XORC(I);C(I+1)<=(A(I)ANDB(I))OR(C(I)AND(A(I)ORB(I)));ENDLOOP;

12/20/2023COUNT<=C(4);---总的进位输出

ENDPROCESS;ENDART;方法2:直接使用加法“+”函数LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED_ALL;ENTITYADDER4_OPIS

12/20/2023PORT(A,B:INSTD_LOGIC_VECTOR(3DOWNTO0);

CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUNT:OUTSTD_LOGIC);ENDADDER4_OP;ARCHITECTUREARTOFADDER4_OPISSIGNALC:STD_LOGIC_VECTOR(4DOWNTO0);

BEGINPROCESS(A,B,CIN,C)BEGINENDPROCESS;SUM<=C(3DOWNTO0)COUT<=C(4)ENDART12/20/2023

5.8位比较器

比较器可以比较两个二进制是否相等,下面是一个8位比较器的VHDL描述。有两个8位二进制数,分别是A和B,输出为EQ,当A=B时,EQ=1,否则EQ=0。【例5.1.5】LIBRARYIEEE;USEIEEE.STD_LOGIC_VECTOR(7DOWNTO0);ENTITYCOMPAREISPORT(A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);

EQ:OUTSTD_LOGIC);ENDCOMPARE;ARCHITECTUREARTOFCOMPAREISBEGINEQ<=‘1’WHENA=BELSE‘0’;ENDART;12/20/2023

6.多路选择器

选择器常用于信号的切换,前面用IF语句、CASE语句、条件赋值语句、选择赋值语句分别描述过4选1选择器。

5.1.2三态门及总线缓冲器

三态门和总线缓冲器是驱动电路经常用到的器件,VHDL语言通过指定大写的Z值表示高阻状态。

A:STD_LOGIC;B_BUS:STD_LOGIC_VECTOR(7DOWNTO0);指定高阻状态如下:A<=‘Z’;A_BUS<=“ZZZZZZZZ”;

12/20/2023

【例5.1.6】三态门描述电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTRI_GATEISPORT(EN,DIN:INSTD_LOGIC;

DOUT:OUTSTD_LOGIC);ENDTRI_GATE;ARCHITECTUREARTOFTRI_GATEISBEGINIF(EN=’1’)THENDOUT<=DIN;

ELSEDOUT<='Z';--此处是单总线

ENDIF;

ENDPROCESS;ENDART;12/20/20235.1.3单向总线驱动器

在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。一个8位的单向总线缓冲器如图5-1所示。图5-1单向总线缓冲器图5-1单向总线缓冲器12/20/2023

【例5.1.7】单向总线缓冲器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTR1_BUF8ISPORT(DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);

EN:INSTD_LOGIC;

DOUNT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ARCHITECTUREARTOFTR1_BUF8IS12/20/2023

BEGINPROCESS(EN,DIN)IF(EN=‘1’)THENDOUT<=DIN;

ELSEDOUT<="ZZZZZZZZ";

ENDIF;

ENDPROCESS;ENDART;

12/20/2023

5.1.4双向总线缓冲器

双向总线缓冲器用于数据总线的驱动和缓冲,典型的双向总线缓冲器如图5-2所示。图中的双向总线缓冲器有两个数据输入输出端A和B,一个方向控制端DIR和一个选通端EN。EN=0时双向缓冲器选通,若DIR=0,则A=B,反之则B=A。

图5-2双向总线缓冲器12/20/2023

【例5.1.8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIDIRISPORT(A,B:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);

EN,DIR:INSTD_STD_LOGIC);图5-2双向总线缓冲器ENDBIDIR;ARCHITECTUREARTOFBIDIRISSIGNALAOUT,BOUT:STD_LOGIC_VECTOR(7DOWNTO0);

BEGIN12/20/2023

PROCESS(A,EN,DIR)BEGINIFEN=‘0’ANDDIR=‘1’THENBOUT<=A;

ELSEBOUT<"ZZZZZZZZ";

ENDIF;

B<=BOUT;

ENDPROCESS;

PROCESS(B,EN,DIR)BEGINIFEN=‘0’ANDDIR=‘1’THENAOUT<=B;

ELSEAOUT<"ZZZZZZZZ";

ENDIF;

A<=AOUT;

ENDPROCESS;

ENDART;12/20/2023

5.2时序逻辑电路设计在本节的时序电路设计主要有触发器、寄存器、计数器、分频器、序列信号发生器和序列信号检测器等的设计实例。5.2.1时序电路特殊信号描述时钟信号和复位信号1.时钟信号的描述1)常用的描述方式:进程的敏感信号是时钟信号,在进程内部用IF语句描述时钟的边沿条件。如:PROCESS(CLOCK_SIGNAL)BEGIN

12/20/2023IF(CLK_EDGE_CONDITION)

THENSIGNAL_OUT<=SIGNAL_IN;…

其他时序语句…ENDIF;ENDPROCESS;2.触发器的复位信号描述1)同步复位:在只有以时钟为敏感信号的进程中定义。如:PROCESS(CLOCK_SIGNAL)BEGIN12/20/2023

IF(CLK_EDGE_CONDITION)

THENIf(reset_condition)thenSIGNAL_OUT<=reset_value;elseSIGNAL_OUT<=SIGNAL_IN;…

其他时序语句…ENDIF;ENDIF;Endprocess;12/20/20232)异步复位:进程的敏感信号表中除时钟信号外,还有复位信号。PROCESS(reset_signal,CLOCK_SIGNAL)BEGINIf(reset_condition)thenSIGNAL_OUT<=reset_value;

elsef(CLK_EDGE_CONDITION)

THENSIGNAL_OUT<=SIGNAL_IN;…

其他时序语句…ENDIF;Endprocess;12/20/2023

5.2.2常用时序电路设计1.基本触发器(Flip_Flop)1)D触发器【例5.2.1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDCFQISPORT(D,CLK:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDDCFQ;ARCHITECTUREARTOFDCFQISBEGINPROCESS(CLK)--同步进程

12/20/2023

【例5.2.2】复位D触发器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLR,PSET,CLK,D:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDDFF3;ARCHITECTUREARTOFDFF3IS

12/20/2023BEGINPROCESS(CLK,CLR,PSET)--异步进程

BEGINIF(PSET=‘0’)THENQ<=‘1’;--置位信号有效,则触发器被置位ELSIF(CLR=‘0’)THENQ<=‘0’;复位信号有效,则触发器被复位ELSIF(CLK'EVENTANDCLK=‘1’)THENQ<=D;ENDIF;

ENDIF;

ENDPROCESS;ENDART;

12/20/2023【例5.2.3】同步复位的D触发器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSYNDCFQISPORT(D,CLK,RESET:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDSYNDCFQ;ARCHITECTUREARTOFSYNDCFQISBEGINPROCESS(CLK)12/20/2023

BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(PRESET=‘0’)THEN Q<=‘0’;--时钟边沿到来且有复位信号,触发器被复位

ELSEQ<=D;--且有复位信号,触发器被复位

ENDIF;

ENDIF;

ENDPROCESS;ENDART;12/20/20232.T触发器【例5.2.4】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTCFQISPORT(T,CLK:INSTD_LOGIC;

Q:BUFFERSTD_LOGIC);ENDTCFQ;ARCHITECTUREARTOFTCFQISBEGINPROCESS(CLK)--同步进程

BEGIN

12/20/2023IF(CLK'EVENTANDCLK=‘1’)THENQ<=NOT(Q);

ELSEQ<=Q;

ENDIF;

ENDPROCESS;ENDART;3.RS触发器【例5.2.5】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRSCFQIS

12/20/2023PORT(R,S,CLK:INSTD_LOGIC;

Q,QB:BUFFERSTD_LOGIC);ENDRSCFQ;ARCHITECTUREARTOFRSCFQISSIGNALQ_S,QB_S:STD_LOGIC;

BEGINPROCESS(CLK,R,S)--异步进程

BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(S=‘1’ANDR=‘0’)THENQ_S<=‘0’;

QB_S<=‘1’;

ELSIF(S<=‘0’ANDR<=‘1’)THEN12/20/2023Q_S<=‘1’;

QB_S<=‘0’;

ELSIF(S<=‘0’ANDR<=‘0’)THENQ_S<=Q_S;--输出保持不变

QB_S<=QB_S;

ENDIF;

ENDIF;

Q<=Q_S;

QB<=QB_S;

ENDPROCESS;ENDART;12/20/20235.关于触发器的同步和非同步复位

触发器的初始状态应由复位信号来设置。按复位信号对触发器复位的操作不同,可以分为同步复位和非同步复位两种。所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位;非同步复位,也称异步复位,则是当复位信号有效时,触发器就被复位,不用等待时钟边沿信号。下面以D触发器为例分别予以举例12/20/20235.2.3寄存器和移位寄存器1.寄存(锁存)器

寄存器用于寄存一组二值代码,广泛用于各类数字系统。因为一个触发器能储存1位二值代码,所以用N个触发器组成的寄存器能储存一组N位的二值代码。下面给出一个8位寄存器的VHDL描述。【例5.2.7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREGISPORT(D:INSTD_LOGIC_VECTOR(0TO7);

CLK:INSTD_LOGIC;

Q:OUTSTD_LOGIC_VECTOR(0TO7));ENDREG;

12/20/2023ARCHITECTUREARTOFREGISBEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK=‘1’)THEN

Q<=D;

ENDIF;

ENDPROCESS;ENDART;2.移位寄存器

移位寄存器除了具有存储代码的功能以外,还具有移位功能。所谓移位功能,是指寄存器里存储的代码能在移位脉冲的作用下依次左移或右移。因此,移位寄存器不但可以用来寄存代码,还可用来实现数据的串并转换、数值的运算以及数据处理等。下面给出一个8位的移位寄存器,其具有左移一位或右移一位、并行输入和同步复位的功能。

12/20/2023【例5.2.8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTERISPORT(DATA:INSTD_LOGIC_VECTOR(7DOWNTO0);SHIFT_LEFT:INSTD_LOGIC;SHIFT_RIGHT:INSTD_LOGIC;RESET:INSTD_LOGIC;MODE:INSTD_LOGIC_VECTOR(1DOWNTO0);QOUT:BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));12/20/2023ENDSHIFTER;ARCHITECTUREARTOFSHIFTERISBEGINPROCESSBEGINWAITUNTIL(RISING_EDGE(CLK));IF(RESET=‘1’)THENQOUT<="00000000"; ELSE --同步复位功能的实现CASEMODEISWHEN"01"=>QOUT<=SHIFT_RIGHT&QOUT(7DOWNTO1);12/20/2023

--右移一位WHEN"10"=>QOUT<=QOUT(6DOWNTO0)&SHIFT_LEFT;

--左移一位WHEN"11"=>QOUT<=DATA;WHENOTHERS=>NULL;

ENDCASE;

ENDIF;

ENDPROCESS;图5-36位串行输入串行输出移位寄存器ENDART;12/20/20235.2.4计数器

计数器是在数字系统中使用最多的时序电路,它不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。计数器分为同步和异步。1.同步计数器:同步计数器指在时钟脉冲(计数脉冲)的控制下,构成计数器的各触发器状态同时发生变化的计数器。12/20/2023【例5.2.10】12进制的计数器的设计

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCNTM12IS

PORT(Clk,clr,en:INSTD_LOGIC;

Qa,qb,qc,qd:OUTSTD_LOGIC;

Endcount12;ARCHITECTUREARTOFCount12ISSignalcount_4:STD_LOGIC_VECTOR(3DOWNTO0);begin

qa<=count_4(0);qb<=count_4(1);qc<=count_4(2);qd<=count_4(3);12/20/2023process(clk,clr)BEGIN

IF(clr=‘0’)THEN --异步复位

Count_4<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN --IF(en=‘1’)THEN IF(Count_4<="1011")THENCount_4<="0000";ELSE Count_4<=Count_4+1;--调用STD_LOGIC_UNSIGNED.ALL程序包就是为了实现不同数据类型直接相加

ENDIF;ENDIF;

12/20/2023ENDIF;ENDPROCESS;ENDART;【例5.2.11】加减计数器(仿真如图5-4所示)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYupdncount64IS

PORT(Clk,clr,updn:INSTD_LOGIC;

qa,qb,qc,qd,qe,qf:OUTSTD_LOGIC);--输出6位二进制数最大为63,所以是64进制计数器12/20/2023Endupdncount64;-ARCHITECTUREARTOFupdncount64IS图5-4加减计数器仿波形

Signalcount_6:STD_LOGIC_VECTOR(5DOWNTO0);Begin

qa<=count_6(0);qb<=count_6(1);qc<=count_6(2);qd<=count_6(3);qe<=count_6(4);qf<=count_6(5);12/20/2023process(clk,clr)BEGIN

IF(clr=‘0’)THEN --异步复位

Count_6<="000000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN -IF(updn=‘1’)THEN Count_6<=Count_6+1;--调用STD_LOGIC_UNSIGNED.ALL程序包就是为了实现不同数据类型直接相加

ELSECount_6<=Count_6-1;--为减1计数器

ENDIF;

12/20/2023ENDIF;ENDPROCESS;ENDART;【例5.2.12】60进制(分、秒)计数器LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYClock60IS

PORT(Clk

:INSTD_LOGIC;

NRESET:INSTD_LOGIC;12/20/2023

Bcd1_out:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--个位显示0~9需4位宽

Bcd10_out:OUTSTD_LOGIC_VECTOR(2DOWNTO0));--十位显示0~5需3位宽ENDCLOCK60;ARCHITECTUREARTOFCLOCK60ISSIGNALBcd1n:STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALBcd10n:STD_LOGIC_VECTOR(2DOWNTO0);

BEGINBcd1_out<=Bcd1n;--把定义的中间信分别赋给输出端口12/20/2023Bcd10_out<=Bcd10n;PROCESS(CLK,NRESET)BEGINIF(NRESET=‘0’)THEN --异步复位Bcd1n<="0000";Bcd10n<="000";ELSIF(CLK’EVENTANDCLK=’1’)THENIF(Bcd1n=9)THEN--如个位为9则清零12/20/2023Bcd1n<="0000";IF(Bcd10n=5)THEN如十位为5则清零Bcd10n<="000";ELSIFBcd10n<=Bcd10n+1;ENDIF;ELSFBcd1n<=Bcd1n+1;ENDIF;ENDIF;ENDPROCESS;ENDART;12/20/2023【例5.2.13】模为60具有异步复位、同步置数功能的8421BCD码计数器LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYClock60IS

PORT(Clk,:INSTD_LOGIC;

NRESET:INSTD_LOGIC;

LOAD:INSTD_LOGIC;

D:INSTD_LOGIC_VECTOR(7DOWNTO0);

CLK:INSTD_LOGIC;

CO:OUTSTD_LOGIC;

12/20/2023QH:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0);

QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDCNTM60;ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';

--进位输出的产生PROCESS(CLK,NRESET)

12/20/2023BEGINIF(NRESET=‘0’)THEN --异步复位

QH<="0000";

QL<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN --同步置数

IF(LOAD=‘1’)THENQH<=D(7DOWNTO4)QL<=D(3DOWNTO0);12/20/2023ELSIF(CI=‘1’)THEN --模60的实现

IF(QL=9)THENQL<="0000";

IF(QH=5)THENQH<="0000";

ELSE --计数功能的实现

QH<=QH+1;

ENDIFELSEQL<=QL+1;

ENDIF;

ENDIF; --ENDIFLOAD

ENDPROCESS;ENDART;12/20/20232.异步计数器

异步计数器又称为行波计数器,它的低位计数器的输出作为高位计数器的时钟信号。由于是行波计数,致使计数延迟增加,计数器工作频率较低。用VHDL语言描述异步计数器,与同步计数器描述的区别主要体现在对各级时钟的描述上。下面是一个由8个触发器构成的异步计数器,采用元件例化的方式生成。如图5-5所示图5-58个触发器构成的异步计数器12/20/2023【例5.2.14】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDIFFRISPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);ENDDIFFR;ARCHITECTUREART1OFDIFFRISSIGNALQ_IN:STD_LOGIC;BEGINQ<=Q_IN;QB<=NOTQ_IN;PROCESS(CLK,CLR)12/20/2023BEGINIF(CLR=‘1’)THEN图5-58个触发器构成的异步计数器

Q_IN<=‘0’;

ELSIF(CLK'EVENTANDCLK=‘1')THENQ_IN<=D;

ENDIF;

ENDPROCESS;ENDART1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRPLCOUNTIS

12/20/2023PORT(CLK,CLR:INSTD_LOGIC;

COUNT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDRPLCOUNT;ARCHITECTUREART2OFRPLCOUNTISSIGNALCOUNT_IN:STD_LOGIC_VECTOR(8DOWNTO0);

COMPONENTDFFRPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);

ENDCOMPONENT;12/20/2023

BEGINCOUNT_IN(0)<=CLK;

GEN1:FORIIN0TO7GENERATEU:DFFRPORTMAP(CLK=>COUNT_IN(I),--采用名字映射方式

CLR=>CLR,D=>COUNT_IN(I+1),

Q=>COUNT_IN(I),QB=>COUNT_IN(I+1));

ENDGENERATE;ENDART2;用计数器实现分频器的设计(实现输入信号的二分频、四分频)12/20/2023【例5.2.16】分频器的设计LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYN_DIVISPORT(N:INSTD_LOGIC_VECTOR(7DOWNTO0);

Clk:INSTD_LOGIC;

ClkOUT:OUTSTD_LOGIC);

EndN_DIV;ARCHITECTUREARTOFN_DIVISSignalcnt:STD_LOGIC_VECTOR(7DOWNTO0);12/20/2023Signaln_t,n_1:STD_LOGIC_VECTOR(7DOWNTO0);BeginN_1<=N-1;--N_1代表N减一操作N_t<=‘0’&N(7DOWNTO1);--相当于右移一位,即除2操作(N_t是中间暂存信号)process(N,clk)BEGINIFVLK’EVENTANDCLK=‘1’THEN --异步复位

IFCnt<=N_1;THEN;--判断是否到计数的终值

CNT<=“00000000”;--到计数的终值清零ELSIF12/20/2023Cnt<=Cnt+1;--未到计数的终值则加1计数ENDIF;IFCNT<N_TTHEN--如小于N的一半则输出低电平

CLKOUT<=‘0’;ELSECLKOUT<=‘1’;--如大于等于N的一半则输出高电平(N为偶数时,输出方波信号)ENDIF;ENDPROCESS;ENDART;12/20/20235.2.5序列信号发生器、检测器

在数字信号的传输和数字系统的测试中,有时需要用到一组特定的串行数字信号,产生序列信号的电路称为序列信号发生器。1.“01111110”序列发生器(序列可任意)该电路可由计数器与数据选择器构成,其VHDL描述如下:【例5.2.17】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSENQGENIS

12/20/2023PORT(CLK,CLR,CLOCK:INSTD_LOGIC;--两个时钟信号

ZO:OUTSTD_LOGIC);ENDSENQGEN;ARCHITECTUREARTOFSENQGENISSIGNALCOUNT:STD_LOGIC_VECTOR(2DOWNTO0);--序列发生器的关键是计数器,COUNT的宽度决定序列的长度,此为8位

SIGNALZ:STD_LOGIC:=‘0’;--赋初值仅对仿真有用

BEGINPROCESS(CLK,CLR)12/20/2023BEGINIF(CLR=‘1’)THENCOUNT<="000";

ELSEIF(CLK=‘1’ANDCLK'EVENT)THENIF(COUNT="111")THENCOUNT<="000";--此处可不要

ELSECOUNT<=COUNT+1;

ENDIF;

ENDIF;ENDIF;ENDPROCESS;PROCESS(COUNT)12/20/2023BEGINCASECOUNTISWHEN"000"=>Z<=‘0’;WHEN"001"=>Z<=‘1’;WHEN"010"=>Z<=‘1’;WHEN"011"=>Z<=‘1’;WHEN"100"=>Z<=‘1’;WHEN"101"=>Z<=‘1’;WHEN"110"=>Z<=‘1’;WHENOTHERS=>Z<=‘0’;

ENDCASE;ENDPROCESS;12/20/2023PROCESS(CLOCK,Z)BEGIN --消除毛刺的锁存器

IF(CLOCK'EVENTANDCLOCK=‘1’)THENZO<=Z;--把中间信号通过一个触发器寄存输出

ENDIF;

ENDPROCESS;ENDART;2.M序列发生器M序列发生器主要由移位寄存器和反馈环节组成。下面是一个20位的M序列发生器的VHDL描述。

12/20/2023【例5.2.18】LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYXLGEN20ISPORT(CLK,LOAD,EN:INSTD_LOGIC;

DATA:INSTD_LOGIC_VECTOR(20DOWNTO0);

LOUT:BUFFERSTD_LOGIC);ENDXLGEN20;12/20/2023ARCHITECTUREARTOFXLGEN20ISCONSTANTLEN:INTEGER:=20SIGNALLFSR_VAL:STD_LOGIC_VECTOR(LENDOWNTO0);

SIGNALDOUT:STD_LOGIC_VECTOR(LENDOWNTO0);

BEGINPROCESS(LOAD,EN,DOUT)BEGINIF(LOAD=‘1’)THENLFSR_VAL<=DATA;

ELSIF(EN=‘1’)THEN12/20/2023LFSR_VAL(0)<=DOUT(3)XORDOUT(LEN);

LFSR_VAL(LENDOWNTO1)<=DOUT(LEN-1DOWNTO0);ENDIF;

ENDPROCESS;

PROCESS(CLK)BEGINIF(CLK'EVENTANDCLK=‘1’)THENDOUT<=LFSR_VAL;

LOUT<=LFSR_VAL(LEN);

ENDIF;

ENDPROCESS;ENDART;12/20/2023【例5.2.20】简洁序列检测器LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYDETECT_SISPORT(DATAIN,CLK:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDDETECT_S;ARCHITECTUREARTOFDETECT_SISSIGNALREG:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK)BEGIN12/20/2023

IFCLK’EVENTANDCLK=’1’THEN—第一个IF语句

REG(0)<=DATAIN;--被检测数据打入第一个寄存器的0位

REG(7DOWNTO1)<=REG(6DOWNTO0);--内部寄存器进行向高位的移位操作ENDIF;IFREG=”01111110”THENQ<=‘1’;第二个IF语句是判断检测到”01111110”图5-7简序列时把标志置1ELSSEQ<=‘0’;ENDIF;ENDPROCESS;ENDART;12/20/20235.3存储器设计半导体存储器的种类很多,从功能上可以分为只读存储器(Read_OnlyMemory,简称ROM)和随机存储器(RandomAccessMemory,简称RAM)两大类。本节主要详细描述了只读存储器ROM、静态数据存储器SRAM、先进先出堆栈FIFO的设计。5.3.1只读存储器ROM

只读存储器在正常工作时从中读取数据,不能快速地修改或重新写入数,适用于存储固定数据的场合。下面是一个容量为256×4的ROM存储的例子,该ROM有8位地址线ADR(0)~图5-8只读ROMADR(7),4位数据输出线DOUT(0)~DOUT(3)及使能EN,如图5-8所示。12/20/2023【例5.3.1】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USESTD.TEXTIO.ALL;ENTITYROMIS

PORT(EN:INSTD_LOGIC;

ADR:INSTD_LOGIC_VECTOR(7DOWNTO0);

DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDROM;ARCHITECTUREARTOFROMIS12/20/2023SUBTYPEWORDISSTD_LOGIC_VECTOR(3DOWNTO0);

TYPEMEMORYISARRAY(0TO255)OFWORD;

SIGNALADR_IN:INTEGERRANGE0TO255;

VARIABLEROM:MEMORY;

VARABLESTART_UP:BOOLEAN:=TRUE;

VARABLEL:LINE;

VARABLEJ:INTEGER;

FILEROMIN:TEXTISIN"ROMIN";

BEGINPROCESS(EN,ADR)IFSTART_UPTHEN --初始化开始

FORJINROM'RANGELOOP12/20/2023

READLINE(ROMIN,1);READ(1,ROM(J));

ENDLOOP;

START_UP:=FALSE; --初始化结束

ENDIF;

ADR_IN<=CONV_INTEGER(ADR);--将向量转化成整数

IF(EN=‘1’)THENDOUT<=ROM(ADR_IN);

ELSEDOUT<="ZZZZ";

ENDIF;

ENDPROCESS;ENDART;12/20/20235.3.2静态数据存储器SRAMRAM和ROM的主要区别在于RAM描述上有读和写两种操作,而且在读写上对时间有较严格的要求。下面我们给出一个8×8位的双口SRAM的VHDL描述实例,如图5-9所示。

图5-9双口SRAM12/20/2023【例5.3.2.】8×8位的双口SRAM的VHDL描述(仿真图如图5-10)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDPRAMISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;

ADDER:INTEGER:=3);

PORT(DATAIN:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

DATAOUT:OUT.STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

12/20/2023CLOCK:INSTD_LOGIC;

WE,RE:INSTD_LOGIC;--读写控制信号WADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0);--读地址3位宽

RADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0));--写地址3位宽ENDDPRAM;ARCHITECTUREARTOFDPRAMISTYPEMEMISARRAY(0TODEPTH-1)OF--定义MEM为二维数组,数组有8个元素,每个元素为8位宽度

STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);12/20/2023

SIGNALRAMTMP:MEM;--信号的类型为MEMBEGIN--第一个进程完成将输入数据写入RAM指定地址单元

PROCESS(CLOCK)BEGINIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(WE=‘1’)THEN判写使能信号有效否

RAMTMP(CONV_INTEGER(WADD))<=DATAIN;--调用转换函数把写地址矢量转换为整数

ENDIF;

ENDIF;ENDPROCESS;--读进程12/20/2023PROCESS(CLOCK)BEGINIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(RE=‘1’)THEN--判读使能有效否

DATAOUT<=RAMTMP(CONV_INTEGER(RADD));把输入读地址转换为整数,并把对应单元的数据送输出端口

ENDIF;

ENDIF;

ENDPROCESS;ENDART;12/20/20235.3.3先进先出堆栈FIFOFIFO是先进先出堆栈,作为数据缓冲器,通常其数据存放结构完全与RAM一致,只是存取方式有所不同。图5-11电路为一个8×8FIFO,其VHDL描述如例5.3.3。【例5.3.3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYREG_FIFOISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;ADDR:INTEGER:=3);12/20/2023PORT(DATA:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

Q:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

ACLR:INSTD_LOGIC;图5-118×8FIFO模块

CLOCK:INSTD_LOGIC;

WE:INSTD_LOGIC;

RE:INSTD_LOGIC;FF:OUTSTD_LOGIC;FF:OUTSTD_LOGIC);ENDREG_FIFO;12/20/2023TYPEMEMISARRAY(0TODEPTH-1)OFSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNALRAMTMP:MEM;SIGNALWADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNALRADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNALWORDS:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);ARCHITECTUREARTOFREG_FIFOIS12/20/2023BEGIN--写指针修改进程WRITE_POINTER:PROCESS(ACLR,CLOCK)BEGINIF(ACLR=‘0’)THENWADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(WE=‘1’)THENIF(WADD=WORDS)THENWADD<=(OTHERS=>‘0’);ELSEWADD<=WADD+‘1’;

ENDIF;

ENDIF;12/20/2023

ENDIF;ENDPROCESS;--写操作进程WRITE_RAM:PROCESS(CLOCK)BEGINIF(CLOCK'EVENTANDCLOCK=‘1’)THEN

IF(WE=‘1’)THENRAMTMP(CONV_INTEGER(WADD))<=DATA;

ENDIF;

ENDIF;ENDPROCESS;12/20/2023--读指针修改READ_POINIER:PROCESS(ACLR,CLOCK)BEGINIF(ACLR=‘0’)THENRADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(RE=‘1’)THENIF(RADD=WORDS)THENRADD<=(OTHERS=>‘0’);

ELSERADD<=RADD+‘1’;

ENDIF;

12/20/2023ENDIF;

ENDIF;ENDPROCESS;--读操作进程READ_RAM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论