数字逻辑:5.5.3 VHDL语言的描述风格_第1页
数字逻辑:5.5.3 VHDL语言的描述风格_第2页
数字逻辑:5.5.3 VHDL语言的描述风格_第3页
数字逻辑:5.5.3 VHDL语言的描述风格_第4页
数字逻辑:5.5.3 VHDL语言的描述风格_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

5.5.3VHDL语言的描述风格三种描述风格:

行为描述:使用功能描述

数据流(寄存器传输):使用布尔代数式描述

结构描述:模块间的连接关系描述

5.5.4基本逻辑电路的VHDL设计一、组合电路原则1:在process中用到的所有输入信号都出现在敏感信号列表中;原则2:电路的真值表必须在代码中完整的反映出来。(否则会生成锁存器)1.三态门及总线缓冲器--指定大写“Z”表示高阻态

a<=‘Z’;a_bus<=“ZZZZZZZZ”;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.all;ENTITYtri_gateISport(din,en:INstd_logic;dout:OUTstd_logic);ENDtri_gate;

ARCHITECTUREartOFtri_gateISBEGIN

PROCESS(din,en)

BEGIN

IF(en=‘0’)thendout<=din;

ELSEdout<=‘Z’;

ENDIF;

ENDPROCESSENDart;dinenENdout8位数据总线?2.8:3优先编码器GSlibraryieee;useieee.std_logic_1164.all;ENTITYpriencoderisPORT(din:INSTD_LOGIC_VECTOR(7downto0);ei:INSTD_LOGIC;yout:OUTSTD_LOGIC_VECTOR(2downto0);eo,gs:OUTSTD_LOGIC);ENDpriencoder;ARCHITECTUREcod74148OFpriencoderISBEGINPROCESS(ei,din)BEGINIF(ei='1')THENyout<="111";eo<='1';gs<='1';ELSE

IF(din(7)='0')THENyout<="000";eo<='1';gs<='0';ELSIF(din(6)='0')THENyout<="001";eo<='1';gs<='0';ELSIF(din(5)='0')THENyout<="010";eo<='1';····················································ELSIF(din(0)='0')THENyout<="111";eo<='1';gs<='0';ELSEyout<="111";eo<='0';gs<='1';ENDIF;ENDIF;ENDPROCESS;ENDcod74148;触发器、寄存器、计数器、分频器、节拍发生器、状态机等。二、时序逻辑电路设计时钟上升沿:(clock’eventandclock=‘1’)时钟下降沿:(clock’eventandclock=‘0’)进程的敏感信号是时钟信号,在进程内部用if语句描述时钟的边沿条件。敏感信号表的特点:

1)敏感信号表中只有时钟信号--同步复位等。如:

process(clk)

begin

if(clk’eventandclk=‘1’)then

ifreset=‘1’thendata<=“00”;

elsedata<=in_data;

endif;

end

if;

endprocess;最先判断时钟同步复位同步复位2D触发器2)敏感信号表中除时钟外,还有其它信号--异步操作例:

process(clk,reset)

begin

ifreset=‘1’thendata<=“00”;

elsif(clk’eventandclk=‘1’)thendata<=in_data;

endif;

endprocess;

最先判断异步复位同步、异步区别:敏感信号表、语句顺序对于判断时钟电路边沿,后没有“else”语句。2)计数器描述计数器(std_logic_vector),要用到中间信号和标准的程序包:IEEE.STD_LOGIC_UNSIGNEDlibraryIEEE;use

IEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycounter10isPort

(clk:in

std_logic;load:in

std_logic;din:instd_logic_vector(3downto0);qout:outstd_logic_vector(3downto0);

c:outstd_logic);endcounter10;例:异步置数(低有效)的10进制计数器。architectureartof

counter10

is

signal

temp:std_logic_vector(3downto0);beginprocess(clk,load,din)begin

if(load='0')then

temp<=din;

elsif(clk’eventandclk=‘1’)then

if(temp=“1001“)thentemp<="0000";

else

temp<=temp+1;

endif;

endif;endprocess;qout<=temp;c<='1‘whentemp=“1001”else‘0’;

endart;为描述计数过程,定义中间信号。--if(temp=9)then--whentemp=9elseprocess(clk,reset,din)

begin

if(load='0')then

temp<=din;elsif

(clk’eventandclk=‘1’)then

if(temp=9)thentemp<="0000";c<=‘1’;

else

temp<=temp+1;c<=‘0’;

endif;

endif;endprocess;qout<=temp;Endart

················if(clk’eventandclk=‘1’)then

if(temp=m-1)thentemp<="00···00";

else

temp<=temp+1;

endif;endif;endprocess;q<=temp;

c<='1‘whentemp=m-1else‘0’;例:六十进制(分、秒)计数器libraryIEEE;use

IEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityclock60is

Port(clk:in

std_logic;clr:in

std_logic;s1:outstd_logic_vector(3downto0);s10:outstd_logic_vector(2downto0);co:out

std_logic);endclock60;architectureartof

clock60

is

signal

s1_temp:std_logic_vector(3downto0);

signals10_temp:std_logic_vector(2downto0);与一般二进制计数器不同,分个位十位显示,为分、秒计数beginprocess(clk,clr)beginif(clr=‘1‘)thens1_temp<=“0000”;s10_temp<=“000”;elsif

(clk’eventandclk=‘1’)then

if(s1_temp=9)thens1_temp<="0000";

if(s10_temp=5)thens10_temp<=“000”;else

s10_temp<=s10_temp+1;

endif;else

s1_temp<=s1_temp+1;

endif;

endif;

endprocess;s1<=s1_temp;s10<=s10_temp;co<=‘1’when(s10_temp=5ands1_temp=9)

else‘0’;Endart;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYaddISPORT(clk,x,y:INSTD_LOGIC;qout:OUTSTD_LOGIC_VECTOR(2DOWNTO0);co:OUTSTD_LOGIC);ENDadd;ARCHITECTUREbehvOFaddIsSIGNALcon:std_logic_vector(1downto0);SIGNALtemp:std_logic_vector(2downto0);SIGNALm:integerrange7downto0;BEGINPROCESS(x,y)begincon<=x&y;caseconiswhen"00“=>m<=3;when"01"=>m<=4;when"10"=>m<=6;whenothers=>m<=7;ENDcase;

ENDprocess;模可控计数器(由输入x,y控制)M=3,4,6,7PROCESS(clk,m)beginif(clk'eventandclk='1')thenif(temp=m-1)thentemp<="000";elsetemp<=temp+1;ENDIF;ENDIF;

ENDPROCESS;

qout<=temp;co<='1'whentemp=m-1else'0';ENDbehv;M=3,4,6,7例:设计5000分频器libraryIEEE;use

IEEE.STD_LOGIC_1164.ALL;entityfpisPort

(clk:in

std_logic;clkout

:outstd_logic);endfp;architectureartof

fp

is

signaltemp:integer

range0to4999;Begin

process

(clk)

begin

if(clk’eventandclk=‘1’)then

if(temp=4999)thentemp<=0;elsetemp<=temp+1;

endif;endif;endprocess;clkout<='1'when(temp<2500)else'0';

endart;(占空比50%)例:8位环形移位寄存器(左、右移、异步置数)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityshfrtisPort

(clk,load,con:instd_logic;din:in

std_logic_vector(7downto0);qout

:outstd_logic_vector(7downto0));endshfrt;architectureartofshfrt

is

signalq_temp:std_logic_vector(7downto0);

beginprocess(clk,load,din)

begin

if

load=‘1’thenq_temp<=din;

elsif(clk’eventand

clk=‘1’)thenif

con=‘1’thenq_temp<=q_temp(6downto

0)&q_temp(7);

elseq_temp<=q_temp(0)&q_temp(7downto1);

endif;

endif;

Endprocess;qout<=q_temp;Endart;例:环型顺序脉冲发生器(4位)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityindexis

Port(clk,ld:in

std_logic;y

:outstd_logic_vector(3downto0));endindex;architectureartof

index

issignal

q:std_logic_vector(3downto0);beginprocess(clk)

begin

if(clk’eventandclk=‘1’)

then

ifld=‘0’thenq<=“1000”;

elseq<=q(0)&q(3downto1);

endif;

endif;

Endprocess;y<=q;

End

art;3)状态机

用户自定义数据类型利用用户自定义数据类型--枚举类型实现。type数据类型名is

数据类型定义(枚举);

语法格式:综合器自动实现枚举类型元素的编码typestatetype

is

(s0,s1,s2,s3);signalpresent_state,next_state:statetype;……typeweekis(sun,mon,tue,wed,thu,fri,sat);Signalday:week;……day<=sun;present_state<=S0;

状态机整体描述结构和输出的描述

组合进程:描述状态逻辑、输出逻辑;时序进程:描述从次态到现态转换;

——

两段式有限状态机

状态转移的描述CASE

现态IS

WHEN

表达式值1=>顺序处理语句11;语句12;

……

WHEN表达式值3=>顺序处理语句31;语句32;

ENDCASE;Moore型状态机的描述LIBRARYIEEE;USE

IEEE.STD_LOGIC_1164.ALL;ENTITYmooreIS

PORT(clk,x:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDmoore;ARCHITECTUREbehvOFmooreIS

TYPE

StateIS(s0,s1,s2,s3);SIGNALcurrent_state,next_state:State;BEGIN第一进程,完成状态转换,必须饱含时钟敏感信号REG:

PROCESS

(clk)

BEGIN

IF

(clk'EVENTandclk='1')THEN

current_state<=next_state;

ENDIF;

ENDPROCESS;COM:PROCESS

(current_state,x)

BEGIN

CASEcurrent_stateIS

WHENs0=>y<=‘0’;

IFx=‘0’THEN

next_state<=s0;

ELSE

next_state<=s1;

ENDIF;

WHENs1=>y<=‘1’;

IFx=‘0’THEN

next_state<=s2;

ELSE

next_state<=s1;

ENDIF;

WHENs2=>y<=‘0’;

IFx=‘0’THEN

next_state<=s3;

ELSE

next_state<=s2;END

if;

第二进程:输出和状态逻辑间关系,必须包含现态、输入等敏感信号

WHENs3=>y<=‘0’;IFx=‘0’THEN

next_state<=s1;

ELSE

next_state<=s0;

ENDIF;ENDCASE;

ENDprocess;ENDbehy;摩尔型LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmealyIS

PORT(clk,x:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDmealy;ARCHITECTUREbehvOFmealyIS

TYPE

stateIS(s0,s1,s2,s3);

SIGNALcurrent_state,next_state:state;BEGIN

REG:

PROCESS(clk)

BEGIN

IF

(clk'EVENTandclk='1')THEN

current_state<=next_state;

ENDIF;

ENDPROCESS;Mealy型有限状态机的设计1/0COM:PROCESS

(current_state,x)BEGIN

CASEcurrent_stateIS

WHENs0=>IFx=‘0’THENnext_state<=s0;y<=‘0’;

ELSE

next_state<=s1;

y<=‘0’;

ENDIF;

WHENs1=>IFx=‘0’THEN

next_state<=s0;

y<=‘0’;

ELSE

next_state<=s2;

y<=‘0’;

ENDIF;1/0WHENs2=>IFx=‘0’THEN

next_state<=s0;y<=‘0’;

ELSE

next_state<=s3;y<=‘0’;

ENDIF;

WHENs3=>IFx=‘0’THEN

next_state<=s0;y<=‘0’;

ELSE

next_state<=s3;y<=‘1’;

ENDIF;ENDcase;

ENDPROCESS;ENDbehv;1/05.5.4VHDL的层次化(结构化)设计与元件例化(component)语句在多层次的设计中,高层次的设计模块调用低层次的设计模块,构成模块化的设计。重点描述模块间的连接关系。由元件声明、元件例化两部分关键语句组成。被例化元件的来源:

VHDL设计实体;其它HDL设计实体;厂商提供的工艺库中的元件、IP核。层次化设计的优点:分工共享移植周期短一个元件是一段结构完整的常用代码,包括声明,实体和结构体,使用component可以使代码具有层次化的结构。1.元件声明:在结构体说明区中对所调用的低层次的实体模块(名称、端口类型等)声明为元件。

2.元件例化:将低层次元件调用、安装到当前层次。给出连接映射。COMPONENT元件名PORT

(端口名表);ENDCOMPONENT

;例化名:低层元件名

PORTMAP(端口列表);语法格式:语法格式:端口列表:低层端口名=>当前名称(或,直接位置映射)一位全加器的原理图

LIBRARYIEEE;--或门逻辑描述

USEIEEE.STD_LOGIC_1164.ALL;ENTITYor2aIS

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

END

or2a;

ARCHITECTUREart1OFor2aIS

BEGINc<=aORb;ENDart1;LIBRARYIEEE;--半加器描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderIS

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

BEGIN

so<=aXORb;co<=aANDb;ENDart2;必须与元件例化中的端口顺序一致LIBRARYIEEE;--1位二进制全加器顶层设计描述

USE

IEEE.STD_LOGIC_1164.ALL;ENTITYf_adderIS

PORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);

ENDf_adder;ARCHITECTUREart3OFf_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;

BEGINu1:h_adderPORT

MAP(ain,bin,d,e);u2:h_adderPORT

MAP(a=>e,b=>cin,co=>f,so=>sum);u3:or2aPORT

MAP(d,f,cout);--元件例化

ENDart3;VHDL举例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcount4IS

PORT(clk,x:INSTD_LOGIC;qout:OUTSTD_LOGIC

_VECTOR(1DOWNTO0);y:OUTSTD_LOGIC);ENDcount4;ARCHITECTUREbehvOFcount4IS

TYPE

stateIS(s0,s1,s2,s3);

SIGNALc_state,n_state:state;BEGIN

REG:

PROCESS(clk)

BEGIN

IF

(clk'EVENTandclk='1')THEN

c_state<=n_state;

ENDIF;

ENDPROCESS;4进制格雷码可逆计数器X=0时顺时针000111100/11/1s0s1s2s30/00/00/01/01/01/0COM:PROCESS

(c_state,x)BEGIN

CASEc_stateIS

WHENs0=>qout<=“00”;

IFx=‘0’THENn_state<=s1;y<=‘0’;

ELSE

n_state<=s3;

y<=‘1’;

ENDIF;

WHENs1=>qout<=“01”;

IFx=‘0’THEN

n_state<=s2;

y<=‘0’;

ELSE

n_state<=s0;

y<=‘0’;

ENDIF;000111100/11/1s0s1s2s30/00/00/01/01/01/0WHENs2=>qout<=“11”;

IFx=‘0’THENn_state<=s3;y<=‘0’;

ELSE

n_state<=s1;y<=‘0’;

ENDIF;

WHENs3=>qout<=“10”;

IFx=‘0’THEN

n_state<=s0;y<=‘1’;ELSE

n_state<=s2;y<=‘0’;

ENDIF;ENDcase;

ENDPROCESS;

温馨提示

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

评论

0/150

提交评论