D触发器电路全加器_第1页
D触发器电路全加器_第2页
D触发器电路全加器_第3页
D触发器电路全加器_第4页
D触发器电路全加器_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

会计学1D触发器电路全加器主要内容

DFF的VHDL描述

全加器的VHDL描述第1页/共46页libraryieee;useieee.std_logic_1164.all;entitydff1isport(clk,d:

instd_logic;

q:outstd_logic);end;architecturebhvofdff1issignalq1:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')thenq1<=d;endif;endprocess;q<=q1;end;库、程序包实体结构体第2页/共46页STD_LOGIC标准逻辑位数据类型STD_LOGIC比BIT包含的内容丰富和完整

BIT:’0’、’1’

STD_LOGIC数据类型通常在设计中通常使用std_logic类型这里我们借D触发器对这类数据类型进行一个描述,并非时序电路都要用这类数据类型第3页/共46页‘U’--Uninitialized(未初始化的)

‘X’--ForcingUnknown(强未知的)

‘0’--Forcing0(强0)

‘1’--Forcing1(强1)

‘Z’--HighImpedance(高阻态)

‘W’--WeakUnknown(弱未知的)

‘L’--Weak0(弱0)

‘H’--Weak1(弱1)

‘-’--Don‘tcare(忽略)返回第4页/共46页

库、程序包

std_logic、std_logic_vector:定义在std_logic_1164.all程序包中,而此包由IEEE定义。所以,使用到这两种数据类型时,需包含

libraryieee;useieee.std_logic_1164.all;返回第5页/共46页

SIGNAL信号名:数据类型[:=初始值];区别:

signal:描述实体内部节点,不定义输入输出方向,在结构体中作为一个数据的暂存器,进行赋值。端口:描述实体与外界的接口数据对象数据对象返回第6页/共46页

Event信号属性函数

s’Event:如果在当前一个相当小的时间间隔内,事件发生了,则函数将返回”TURE”、否则返回”FLASE”

上升沿:clock’eventandclock=‘1’;

下降沿:clock’eventandclock=‘0’;

上升沿:rising_edge(clock);

下降沿:falling_edge(clock);上升沿检测表达方式和信号属性使用函数要注意打开相关程序包第7页/共46页时钟的描述方法上升沿:CP’EVENTANDCP=‘1’下升沿:CP’EVENTANDCP=‘0’Clk=0Clk=0Clk=1Clk=1Clock’EVENTClock’EVENTClock’EVENTClock’EVENT为信号的属性函数,有事件发生为“真”,否则为“假”第8页/共46页architecturebhvofdff2isbeginprocess(clk)beginif(clk'eventandclk='1')thenq<=d;endif;endprocess;end;时序电路由于这条语句的存在?第9页/共46页不完整条件语句与时序电路

if(clk'eventandclk='1')thenq1<=d;endif;此IF语句未利用ELSE指明IF语句不满足条件时,作何操作(不完整的条件语句);引入时序元件保存q1的原值;不完整语句,综合器如何处理?第10页/共46页上升沿D触发器描述方法一:使用信号属性函数LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYD_regIS

PORT(D,CP: INSTD_LOGIC; Q: OUTSTD_LOGIC);ENDD_reg;ARCHITECTUREtestOFD_regISSIGNALQ1:STD_LOGICBEGIN

PROCESS(CP)

BEGIN

IF(CP’EVENTANDCP=‘1’)THENQ1<=D;

ENDIF;

ENDPROCESS;Q<=Q1;ENDtest;CP定义的数据类型有9种状态,不能完全代表信号由0跳变到1第11页/共46页方法二:使用WAIT语句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYD_regIS

PORT(D,CP: INSTD_LOGIC; Q: OUTSTD_LOGIC);ENDD_reg;ARCHITECTUREtestOFD_regISBEGIN

PROCESS

BEGIN

WAITUNTILCP=‘1’; Q<=D;

ENDPROCESS;ENDtest;上升沿D触发器描述使用waituntil语句后就不用列出敏感信号等效对时钟信号CP的一个跳变判断第12页/共46页方法三:使用上升沿检测函数LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYD_regIS PORT(D,CP: INSTD_LOGIC; Q: OUTSTD_LOGIC);ENDD_reg;ARCHITECTUREtestOFD_regISBEGIN

PROCESS(cp)

BEGIN

IF(rising_edge(cp))THEN Q<=D; ENDIF;

ENDPROCESS;ENDtest;上升沿D触发器描述使用函数要注意打开相关程序包第13页/共46页方法四:使用进程的启动特性LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYD_regIS

PORT(D,CP: INSTD_LOGIC; Q: OUTSTD_LOGIC);ENDD_reg;ARCHITECTUREtestOFD_regISBEGIN PROCESS(CP)

BEGIN

IFCP=‘1’THEN Q<=D; ENDIF;

ENDPROCESS;ENDtest;上升沿D触发器描述使用进程对敏感信号的检测,来实现对时钟信号的边沿检测第14页/共46页由波形可见,Q的变化发生在clk的上升沿时刻D的取值。clk=0时,Q值不变。上升沿D触发器描述第15页/共46页髙电平D触发器描述方法:使用进程的启动特性LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYD_regIS PORT(D,CP:INSTD_LOGIC; Q: OUTSTD_LOGIC);ENDD_reg;ARCHITECTUREtestOFD_regISBEGIN PROCESS(CP,D)

BEGIN

IFCP=‘1’THEN Q<=D; ENDIF; ENDPROCESS;ENDtest;注意进程的敏感信号第16页/共46页由图可见,当CLK=1时,Q随D变化而变化。clk=0时,Q保持不变。髙电平D触发器描述第17页/共46页uvw全加器设计含有层次结构的VHDL程序例化语句的学习case语句的认识第18页/共46页--以下是半加器的描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--以下是半加器的实体描述ENTITYH_adderISPORT(in_a,in_b:INSTD_LOGIC;

out_s,out_co:OUTSTD_LOGIC);END;--以下是半加器结构体描述ARCHITECTURE

one

OFH_adderISBEGIN out_s<=in_aXORin_b; out_co<=in_aANDin_b;END

one;第19页/共46页……architecture

one

of

h_adderissignal

P:

std_logic_vector(1downto0);begin

P<=a&b;process

(P)

begin

case

P

is

when"00"=>so<='0';co<='0';

when"01"=>so<='1';co<='0';

when"10"=>so<='1';co<='0';

when"11"=>so<='0';co<='1';

whenothers=>null;endcase;endprocess;

end;--以下是半加器的结构体描述CASE语句当a和b分别为‘0’和‘0’时,即P为‘00’不是操作符,含义相当于then/“于是”满足条件后执行语句判断P的值相当于写出真值表第20页/共46页--以下是或门描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--以下是或门实体描述ENTITYOr_2ISPORT

(x,y:INSTD_LOGIC;z:OUTSTD_LOGIC);END

Or_2;--以下是或门结构体描述ARCHITECTURE

one

OFOr_2ISBEGIN

Z<='1'WHEN(x='0'ANDy='1')ELSE

'1'WHEN(x='1'ANDy='0')ELSE

'1'WHEN(x='1'ANDy='1')ELSE

'0';ENDbehavioral;第21页/共46页.....--以下是或门另一种结构体描述architectureoneofor_2isbeginc<=aorb;end;第22页/共46页--以下是一位全加器结构描述的顶层设计ENTITYfull_adderISPORT(a,b,ci:INSTD_LOGIC;

s,co:OUTSTD_LOGIC);ENDfull_adder;ARCHITECTUREoneOFfull_adderISCOMPONENT

H_adder

-----半加器部件声明PORT(in_a,in_b:INSTD_LOGIC;

out_s,out_co:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENT

OR_2

----二输入或门部件声明PORT(x,y:INSTD_LOGIC;

z:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALu,v,w:STD_LOGIC;------定义内部三条连线BEGINU1:H_adderPORTMAP(in_a=>a,in_b=>b,

out_s=>v,out_co=>u);

--端口映射U2:H_adderPORTMAP(in_a=>v,in_b=>ci,

out_s=>s,out_co=>w);U3:Or_2PORTMAP(x=>u,y=>w,z=>co);END;

第23页/共46页元件例化语句

元件例化语句:即将从前设计的实体当作本设计的一个元件,然后用VHDL语句将各元件之间的连接关系描述出来;VHDL设计实体、来自FPGA元件库中的元件、Verilog设计的实体、IP核、FPGA中的嵌入式硬IP核等;第24页/共46页COMPONENT元件名IS【GENERIC(类属表);】PORT(端口名表);

ENDCOMPONENT元件名;

例化名:元件名PORTMAP([元件端口名=>]连接端口名,…);元件定义语句:将一个现成的设计实体定义为本设计的一个元件;与实体的port()一样。元件例化语句:描述元件与当前设计实体的连接关系第25页/共46页[元件端口名=>]连接端口名其中,元件端口名是元件定义语句中的端口名表中已定义好的;连接端口名是当前系统与准备接入的元件对应端口相连的通信端口;端口名和当前系统的连接端口名的接口表达名字关联:端口名和关联符号”=>”必须存在位置关联:只需列出连接端口U1:H_adderPORTMAP(in_a=>a,in_b=>b,

out_s=>v,out_co=>u);

--端口映射第26页/共46页architectureabcofshifteriscomponentdffport(d,clk:inbit;q:outbit);endcomponent;signald:bit_vector(0to4);begind(0)<=din;u0:dffportmap(d=>d(2),clk=>clk,q=>d(3));u1:dffportmap(d=>d(3),clk=>clk,q=>d(4));dout<=d(4);endabc;元件例化(映射)语句的位置:在结构体的BEGIN和END之间;元件定义语句的位置:结构体声明部分名字关联方式返回第27页/共46页CASE语句根据满足的条件直接选择多项顺序语句中的一项执行;

CASE表达式ISWHEN值1=>语句A;

WHEN值2=>语句B;

…WHENOTHERS

=>

语句C;ENDCASE;这里的=>不是关系运算符,仅描述:值和对应执行语句的对应关系,相当于THEN的作用返回判断前面的情况都不存在时,作为最后一种条件取值第28页/共46页std_logic标准位类型std_logic_vector标准一维数组使用std_logic_vector表示多通道端口或者总线。使用std_logic_vector时要注明其数组宽度:如:B:out

std_logic_vector(7downto0);downto表示最左边为最高位,位数向右依次递减。如:A:outstd_logic_vector(1to4);to表示最左边为最低位,位数向右递增。前例中定义内部信号P为两个元素的std_logic_vector第29页/共46页&-------并置操作符:将操作数或数组合并起来形成新的数组;返回P<=a&b;表示P为a和b组成的数组当a,b分别为’0,0‘;P为’00‘’0,1‘;P为’01‘’1,0‘;p为'10'’1,1‘;p为'11'第30页/共46页一种计数器的设计entitycnt4isport(clk:inbit;Q:buffer

integer

range15downto0);end;architecturebhvofcnt4isbeginprocess(clk)beginifclk’eventandclk=‘1’thenQ<=Q+1;endif;endprocess;endbhv;第31页/共46页数据对象:Buffer在“<=”的左右两边都出现Q,表明Q应具有输入和输出两种端口模式,同时它的输入特性应是反馈方式,即传输符号“<=”的右边Q应该来自左边的Q的反馈。BUFFER与INTOUT的区别在于buffer的输入来自反馈,所以这里将Q定义为buffer类型最为合适。返回第32页/共46页数据类型:integer对应“+、-”的操作数必须定义为整数类型(integer)。表达式:Q<=Q+1;式中“Q”和“1”都是整数,满足“<=”左右两边都是整数(类型相同),“+”左右两边都是整数的条件。VHDL综合器要求必须使用“RANGE”句子为所定义的数限定范围,再根据所定义的范围来决定表示此信号或变量的二进制数的位数。Q:bufferintegerranger15downto0;定义了Q的取值范围是0~15;可以用四位二进制数表示。第33页/共46页整数的表达式不加引号,如:1,0,25;而逻辑位的数据要加引号,如:’1’,’0’,”0”,”1111”。自然数:natural:0~正整数;正整数:positive:比自然数少个0;返回第34页/共46页另一种计数器表达方式libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycnt4isport(clk:instd_logic;

Q:outstd_logic_vector(3downto0));end;architecturebhvofcnt4issignalQ1:std_logic_vertor(3downto0);beginprocess(clk)beginifclk’eventandclk=‘1’thenQ1<=Q1+1;endif;endprocess;Q<=Q1;endbhv;第35页/共46页ieee.std_logic_unsigned.all表达式:Q1<=Q1+1;加号左右两个数据类型不相同,Q1(逻辑矢量)1(整数);ieee库中std_logic_unsigned程序包中预先定义的操作符允许不同数据类型的操作数之间用运算符进行运算。返回第36页/共46页Q端口模式是“out”,由于Q没有输入的端口模式,因此Q不能如前例那样直接用表达式:Q<=Q+1;在计数器内部定义一个信号signal,无需定义方向,所以Q1的方向是不受方向限制的,可以用Q1<=Q1+1;完成累加任务;第37页/共46页一般计数器的设计方法异步复位同步时钟使能变量赋值省略赋值操作符第38页/共46页architecturebehofcnt10isbeginprocess(clk,rst,en)variableCQI:std_logic_vector(3downto0);beginifrst=‘1’thenCQI:=(OTHERS=>’0’);

elseifclk’eventandclk=‘1’thenifen=‘1’thenifCQI<9thenCQI:=CQI+1;elseCQI:=(OTHERS=>’0’);endif;endif;ensif;ifCQI=9thencout<=‘1’;els

温馨提示

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

评论

0/150

提交评论