硬件描述语言VHDL及其应用讲解材料_第1页
硬件描述语言VHDL及其应用讲解材料_第2页
硬件描述语言VHDL及其应用讲解材料_第3页
硬件描述语言VHDL及其应用讲解材料_第4页
硬件描述语言VHDL及其应用讲解材料_第5页
已阅读5页,还剩175页未读 继续免费阅读

下载本文档

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

文档简介

硬件描述语言VHDL及其应用哈工大微电子中心王进祥电话:6415979-8069/27/20241一、目的了解目前电子设计系统方法及流程了解/掌握综合与验证工具能用VHDL设计复杂功能电路二、内容高层次设计概述如何写优化的VHDL代码examplesSoC设计方法学设计工具使用三、如何学习本课程带着实际课题学习,多提问题,一起分析、讨论9/27/20242一、高层次设计概述EDA工具发展设计方法深亚微米设计问题测试综合(可测性设计)Top-down设计流程硬件描述语言综合VHDL设计小结9/27/20243年代名称硬件特征70’sCAD16位小型机图型编辑,设计规则检查80’sCAE32位工作站LVS工具90’sEDA32位工作站逻辑/行为综合工具NowSoC?32位工作站物理综合工具,IP复用技术1.1EDA工具发展9/27/20244自顶向下设计方法(Top-down):系统行为设计结构设计逻辑设计电路设计版图设计1.2设计方法自底向上设计方法(Bottom-up):系统功能划分单元设计功能模块设计子系统设计系统总成基于平台设计方法(Platform-based):SoC设计普遍采用的方法,SoC平台和IP—IntellectualProperty其它设计:嵌入式设计方法,层次式设计方法等9/27/202461.3深亚微米设计问题连线延时时序模型器件模型信号完整性电磁干扰功耗设计工具综合优化工具布图规划工具SDFPDEFSDF—标准数据格式PDEF—物理设计交换格式9/27/202471.4测试综合目的:集成电路的测试简单化嵌入可测试结构,加速可测性设计产品制造前就可评价设计的可测性消除冗余逻辑诊断不可测的逻辑结构内容:测试嵌入、设计规则检查、测试码生成、故障模拟/诊断和输出测试图样测试综合包括了使测试成功的每一步骤:如加入带测试因素的电路,对逻辑综合增加约束条件以满足测试要求及对高级语言描述的可测结构的综合等都可归结为测试综合9/27/202481.4测试综合(Cont.)方法:FullScanPartialScanBISTBoundaryScan标准/规范:IEEE1149IEEEP1500VSIARelatedSpec.SoC可测试设计:IP可测试设计GlueLogic可测试设计测试存取结构分类:1—Pass2—Pass9/27/202491.5Top-down设计流程TIMINGLVS/DRCEXTRACTIONRouteSignoff--Gates&PlacementSynthesis&PlaceDesignPlanningCOTSIGNOFFPLANNINGSYNTHESISFLOORPLAN,P&REXTRACTIONLVS/DRCTIMINGLTL9/27/2024101.6硬件描述语言VHDL&VerilogVHDLObjectEntity—I/O界面描述Architecture—功能定义Process—行为模块Library—VHDLObject的集合Package—数据类型、子程序、子单元的集合Configuration—Architecture/Parameter选择9/27/2024111.6硬件描述语言(Cont.)VHDL中的端口:InOutInoutBufferBlk1Blk3Blk4Blk5Blk2InInoutOutBufferEntity9/27/2024121.7综合Definition:Synthesis=Translation+Optimization

HDLcode

gtechlogicnetlistmin(SpeedXAreaXPower)Optimization&technologyMapping

BehavioralSynthesis:SchedulingandAllocationAlgorithm9/27/2024131.8VHDL设计小结一个完整的设计由一些子单元相互连接而成每个子单元有一个Entity和至少一个Architecture单元间数据传递是通过在Entity中描述中所声明的端口进行,通信端口的信号类型、端口宽度以及端口方向要匹配一个Architecture可包括Behavioral、Dataflow和Structure风格语句子单元(Component)在使用之前要声明9/27/2024141.8VHDL设计小结(Cont.)RS(255,223)码译码器Top框图9/27/2024151.8VHDL设计小结(Cont.)RS(255,223)码译码器详细模块图9/27/2024161.8VHDL设计小结(Cont.)entityrsdecoderis

port(reset,clk:instd_logic;decin:inbit8;decout:outbit8);endrsdecoder;architecturestructuralofrsdecoderis

componentsyndrome

port(reset,clk:instd_logic;rec:inbit8;synfb:inbit8;syndout:outbit8);

end

component;1componentbmexpand

port(reset,clk:instd_logic;synin:inbit8;cnt:inrsInt;synout:outbit8;lstsfe:outbit8;bout:outbit8);endcomponent;componentbmfftbuf

port(reset,clk:instd_logic;ctl255:instd_logic;syno,addo:inbit8;bmfo:outrsbit8_vector(0toN2-1));endcomponent;

29/27/2024171.8VHDL设计小结(Cont.)componentifftport(reset,clk:instd_logic;ctlN1m1,ctlN1:instd_logic;ctl254:instd_logic;buffin:inrsbit8_vector(0toN2-1);iffto:outbit8);endcomponent;componentfftobufport(reset,clk:instd_logic;ctlobf:instd_logic;din:inbit8;fbo:outbit8);end

component;3componentdecbuf

port(reset,clk:instd_logic;din:inbit8;dout:outbit8);endcomponent;

componentcontrol

port(reset,clk:instd_logic;ctlN1m1,ctlN1:outstd_logic;ctl254,ctl255:outstd_logic;ctlobf:outstd_logic;synfb:outstd_logic;cntout:bufferrsInt);endcomponent;

49/27/2024181.8VHDL设计小结(Cont.)componentxor8port(in1,in2:inbit8;xout:outbit8);endcomponent;signalctlN1m1,ctlN1,ctl254,ctl255:std_logic;signalctlobf,synfb:std_logic;signalfbo,dout,synout,lstsfe,bout:bit8;signalcntout:rsInt;signaliffto,syndout:bit8;signalbmfo:rsbit8_vector(0toN2-1);59/27/2024191.8VHDL设计小结(Cont.)beginu1:controlportmap(reset,clk,ctlN1m1,ctlN1,ctl254,ctl255,ctlobf,synfb,cntout);u2:syndromeportmap(reset,clk,decin,synfb,syndout);u3:bmexpandportmap(reset,clk,syndout,cntout,synout,lstsfe,bout);u4:bmfftbufportmap(reset,clk,ctl255,synout,lstsfe,bmfo);u5:ifftportmap(reset,clk,ctlN1m1,ctlN1,ctl254,bmfo,iffto);u6:fftobufportmap(reset,clk,ctlobf,iffto,fbo);u7:decbufportmap(reset,clk,decin,dout);u8:xor8portmap(fbo,dout,decout);endstructural;69/27/202420二、如何写优化的VHDL代码数据类型并发/顺序赋值语句小结Process语句资源共享其它9/27/2024212.1数据类型TypesScalarFileAccessCompositeArrayRecordEnumeratedRealIntegerPhysical9/27/2024222.1数据类型(Cont.)标准数据类型:

bit,bit_vector,std_ulogic,std_logic,

std_logic_vector,boolean,integer,etc.复合数据类型:

array, record,sub_type,newtype9/27/2024232.1.1赋值语句i/ signalt,s:bit;s<=‘1’;--s<=t;ii/signalc:bit_vector(0to3);signald:bit_vector(3downto0);c<=“1011”;d<=c;--ok?c(0to3)<=d(0to3)–ok?d<=c;--ok!c(0to3)<=d(0to3)–No!c(0)c(1)c(2)c(3)d(3)d(2)d(1)d(0)9/27/202424iii/signals,t,w,m:bit;signalc:bit_vector(0to3);c<=“1011”;c<=s&t&w&m;c<=(‘1’,‘0’,‘1’,‘1’);c<=3;

c<=(0->‘1’,1->s,2->‘1’,3->‘1’);Ok?c<=3;--No

c<=(0->‘1’,1->s,2->‘1’,3->‘1’);--Ok2.1.1赋值语句(Cont.)9/27/202425iv/signala_vec:bit_vector(0to11);a_vec<=B”1100_0011_0011_1100”;a_vec<=“1100001100111100”;a_vec<=X”C33C”;a_vec<=X”C3_3C”;a_vec<=“1100_0011_0011_1100”;

a_vec<=“C33C”;Ok?a_vec<=“1100_0011_0011_1100”;

a_vec<=“C33C”;No!2.1.1赋值语句(Cont.)9/27/202426二进制—B(Binary)八进制—O(Octal)十六进制—X(Hexadecimal)位串中的进制表示:十进制—D(Decimal)???十进制—D(Decimal)No!2.1.1赋值语句(Cont.)9/27/202427v/signalA,B,C:bit_vector(3downto0);C<=AandB;C<=notA

Ok?‘0’‘1’‘1’‘0’‘1’‘1’‘0’‘1’‘0’‘1’‘0’‘0’A=B=C=C(3)<=A(3)andB(3);C(2)<=A(2)andB(2);C(1)<=A(1)andB(1);C(0)<=A(0)andB(0);S2.1.1赋值语句(Cont.)C<=notA

OK!‘0’‘1’‘1’‘0’‘1’‘0’‘0’‘1’A=C=9/27/202428vi/sliceofarrayentityVHDLis

port(A:inbit_vector(0to7);outp:outbit);endVHDL;architectureE1ofVHDLisbeginoutp<=A(5);end;signalC:bit_vector(0to7);C(4)<=‘1’;C(0to3)<=“1001”;2.1.1赋值语句(Cont.)9/27/202429vii/Compositedatatype

typedateisrecord

year:

integerrange1980to2030;

month:

integerrange1to12;

day:

integerrange1to30;endrecord;subtypebit8isbit_vector(7downto0);2.1.1赋值语句(Cont.)9/27/202430vii/Compositedatatypesignalweekday,today:date;weekday.year<=2003;weekday.monty<=2;weekday.day<=14;

today<=weekday;2.1.1赋值语句(Cont.)9/27/2024312.1.2数据类型转换强类型语言:VHDL具有丰富的数据类型,不同类型的对象(信号、变量)不能直接赋值经常转换的数据类型:std_logic,bit,std_ulogic,boolean,signedunsigned,std_logic_vector,bit_vector数据类型转换三种方法:类型标记转换法、函数转换法和常数转换法9/27/202432类型标记转换法 std_logicandstd_ulogic, std_logic_vectorandsigned std_logic_vectorandunsigned integerandreal等signalastd_logic_vector(0to7);signalbunsigned(0to7);b<=unsigned(a);2.1.2数据类型转换(Cont.)9/27/202433函数转换法 std_logicandbit std_ulogicandbit,booleanandbit, std_logic_vectorandbit_vector integerandstd_logic_vector/unsigned等signalastd_logic_vector(0to7);signalbintegerrange0to255;a<=to_stdlogicvector(X”AF”);b<=conv_ingeter(a);2.1.2数据类型转换(Cont.)9/27/202434typetypeconv_typeisarray(std_ulogic’lowtostd_ulogic’high)ofbit;constanttypeconv:typeconv_type:=(‘0’|‘L’=>‘0’,‘1’|‘H’=>‘1’,others=>‘0’);signals:std_ulogic;signala:bit;a<=typeconv(s);常数转换法2.1.2数据类型转换(Cont.)9/27/202435Howtotransformbittypetobooleantype?signalbitty:bit;signalbooly:boolean;booly<=(bitty=‘1’);Discussion2.1.2数据类型转换(Cont.)9/27/2024362.1.3逻辑运算与关系运算运算符:and,or,not,xor,nand,nor=,/=,<,<=,>,>=Discussion:Whatistheresultofthefollowingrelationalstatement?“1000”>“1111”=?“1000”>“1111”=false9/27/2024372.1.4算术操作运算符:+,–,*,mod,/,rem操作数类型:

std_logic_vector,integer,signed,unsigned右操作数必须为2的指数!!useieee.std_logic_unsigned.all;9/27/2024382.1.4算术操作(Cont.) signala,b:std_logic_vector(3downto0); q1<=unsigned(a)+unsigned(b); q2<=unsigned(a)+signed(b); q3<=signed(a)+signed(b); q4<=a+b; q5<=(‘0’&a)+b;--4bit--5bit--4bit--4bit--5bit9/27/2024392.1.5连字符和聚集连字符:concatenationoperator聚集: aggregates signalA,B:std_logic_vector(3downto0); signalC:std_logic_vector(7downto0); signalD:std_logic; C<=A&B;C(7)C(6)C(5)C(4)C(3)C(2)C(1)C(0)AB9/27/202440 C(7)<=‘Z’; C(6downto3)<=A; C(2downto0)<=‘0’&A(1downto0); C<=(7=>‘1’,6=>D,5downto2=>‘1’, others=>‘0’);

C<=“00000000”;-----初始化C<=(others=>‘0’);2.1.5连字符和聚集(Cont.)9/27/2024412.2并发/顺序赋值语句并发赋值语句在architecture的begin和end之间,与书写顺序无关,每一条并发语句均可用一个process语句等价顺序赋值语句只能在process和子程序的begin和end之间,它除信号赋值语句外,还有变量赋值9/27/2024422.2.1并发赋值语句D<=A+E;A<=B+C;++BCEAD9/27/2024432.2.1并发赋值语句(Cont.)A<=B+A;并发赋值语句:+ABAC<=A;C<=B;ABC组合逻辑环路!!Multi-driver,needresolvedfunction9/27/2024442.2.2顺序赋值语句D<=A+E;A<=B+C;++BCEAD9/27/2024452.2.2顺序赋值语句(Cont.)C<=A;C<=B;BCA<=B+A;组合进程:No!时序进程:Ok!+ABA9/27/2024462.3小结一个设计由entity和architecture描述数据对象类型有bit,boolean,integer,std_logic等标准类型和用户自定义类型并发语句执行与书写顺序无关(orderindependent)VHDL是一种强类型语言(类型不能自动相互转换)元件例化语句不能在process中,if语句和for语句用于并发语句时,只能是generate语句,并发语句无变量赋值语句9/27/2024472.3小结(Cont.)entityshiftisport(reset,clk:instd_logic;din:instd_logic;dout:outstd_logic);endshift;architecturestrofshiftiscomponentdffport(reset,clk:instd_logic;d:instd_logic;q:outstd_logic);endcomponent;

signaltv:std_logic_vector(0to7);beginforIin0to7generateifI=0generateu1:dffportmap(reset,clk,din,tv(0));endgenerate;ifI>0andI<=7generateu2:dffportmap(reset,clk,tv(I–1),tv(I));endgenerate;endgenerate;dout<=tv(7);endstr;9/27/2024482.4process描述电路功能或行为。由于综合后的电路对所有输入信号变化敏感,因此所有被读信号均应包含在敏感表中,否则,综合前的模拟结果与综合后的模拟结果不一致!9/27/2024492.4.1syntax[process_label:]process(sensitivitylist)

[declarations;]beginstatements;--if,loop,case,subprogramcalletcendprocess[process_label];9/27/2024502.4.1syntaxP1:process(A,B)BeginD<=AorBandC;EndprocessP1;P1:process(A,B,C)BeginD<=AorBandC;EndprocessP1;9/27/2024512.4.2

communicationamongprocessAssignmentIf,case,loopetcSignal_NSignal_3Signal_1Signal_2ProcessAProcessBarchitectureexample9/27/2024522.4.3ifthenelse语句综合i/.引入寄存器entitydffisport(d:instd_logic;clk:instd_logic;q:outstd_logic);Enddff;architecturertlofdffisbegininfer_reg:process(d,clk)beginif(clk’eventandclk=‘1’)thenq<=d;endprocessinfer;endrtl;9/27/2024532.4.3ifthenelse语句综合(Cont.)ii/.引入锁存器Infer_latch:process(A,B)beginif(A=‘1’)thenx<=B;endprocessinfer_infer_latch;Infer_latch:process(A,B)Beginx<=‘0’;if(A=‘1’)thenx<=B;endprocessinfer_infer_latch;隐含了A=‘0’时x<=x;不完全的else9/27/2024542.4.3ifthenelse语句综合(Cont.)iii/.组合电路entitycombisport(a,b:inbit;select:inbit;y:outbit);endcomb;architecturearchofcombisbeginprocess(a,b,select)beginif(select=‘1’)theny<=b;elsey<=a;endif;endprocess;endarch;bayselect109/27/2024552.4.3ifthenelse语句综合(Cont.)iv/.异步复位process(reset,clk,d)Beginif(reset=‘0’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;endprocess;dclkresetq9/27/2024562.4.3ifthenelse语句综合(Cont.)v/.三态逻辑signals,sel,data:std_logic;process(sel,data)Beginif(sel=‘1’)thens<=data;elses<=‘Z’;endif;endprocess;19/27/2024572.4.3ifthenelse语句综合(Cont.)v/.三态逻辑architecturebehoftribufissignalasel,bsel,a,b,s:std_logic;beginpa:process(asel,a)begins<=‘Z’;if(asel=‘1’)thens<=a;endif;endprocesspa;2pb:process(bsel,b)begins<=‘Z’;if(bsel=‘1’)thens<=b;endif;endprocesspb;endbeh;Multidriver!!9/27/2024582.4.3ifthenelse语句综合(Cont.)Discussionsignala,b,use_b:bit;process(a,b,use_b)Beginif(use_b=‘1’)thens<=b;elseif(use_b=‘0’)thens<=a;endif;endprocess;1Latch?9/27/2024592.4.3ifthenelse语句综合(Cont.)Discussionsignala,b,use_b:std_logic;process(a,b,use_b)Beginif(use_b=‘1’)thens<=b;elseif(use_b=‘0’)thens<=a;endif;endprocess;2Latch?9/27/2024602.4.3ifthenelse语句综合(Cont.)Discussionelseassertfalsereport“invaliduse_b”severityerror;endif;endprocess;3what?signala,b,use_b:std_logic;process(a,b,use_b)Beginif(use_b=‘1’)thens<=b;elseif(use_b=‘0’)thens<=a;9/27/2024612.4.3ifthenelse语句综合(Cont.)vi/.在一个进程中,一个信号只能对应一个三态驱动

process(b,ub,a,ua)Begindout<=‘Z’;if(ub=‘1’)thendout<=b;endif;if(ua=‘1’)thendout<=a;endif;endprocess;9/27/2024622.4.3ifthenelse语句综合(Cont.)vii/.‘Z’值使用规则如:dout<=‘Z’anddin;如:if(sel=‘Z’)then相当于

iffalsethen

某个信号被赋值‘Z’值时,将会引入三态驱动,但‘Z’值不能用于复杂的表达式中(逻辑/算术表达式)1当信号与‘Z’值比较时,结果总为false,引用这样的关系表达式将导致模拟与综合结果不匹配29/27/2024632.4.3ifthenelse语句综合(Cont.)vii/.ifthenelse语句小结可以描述顺序行为1可以生成三态逻辑4生成组合逻辑2如果缺少else语句,可能生成latch3可以引入时序元件5一般用于process和subprogram中69/27/2024642.4.4case语句i/.syntaxcase(expression)iswhenvalue=>statements;whenvalue|value=>statements;whenvalue1tovalue2=>statements;……whenothers=>statements;endcase;9/27/2024652.4.4case语句(Cont.)ii/.case语句规则任意value互不相同

如无others分枝,必须穷尽所有可能的表达式值如有others分枝,必须至少有一个表达值未列出

任意分枝中的语句可以有多条9/27/2024662.4.4case语句(Cont.)entitydecoderisport(din:instd_logic_vector(0to2);q:outstd_logic_vector(0to7));enddecoder;architectureexofdecoderisbeginprocess(din)begincase(din)when“000”=>q<=“00000001”;when“001”=>q<=“00000010”;when“010”=>q<=“00000100”;when“011”=>q<=“00001000”;when“100”=>q<=“00010000”;when“101”=>q<=“00100000”;when“110”=>q<=“01000000”;when“111”=>q<=“10000000”;whenothers=>q<=“--------”;endcase;endprocess;endex;9/27/2024672.4.5forloop语句i/.语法loop_label:forloop_varinrangeloopsequentialstatements;endlooploop_label;说明:loop_label可选,loop_var不需声明,综合时,循环语句将unrolledWhyloopstatement?9/27/2024682.4.5forloop语句(Cont.)entityparsumisport(word:instd_logic_vector(0to7);par:outstd_logic);endparsum;architectureaddxorofparsumisbeginprocess(word)variablets:std_logic;begints:=‘0’;

forIinword’rangeloopts:=tsxorword(I);endloop;par<=ts;endprocess;endaddxor;Discussion:如果ts为信号,结果是什么?9/27/2024692.4.6数据对象constantvariablesignali/.constantandvariableconstantconst_name:type:=value;variablevar_name:type;格式constantmask:std_logic_vector(0to7):=“00000000”;constantled_zero:bit_vector(0to7):=X”7E”;variabletsum:std_logic_vector(3downto0);9/27/2024702.4.6数据对象(Cont.)ii/.signalandvariable相同点:值可变,可综合为逻辑或线不同点:变量赋值有立即性,且只用于process和subprogram中(VHDL-1076-87),而信号除此之外,还可用于并行语句中应用:简单计算signal复杂计算variable中间结果variable9/27/2024712.4.6数据对象(Cont.)signala,b,c,x,y:shortprocess(a,b,c)beginc<=a;x<=c+2;c<=b;y<=c+4;endprocess;signala,b,

x,y:shortprocess(a,b,c)variablec:short;beginc:=a;x<=c+2;c:=b;y<=c+4;endprocess;9/27/202472++2b4xy++2b4xya2.4.6数据对象(Cont.)signalvariable9/27/2024732.4.6数据对象(Cont.)entitysigvarisport(a,b,c,d:std_logic;q:outstd_logic;endsigvar;architecturesigofsigvarissignalint:std_logic;Beginprocess(a,b,c,d,int)beginint<=aandbandc;q<=intord;endprocess;endsig;entitysigvarisport(a,b,c,d:std_logic;q:outstd_logic;endsigvar;architecturesigofsigvarisBeginprocess(a,b,c,d)variablelint:std_logic;beginint:=aandbandc;q<=intord;endprocess;endsig;9/27/2024742.4.7wait语句waituntil,wait,waiton,waitfor

wait语句表明了信号激活process的条件在process中,如有wait语句,敏感表必须取消在process中,如既无wait语句,也无敏感表,则不能正确模拟

综合工具仅支持waituntil语句(引入寄存器)!!!9/27/2024752.4.7wait语句(Cont.)libraryieee;Useieee.std_logic_1164.all;entitycount4isport(updown:instd_logic;clk:instd_logic;dout:outintegerrange0to15);endcount4;architecturebehaveofcount4issignalcnt:integerrange0to15;beginprocessbeginwaituntilclk’eventandclk=‘1’;if(updown=‘1’)thenif(cnt=15)thencnt<=0;elsecnt<=cnt+1;endif;elseif(cnt=0)thencnt<=15;elsecnt<=cnt–1;endif;endif;endprocess;endbehave;9/27/2024762.5资源共享硬件资源:关系运算:=,/=,<,<=,>,>=算术运算:+,—,*,/每个运算符均要消耗大量的硬件资源,并产生延时!!!如何用最小的资源实现相同的功能?9/27/2024772.5资源共享(Cont.)i/.……if(sel_a=‘1’)thenz<=a+t;endif;if(sel_a=‘0’)thenz<=b+t;endif;……19/27/2024782.5资源共享(Cont.)i/.z<=a+twhensel_a=‘1’elseb+t;或if(sel_a=‘1’)thenz<=a+t;elsez<=b+t;endif;29/27/2024792.5资源共享(Cont.)ii/.dout:=0;found:=false;forkin1to4loopif(found=false)thenif(a(k)=‘1’)thendout:=b(k)+c(k);found:=true;endif;endif;endloop;19/27/2024802.5资源共享(Cont.)ii/.t1:=0;t2:=0;found:=false;forkin1to4loopif(found=false)thenif(a(k)=‘1’)thent1:=b(k);t2:=c(k);found:=true;endif;endif;endloop;dout:=t1+t2;29/27/2024812.5资源共享(Cont.)iii/.多进程P1:processbeginwaituntilclk’eventandclk=‘1’;if(sel=“00”)thenreg_0<=dA+dB;endif;endprocessP1;1P2:processbeginwaituntilclk’eventandclk=‘1’;if(sel=“01”)thenreg_1<=dA-dB;endif;endprocessP2;9/27/2024822.5资源共享(Cont.)iii/.多进程P3:processbeginwaituntilclk’eventandclk=‘1’;if(sel=“10”)thenreg_2<=dB-dA;endif;endprocessP1;2dout<=reg_0whensel=“00”elsereg_1whensel=“01”elsereg_2whensel=“10”else0;资源:3个加法器/减法器,资源共享不能在多进程间实现!9/27/2024832.5资源共享(Cont.)iv/.if((addr(31downto20)<=“000000000110”)and(addr(31downto20)>=“000000000001”))then资源:两个12位比较器资源:两个3位比较器+一个9位比较器if((addr(31downto23)=“000000000”)and(addr(22downto20)/=“111”)and(addr(22downto20)/=“000”))then9/27/2024842.5资源共享(Cont.)v/.s(0)<=A(0)andA(1);forkin1to7loopif(k>A–1)thens(k)<=‘1’;elses(k)<=‘0’;endif;endloop;资源:1个减法器,7个比较器说明:模拟时间长,因为每进入循环均要计算一次减法;综合时间也会较长,因为综合工具要移去循环中的定值表达式19/27/2024852.5资源共享(Cont.)v/.s(0)<=A(0)andA(1);tv:=A–1;forkin1to7loopif(k>tv)thens(k)<=‘1’;elses(k)<=‘0’;endif;endloop;资源:1个减法器,7个比较器说明:模拟、综合时间短29/27/2024862.5资源共享(Cont.)v/.s(0)<=A(0)andA(1);forkin1to7loopif(k+1>A)thens(k)<=‘1’;elses(k)<=‘0’;endif;endloop;资源:0个减法器,7个比较器说明:下标运算不产生额外资源消耗,综合工具自动用2to8与A比较;模拟、综合时间短39/27/2024872.5资源共享(Cont.)vi/.sum:=0;forkin0to7loopsum:=sum+A(k);endloop;dout<=sum;1++++A(0)A(1)A(6)A(7)0dout8个加法器,8级加法器延迟9/27/2024882.5资源共享(Cont.)vi/.cnt:=8;forlin0to2loopcnt:=cnt/2;forkin0tocnt–1loopA(k):=A(k*2)+A(k*2+1);endloop;endloop;dout<=A(0);27个加法器,3级加法器延迟++++A(0)A(1)dout+++A(2)A(3)A(4)A(5)A(6)A(7)9/27/2024892.6其它i/.正确使用后到达的信号process(A_late,B,C,D)beginif(A_late+B<24)thendout<=C;elsedout<=D;endif;endprocess;19/27/2024902.6其它(Cont.)i/.正确使用后到达的信号process(A_late,B,C,D)beginif(A_late<24-B)thendout<=C;elsedout<=D;endif;endprocess;29/27/2024912.6其它(Cont.)ii/.仿真与综合结果不匹配processvariablecnt:integerrange0to255;beginwaituntilclk’eventandclk=‘1’;cnt:=cnt+1;dout<=cnt;endprocess;1变量将引入额外的寄存器!+1clkdoutOk?9/27/2024922.6其它(Cont.)ii/.仿真与综合结果不匹配signalcnt:integerrange0to255;processbeginwaituntilclk’eventandclk=‘1’;cnt<=cnt+1;endprocess;dout<=cnt;2但是,仿真时,当cnt的值为255时,再一次进入该process时,将报告越界错误!+1clkdoutOk!9/27/2024932.6其它(Cont.)ii/.仿真与综合结果不匹配signalcnt:integerrange0to255;processbeginwaituntilclk’eventandclk=‘1’;if(cnt=255)thencnt<=0;elsecnt<=cnt+1;endprocess;dout<=cnt;3+1clkdoutOk!9/27/2024942.6其它(Cont.)iii/.避免不必要的重复调用函数functionadd8(in1,in2:bit_vector(7downto0))isreturnbit_vector(7downto0);……sign_bit:=add8(A,B)(7);lower_nibble:=add8(A,B)(3downto0);……tv:=add8(A,B);sign_bit:=tv(7);lower_nibble:=tv(3downto0);9/27/2024952.6其它(Cont.)iv/.元件例化端口映射问题inst1:comp1portmap(din_1=>‘0’;din_2=>con_A;dout=>con_out);signalgnd:std_logic;……gnd<=‘0’;inst1:comp1portmap(din_1=>gnd;din_2=>con_A;dout=>con_out);当某一输入端口接固定电平时,必须引入中间信号,且中间信号不能在说明时赋初值!19/27/2024962.6其它(Cont.)iv/.元件例化端口映射问题componentdffport(reset,clk:instd_logic;d:instd_logic;q,qn:outstd_logic);enddff;当某一输出端悬空时,应连接open关键字!u1:dffportmap(reset=>reset,clk=>clk;q=>dout,qn=>open);29/27/2024972.6其它(Cont.)v/.避免阵列方向错误signaldata8:bit_vector(0to7);signaldout:bit_vector(7downto0);……dout<=data8(7downto0);forIin0to7loopdout(I)<=data8(7–I);endloop;9/27/2024982.6其它(Cont.)vi/.避免低效率语句

signal:l1,l2:bit;P1:process(l1,l2,A,B,C,D)begincase(l1&l2)iswhen“00”=>dout<=A;when“01”=>dout<=B;when“10”=>dout<=C;when“11”=>dout<=D;endcase;endprocessP1;signal:l1,l2:bit;P2:process(l1,l2,A,B,C,D)beginif(l1&l2=“00”)thendout<=A;elsif(l1&l2=“01”)thendout<=B;elsif(l1&l2=“10”)thendout<=C;elsedout<=D;endif;endprocessP2;Ok?No!19/27/2024992.6其它(Cont.)vi/.避免低效率语句

signal:l1,l2:bit;P3:process(l1,l2,A,B,C,D)subtypetwobitsisbit_vector(0to1);begincase(twobits’(l1&l2))iswhen“00”=>dout<=A;when“01”=>dout<=B;when“10”=>dout<=C;when“11”=>dout<=D;endcase;endprocessP3;29/27/20241002.6其它(Cont.)vii/.桶移位寄存器

entitybarrel_shifterisport(clk:inbit;din:inbit_vector(0to31);k:inintegerrange0to31;dout:outbit_vector(0to31));endbarrel_shifter;architecturebehaveofbarrel_shifterisbeginprocessbeginwaituntilclk’eventandclk=‘1’;dout<=din(kto31)&din(0tok);endprocess;endbehave;上述模型不可综合,k是0~31中任意的数,属于不可计算的,但上述模型可仿真!19/27/20241012.6其它(Cont.)vii/.桶移位寄存器

architecturesyn1ofbarrel_shifterisbeginprocessbeginwaituntilclk’eventandclk=‘1’;if(k=0)thendout<=din;elseforlin1to31loopif(l=k)thendout<=din(lto31)&din(0tol);endif;endloop;endif;endprocess;endsyn1;29/27/20241022.6其它(Cont.)vii/.桶移位寄存器architecturesyn2ofbarrel_shifterisbeginprocessbeginwaituntilclk’eventandclk=‘1’;case(k)iswhen0=>dout<=din;when1=>dout<=din(1to31)&din(0);

……when31=>dout<=din(31)&din(0to30);endcase;endprocess;endsyn2;39/27/2024

温馨提示

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

评论

0/150

提交评论