计算机软件及应用第4章VHDL设计实例_第1页
计算机软件及应用第4章VHDL设计实例_第2页
计算机软件及应用第4章VHDL设计实例_第3页
计算机软件及应用第4章VHDL设计实例_第4页
计算机软件及应用第4章VHDL设计实例_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

第四章基本逻辑电路设计实例组合逻辑电路设计时序逻辑电路设计存储器设计状态机设计一、4选1多路选择器四选一yabcds0s1组合逻辑电路的设计LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYmux4ISPORT(a,b,c,d,s0,s1:INstd_logic; y:OUTstd_logic);ENDmux4;ARCHITECTUREfuncOFmux4ISVARIABLE

sel:std_logic_vector(1DOWNTO0);BEGIN

sel<=s1&s0;y<=aWHENsel=‘00'ELSE

bWHENsel=‘01’ELSE

cWHENsel=‘10’ELSE dWHENsel=‘11’ELSE ‘X’;ENDfunc;PROCESS(s0,s1)sel:=s1&s0

CASEselIS

WHEN‘00’=>y<=‘a’;

WHEN‘01’=>y<=‘b’;

WHEN‘10’=>y<=‘c’;

WHEN‘11’

=>y<=

‘d’;

WHENOTHERS=>y<=‘X’;

ENDCASE;ENDPROCESS;BEGINPROCESS(s0,s1)BEGIN

IF(s0=‘0’ands1=‘0’)THENy<=‘a’;

ELSIF(s0=‘0’ands1=‘1’)THENy<=‘b’;

ELSIF(s0=‘1’ands1=‘0’)THENy<=‘c’;

ELSIF(s0=‘1’ands1=‘1’)THENy<=‘d’;

ELSEy<=‘X’;

ENDIF;ENDPROCESS;二:编码器与译码器1、优先级8-3编码器编码器y0d0d1d2d3d4d5d6d7y1y2输入输出d7d6d5d4d3d2d1d0y2y1y01-------11101------110001-----1010001----10000001---011000001--0100000001-00100000000000优先编码器就是当有两个或两个以上的输入有效时,仅对优先级高的输入进行编码LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYencoder8_3ISPORT(d:INstd_logic_vector(7downto0); y0,y1,y2:OUTstd_logic);ENDencoder8_3;ARCHITECTUREfuncOFencoder8_3ISBEGINPROCESS(d)VARIABLEtemp:std_logic_vector(2downto0);BEGIN IF(d(7)=‘1’)THENtemp:=“111”; ELSIF(d(6)=‘1’)THENtemp:=“110”; ELSIF(d(5)=‘1’)THENtemp:=“101”; ELSIF(d(4)=‘1’)THENtemp:=“100”; ELSIF(d(3)=‘1’)THENtemp:=“011”; ELSIF(d(2)=‘1’)THENtemp:=“010”; ELSIF(d(1)=‘1’)THENtemp:=“001”; ELSIF(d(0)=‘1’)THENtemp:=“000”;ENDIFy(0)<=temp(0);y(1)<=temp(1);y(2)<=temp(2);ENDPROCESSENDfunc;普通8-3编码器CASEdIS WHEN‘10000000’=>temp<=‘111’;

WHEN‘01000000’=>temp<=‘110’;

WHEN‘00100000’=>temp<=‘101’;

WHEN‘00010000’=>temp<=‘100’;

WHEN‘00001000’

=>temp<=‘011’;WHEN‘00000100’=>temp<=‘010’;WHEN‘00000010’=>temp<=‘001’;WHEN‘00000001’=>temp<=‘000’;

WHEN

OTHERS

=>temp<=‘XXX’;ENDCASE;2、138译码器选通输入地址输入译码器输出g1g2ag2ba2a1a0y7y6y5y4y3y2y1y0-1----11111111--1---111111110-----111111111000001111111010000111111101100010111110111000111111011110010011101111100101110111111001101011111110011101111111LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYdecoder3_8ISPORT(a2,a1,a0,g1,g2a,g2b:INstd_logic; y:OUTstd_logic_vector);ENDdecoder3_8;ARCHITECTUREfuncOFdecoder3_8ISBEGINPROCESS(a2,a1,a0,g1,g2a,g2b)VARIABLEtemp:std_logic_vector(2downto0);BEGIN temp:=a2&a1&a0; IF(g1=‘1’andg2a=‘0’andg2b=‘0’)THEN CASEtempIS WHEN“000”=>y<=“11111110”

WHEN“111”=>y<=“01111111”; WHEN“OTHERS”=>y<=“XXXXXXXX”; ENDCASE;ELSE y<=“11111111” ENDIF;ENDPROCESS;ENDfunc;三:加法器1、一位全加器半加器h_adder的描述一位全加器可以由两个半加器和一个与门连接而成。LIBRARYIEEE;--半加器描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDh_adder;ARCHITECTUREfh1OFh_adderisBEGINso<=NOT(aXOR(NOTb));co<=aANDb;ENDfh1;全加器f_adder电路图及其实体模块LIBRARYIEEE;--1位二进制全加器顶层设计描述

USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDf_adder;ARCHITECTUREfd1OFf_adderIS

COMPONENTh_adder--调用半加器声明语句

PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);

ENDCOMPONENT

COMPONENTor2aPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);

ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;--定义3个信号作为内部的连接线。

BEGINu1:h_adderPORTMAP(a=>ain,b=>bin,co=>d,so=>e);--例化语句

u2:h_adderPORTMAP(a=>e,

b=>cin,

co=>f,so=>sum);u3:or2aPORTMAP(a=>d,

b=>f,

c=>cout);ENDfd1;2、串行进位加法器

两个多位二进制数相加时,除了最低位之外,每一位相加都必须包括低位进位,因此必须使用全加器。按照加法规则,只需将低位全加器的进位输出端Ci接到高位全加器的进位输入端Ci+1就可以构成多位二进制加法器。例:两个二位数相加串行进位链:c0<=(a0andb0)or((a0orb0)andcin);c1<=(a1andb1)or((a1orb1)andc0);a0b0a1b1cinc0c1

时序逻辑电路的设计

时序电路中,任一时刻的输出信号不仅取决于当时的输入信号,而且还取决于电路原来的状态,即还和以前的输入信号及输出有关。也就是说,时序逻辑电路具有记忆功能。一:时钟信号和复位信号

任何时序电路都是以时钟信号为驱动程序的,时序电路也只有在时钟信号的边沿到来时,其状态才发生改变。因此,时钟信号通常是描述时序电路的程序的执行条件,时序电路也总是以时钟进程形式来进行描述。1、时钟信号1)、进程的敏感信号是时钟信号PROCESS(clock_Signal)BEGIN IF(clock_edge_condition)THEN Signal_out<=Signal_in; …… ENDIF;ENDPROCESS;

2)、用进程中的WAIT语句等待时钟信号PROCESSBEGINWAITON(clock_Signal) UNTIL(clock_edge_condition) Signal_out<=Signal_in; ……ENDPROCESS;

时钟沿描述:上升沿:If(clk’eventandclk=‘1’)ThenIf(rising_edge(clk))ThenWaitUntilclk=‘1’If(clk’last_value=‘0’andclk’eventand clk=‘1’)Then下降沿:If(clk’eventandclk=‘0’)ThenIf(falling_edge(clk))ThenWaitUntilclk=‘0’If(clk’last_value=‘1’andclk’eventand clk=‘0’)Then2、复位信号

触发器的初始状态是由复位信号来设置。根据复位信号对触发器复位的操作不同,分为同步复位和非同步复位(异步复位)两种。1)、同步复位2)、非同步复位

当复位信号有效,且在给定的时钟边沿到来时,触发器才被触发。一旦复位信号有效,触发器就被触发。

在用VHDL语言描述时,同步复位一定在以时钟为敏感信号的进程中定义,且用If语句来描述必要的复位条件。PROCESS(clock_Signal)BEGIN IF(clock_edge_condition)THEN IF(reset_condition)Then Signal_out<=reset_value; ElseSignal_out<=Signal_in; …… ENDIF;

ENDIF;ENDPROCESS;

PROCESSBEGINWaiton(clock_Signal) Until(clock_edge_condition) IF(reser_condition)Then Signal_out<=reset_value; Else Signal_out<=Signal_in; …… ENDIF;ENDPROCESS;

在用VHDL语言描述异步复位时,首先在进程的敏感信号中除时钟信号外,还应加上复位信号;然后用If语句来描述必要的复位条件;最后在Eleif段描述时钟信号边沿条件,并加上event属性。PROCESS(reset_Signal,clock_Signal)BEGINIF(reset_condition)THEN Signal_out<=reset_value;Elsif(clock_eventandclock_edge_condition)Then ElseSignal_out<=Signal_in; ……ENDIF;ENDPROCESS;

二:D触发器LIBRARYIEEE;

USEIEEE.std_logic_1164.all;

ENTITYdffIS

PORT(data,clk:INSTD_LOGIC;

Q:OUTSTD_LOGIC);

ENDdff;

ARCHITECTUREBehaviorOFdffIS

BEGIN

PROCESS(clk)

BEGIN

IFclk'EVENTANDclk=‘1'THEN

Q<=data;

ENDIF;

ENDPROCESS;

ENDBehavior;D>CPQQclkdata1、D触发器不推荐LIBRARYIEEE;

USEIEEE.std_logic_1164.all;

ENTITYdffIS

PORT(data,clk:INSTD_LOGIC;

Q:OUTSTD_LOGIC);

ENDdff;

ARCHITECTUREBehaviorOFdffIS

BEGIN

PROCESS

BEGIN

WaitUntilclk'EVENTANDclk=‘1' Q<=data;ENDPROCESS;

ENDBehavior;2、带异步复位上升沿的D触发器D>CPQQclkdataresetLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_resetISPORT(data:INSTD_LOGIC; clk:INSTD_LOGIC; reset:INSTD_LOGIC; Q:OUTSTD_LOGIC);ENDdff_reset;ARCHITECTUREdffOFdff_resetISBEGINPROCESS(clk,reset)BEGIN IFreset=‘0’THEN Q<=‘0’;Elsifclk’eventandclk=‘1’THEN Q<=data; ENDIF; ENDIF;ENDPROCESS;ENDdff;3、带异步置位复位上升沿的D触发器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_asynISPORT(data:INSTD_LOGIC; clk:INSTD_LOGIC; reset:INSTD_LOGIC; set:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDdff_asyn;D>CPQQclkdataresetsetARCHITECTUREdffOFdff_asynISBEGIN

PROCESS(clk,set,reset)BEGIN IFset=‘0’THEN Q<=‘1’;

Elsifreset=‘1’THEN Q<=‘0’;

Elsif

clk’eventandclk=‘1’THEN Q<=data; ENDIF;ENDPROCESS;ENDdff;4、带异步复位和输入使能上升沿的D触发器D>CPQQclkdataresetenLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_ck_enISPORT(data:INSTD_LOGIC; clk:INSTD_LOGIC; reset:INSTD_LOGIC; en:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDdff_ck_en;ARCHITECTUREdffOFdff_ck_enISBEGINPROCESS(clk,reset)BEGIN IFreset=‘0’THEN Q<=‘0’;Elsifclk’eventandclk=‘1’THEN IFen=‘1’THEN Q<=data; ENDIF; ENDIF;ENDPROCESS;ENDdff_ck_en;三:寄存器

在数字系统中能够用来存储一组二进制码的同步时序逻辑电路,一般由多位触发器连接而成。通常可以按功能分为:锁存器和移位寄存器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYreg4bISPORT(load:INSTD_LOGIC din:INSTD_LOGIC_VECTOR(3DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDreg4b;ARCHITECTUREbehavOFreg4bisBEGINPROCESS(load,din)BEGINIFload’eventandload=‘1’THEN dout<=din;ENDIF;ENDPROCESS;ENDbehav;1、4位锁存器2、串行输入、并行输出移位寄存器

移位寄存器除了具有存储二进制码的功能以外,还具有移位功能。即寄存器里面存储的代码能够在时钟的作用下依次进行左移或者右移。移位寄存器不仅可以用来存储数据,还可以用来实现数值运算和数据处理等。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYshiftISPORT(clk,rst,data:INSTD_LOGIC;q:OUTSTD_LOGIC_VICTOR(7downto0));ENDshift;ARCHITECTUREsh1OFshiftisSignalq_temp:STD_LOGIC_VECTOR(7downto0)BEGIN PROCESS(clk,rst) BEGIN IFrst=‘1’THEN q_temp<=(others=>‘0’)); Elsifclk’eventandclk=‘1’THEN q_temp<=q_temp(6downto0)&data; ENDIF; ENDPROCESS; q<=q_temp;ENDsh1;8位带置位移位锁存器3、串行输入、串行输出移位寄存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYshiftISPORT(clk,a:INSTD_LOGIC;b:OUTSTD_LOGIC_VICTOR(4downto0));ENDshift;ARCHITECTUREsh2OFshiftisCOMPONENTdffPORT(d,clk:INSTD_LOGIC; q:OUTSTD_LOGIC);Signalz:STD_LOGIC_VECTOR(4downto0)BEGINz(4)<=a;G1:FORiIN3downto0GENERATE Dffx:dffPORTMAP(z(i),clk,z(i+1));ENDGENERATE;b<=z(0);ENDsh2;3、通用寄存器

通用寄存器可以直接设置初始值,完成双向移位寄存器功能,加法计数器功能、减法计数器功能。初始值并行输入置数。由3位二进制数输入控制工作模式。当寄存器计数为0时,引脚term输出高电平。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYunicISGENERIC(n:Positive:=8);PORT(clk,shl,shr:INSTD_LOGIC;mode:OUTSTD_LOGIC_VICTOR(2downto0) datain:INSTD_LOGIC_VICTOR((n-1)downto0) dataout:OUTSTD_LOGIC_VICTOR((n-1)downto0) term:OUTSTD_LOGIC);ENDunic;ARCHITECTUREv1OFunicisSignaltemp:STD_LOGIC_VECTOR((n-1)downto0)BEGINPROCESSBEGIN WAITuntilrising_edge(clk) CASEmodeIS WHEN“000”=>temp<=(others=>‘0’); WHEN“001”=>temp<=datain; WHEN“010”=>temp<=temp+1; WHEN“011”=>temp<=temp-1; WHEN“100”=>temp<=temp((n-2)downto0)&shl; WHEN“101”=>temp<=shr&temp((n-1downto0)); WHENothers=>NULL; ENDCASE;ENDPROCESS;PROCESS(temp) BEGIN term<=‘1’; FORiINtemp’rangeLOOP IFtemp(i)=‘1’THEN; temp<=‘0’ EXIT; ENDIF; ENDLOOP; ENDPROCESS; dataout<=temp;ENDv1;

4、移位寄存器

移位寄存器除了具有存储代码的功能以外,还具有移位功能。所谓移位功能,是指寄存器里存储的代码能在移位脉冲的作用下依次左移或右移。因此,移位寄存器不但可以用来寄存代码,还可用来实现数据的串/并转换、数值的运算以及数据处理等。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTERISPORT(DATA:INSTD_LOGIC_VECTOR(7DOWNTO0);

SHIFT_LEFT,SHIFT_RIGHT:INSTD_LOGIC;

RESET:INSTD_LOGIC;

MODE:INSTD_LOGIC_VECTOR(1DOWNTO0);

QOUT:BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));ENDSHIFTER;ARCHITECTUREARTOFSHIFTERISBEGIN PROCESS BEGINWAITUNTIL(RISING_EDGE(CLK));

IF(RESET=‘1’)THENQOUT<=“00000000”;

ELSE CASEMODEISWHEN"01"=>QOUT<=SHIFT_RIGHT&QOUT(7DOWNTO1);WHEN"10"=>QOUT<=QOUT(6DOWNTO0)&SHIFT_LEFT;WHEN“11”=>QOUT<=DATA;WHENOTHERS=>NULL;

ENDCASE;

ENDIF;ENDPROCESS;ENDARCHITECTUREART;四:计数器

计数器是在数字系统中使用最多的时序电路,它不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNTM60ISPORT(CI:INSTD_LOGIC;

NRESET:INSTD_LOGIC;

LOAD:INSTD_LOGIC;

D:INSTD_LOGIC_VECTOR(7DOWNTO0);

CLK:INSTD_LOGIC;

CO:OUTSTD_LOGIC;

QH:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0);

QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDCNTM60;1、同步计数器模为60,带异步复位、同步置数功能的8421BCD码计数器。ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';

PROCESS(CLK,NRESET)ISBEGIN

IF(NRESET=‘0’)THEN QH<="0000";

QL<=“0000”;

ELSIF(CLK'EVENTANDCLK=‘1’)THEN

IF(LOAD=‘1’)THEN QH<=D(7DOWNTO4);

QL<=D(3DOWNTO0); ELSIF(CI=‘1’)THEN

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

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

ELSE QH<=QH+1;

ENDIF;

ELSE QL<=QL+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;ENDART;2、异步计数器

用VHDL语言描述异步计数器,与同步计数器不同之处主要表现在对各级时钟的描述上。下面是一个由4个触发器构成的异步计数器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDIFFRISPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB;OUTSTD_LOGIC);ENDDIFFR;ARCHITECTUREART1OFDIFFRISSIGNAQ_IN:STD_LOGIC;BEGINQ<=Q_IN;

QB<=NOTQ_IN;PROCESS(CLK,CLR)ISBEGINIF(CLR=‘1’)THEN Q_IN<=‘0’;

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

ENDIF;

ENDPROCESS;ENDART1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRPLCOUNTISPORT(CLK,CLR:INSTD_LOGIC;

COUNT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDRPLCOUNT;ARCHITECTUREART2OFRPLCOUNTISSIGNACOUNT_IN:STD_LOGIC_VECTOR(4DOWNTO0);COMPONENTDIFFRISPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);ENDCOMPONENTDIFFR;BEGIN COUNT_IN(0)<=CLK;

GEN1:FORIIN0TO3GENERATE U:DIFFRPORTMAP(CLK=>COUNT_IN(I),

CLR=>CLR,

D=>COUNT_IN(I+1),

Q=>COUNT_IN(I),

QB=>COUNT_IN(I+1));

ENDGENERATEGEN1;ENDART2;存储器设计

半导体存储器从功能上可以分为只读存储器和随机存储器两大类。两类存储器描述中的相同问题——存储器中的数据类型:

通常用数组来描述存储器结构,数组的元素就是存储器中的数据。1.ROM

只读存储器在正常工作时从中读取数据,不能快速地修改或重新写入数,适用于存储固定数据的场合。下面是一个容量为256×4的ROM存储的例子,该ROM有8位地址线ADR(0)~ADR(7),4位数据输出线DOUT(0)~DOUT(3)及使能信号EN。注意:需要初始化LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USESTD.TEXTIO.ALL;ENTITYROMISPORT(EN:INSTD_LOGIC;

ADR:INSTD_LOGIC_VECTOR(7DOWNTO0);

DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDROM;ARCHITECTUREARTOFROMISSUBTYPEWORDISSTD_LOGIC_VECTOR(3DOWNTO0);

TYPEMEMORYISARRAY(0TO255)OFWORD;

SIGNAADR_IN:INTEGERRANGE0TO255;

VARIABLEROM:MEMORY;

VARIABLESTART_UP:BOOLEAN:=TRUE;

VARIABLEL:LINE;

VARIABLEJ:INTEGER;

FILEROMIN:TEXTISIN“ROMIN”;BEGINPROCESS(EN,ADR)ISBEGINIFSTART_UPTHEN FORJINROM'RANGELOOPREADLINE(ROMIN,1);

READ(1,ROM(J));

ENDLOOP;

START_UP:=FALSE ENDIF;

ADR_IN<=CONV_INTEGER(ADR);

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

ELSE DOUT<="ZZZZ";

ENDIF;

ENDPROCESS;ENDART;初始化2.SRAMRAM和ROM的主要区别在于RAM描述上有读和写两种操作,而且在读/写上对时间有较严格的要求。下面是一个8×8位的双口SRAM。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:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

CLOCK,WE,RE:INSTD_LOGIC;

WADD,RADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0);ENDDPRAM;ARCHITECTUREARTOFDPRAMISTYPEMEMISARRAY(0TODEPTH-1)OFSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNARAMTMP:MEM;BEGINPROCESS(CLOCK)IS BEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’)THEN RAMTMP(CONV_INTEGER(WADD))<=DATAIN;

ENDIF;

ENDIF;

ENDPROCESS; PROCESS(CLOCK)IS BEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’)THEN DATAOUT<=RAMTMP(CONV_INTEGER(RADD));

ENDIF;

ENDIF;

ENDPROCESS;ENDART;3.队列先进先出队列FIFO,作为数据缓冲器,通常其数据存放结构完全与RAM一致,只是存取方式有所不同。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYREG_FIFOISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;

ADDR:INTEGER:=3);

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

Q:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

ACLR,CLOCK,WE,RE:INSTD_LOGIC;

EF,FF:OUTSTD_LOGIC;ENDREG_FIFO;TYPEMEMISARRAY(0TODEPTH-1)OFSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNARAMTMP:MEM;SIGNAWADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNARADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNAWORDS:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);ARCHITECTUREARTOFREG_FIFOISBEGINPROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN WADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’)THEN IF(WADD=WORDS)THEN WADD<=(OTHERS=>‘0’);

ELSE WADD<=WADD+‘1’;

ENDIF;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(CLOCK)ISBEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’)THEN RAMTMP(CONV_INTEGER(WADD))<=DATA;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN RADD<=(OTHERS=>‘0’);

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

ELSE RADD<=RADD+‘1’;

ENDIF;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(CLOCK)ISBEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’)THEN Q<=RAMTMP(CONV_INTERGER(RADD));

ENDIF;

ENDIF;ENDPROCESS;PROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN FF<=‘0’;

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’ANDRE=‘0’)THEN IF((WADD=RADD-1)OR ((WADD=DEPTH-1)AND(RADD=0)))THEN FF<=‘1’;

ENDIF;

ELSE FF<=‘0’;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN EF<='0'; ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’ANDWE=‘0’)THEN IF((WADD=RADD+1)OR ((RADD=DEPTH-1)AND(WADD=0)))THEN EF<=‘0’;

ENDIF;

ELSE EF<=‘1’;

ENDIF;

ENDIF;ENDPROCESS;ENDART;状态机的VHDL设计1、

状态机的基本结构和功能状态机是一类很重要的时序电路,是许多数字电路的核心部件。状态机的一般形式如图所示。

状态机的基本操作有两种:

(1)状态机内部状态转换。状态机的下一状态由状态译码器根据当前状态和输入条件决定。

(2)产生输出信号序列。输出信号由输出译码器根据当前状态和输入条件决定。在产生输出的过程中,由是否使用输入信号可以确定状态机的类型。两种典型的状态机是摩尔(MOORE)状态机和米立(MEALY)状态机。

使用枚举类数据类型来定义状态机的状态,并使用多进程方式来描述状态机的内部逻辑。

多进程中,一个用来描述时序逻辑,包括状态寄存器的工作和状态的输出;一个描述组合逻辑,包括进程间状态值的传递逻辑以及状态转换值的输出。进程间一般是并行运行的,但由于敏感信号的设置不同以及电路的延迟,在时序上,进程间的动作是有先后的。用于进程间信息传递的信号,在状态机设计中称为反馈信号。2、

一般状态机的VHDL设计图:一般状态机结构框图LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYs_machineISPORT(clk,reset:INSTD_LOGIC;state_inputs:INSTD_LOGIC_VECTOR(0TO1);comb_outputs:OUTINTEGERRANGE0TO15);ENDs_machine;ARCHITECTUREbehvOFs_machineIS

TYPEFSM_STIS(s0,s1,s2,s3);

SIGNALcurrent_state,next_state:FSM_ST;BEGIN

REG:PROCESS(reset,clk)

--主控时序进程

BEGINIFreset='1'THENcurrent_state<=s0;ELSIFclk='1'ANDclk'EVENTTHENcurrent_state<=next_state;ENDIF;ENDPROCESSREG;WHENs3=>comb_outputs<=14;IFstate_inputs="11"THENnext_state<=s3;ELSEnext_state<=s0;ENDIF; ENDCASE;ENDPROCESSCOM;ENDBEHV;3、Mealy状态机和Moore状态机的VHDL设计图:Mealy类型的状态机的逻辑电路框图图:Moore类型的状态机的逻辑电路框图有限状态机FSM由以下三部分组成:

▲当前状态寄存器电路:为时序电路,由时钟信号和次态逻辑电路控制状态的变化。

▲次态逻辑电路:为组合电路,次态由输入信号和当前状态决定。

▲输出逻辑电路:对于Mealy类型的状态机,输出由当前状态和输入信号决定;对于Moore类型的状态机,输出仅由当前状态决定。1、用VHDL描述一个状态转换图如图所示的Mealy类型的状态机。输入信号为data_in<1:0>,时钟输入信号为clock,复位控制信号为reset(低电平有效),输出信号为data_out。状态机有5个状态,复位控制信号reset有效时,状态机的状态为st0状态。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmealyISPORT(clock,reset:INSTD_LOGIC;data_out:OUTSTD_LOGIC;data_in:INSTD_LOGIC_VECTOR(1DOWNTO0));ENDmealy;ARCHITECTUREbehaveOFmealyISTYPEstate_valuesIS(st0,st1,st2,st3,st4);SIGNALpres_state,next_state:state_values;BEGINstatereg:PROCESS(clock,reset)BEGIN IF(reset='0')THEN pres_state<=st0; ELSIF(clock’EVENTANDclock='1')THEN pres_state<=next_state; ENDIF;ENDPROCESSstatereg;fsm:PROCESS(pres_state,data_in)BEGIN

CASEpres_stateIS WHENst0=> CASEdata_inIS WHEN"00"=>next_state<=st0; WHEN"01"=>next_state<=st4;

温馨提示

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

评论

0/150

提交评论