版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字系统设计与VHDL(第3版)数字系统设计与VHDL(第3版)第8章
VHDL设计进阶
8.1行为描述8.2数据流描述8.3结构描述8.4三态逻辑设计8.5分频器设计8.6乘法器设计8.7存储器设计8.8流水线设计8.9资源共享设计8.10用锁相环IP核实现倍频和相移8.1行为描述可将VHDL对逻辑电路的建模和描述方式分为如下3种:(1)行为(Behavioural)描述。(2)数据流(DataFlow)描述或寄存器传输级(RTL)描述。(3)结构(Structural)描述。所谓行为描述,就是只描述电路的行为和功能,不涉及电路硬件结构,行为描述是对设计实体的数学抽象,只需关注输入与输出信号的行为关系,而无须花费精力于设计结构的具体实现。【例8.2】用FORLOOP语句描述的7人表决电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYvote7ISPORT(vt:INSTD_LOGIC_VECTOR(7DOWNTO1);pass:OUTSTD_LOGIC);ENDENTITYvote7;ARCHITECTUREbehavOFvote7ISBEGINPROCESS(vt)VARIABLEsum:INTEGERRANGE0TO7;--定义赞成票变量BEGINsum:=0;FORiIN1TO7LOOP --FORLOOP语句IF(vt(i)='1')THENsum:=sum+1;IF(sum>=4)THENpass<='1';--超过半数表决通过ELSEpass<='0';ENDIF;ENDIF;ENDLOOP;ENDPROCESS;ENDbehav;8.2数据流描述数据流(DataFlow)描述侧重于描述数据流的运动路径和结果,数据流描述亦表示行为,同时也隐含结构信息,有时也将数据流描述称作寄存器传输级(RTL)描述。综合器工具软件都提供了将VHDL(或VerilogHDL)源码转换为RTL级原理图的功能,便于设计者查看电路的RTL级实现框图。用逻辑符号及逻辑方程式表达设计可看作数据流(DataFlow)描述,在有的设计中已知布尔代数表达式,就很容易将它转换为VHDL的数据流表达式,转换方法是用VHDL的逻辑运算符置换布尔逻辑运算符即可。例如,用OR置换“+”,用“<=”置换“=”,如方程式f=ab+cd转换为f<=(aANDb)OR(cANDd)。例8.8用逻辑运算符实现的1位全加器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfuadd_dfISPORT(a,b,cin:INSTD_LOGIC;sum,cout:OUTSTD_LOGIC);ENDfuadd_df;ARCHITECTUREdataflowOFfuadd_dfISBEGINsum<=aXORbXORcin;cout<=(aANDb)OR(bANDcin)OR(aANDcin);ENDdataflow;8.3结构描述结构描述,就是指在设计中,实例化已有的功能模块,通过调用库中的元件或已设计好的模块来完成设计实体功能的描述。在结构体中,描述只表示元件(COMPONENT)和元件(或模块)之间的互连,就像网表一样。当调用库中不存在的元件时,则必须首先进行元件的创建,然后将其放在工作库中,以供调用。例8.13结构描述的1位全加器顶层设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfull_addISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDENTITYfull_add;ARCHITECTUREstructOFfull_addISCOMPONENThalf_add--将半加器定义为元件PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDCOMPONENT;
例8.13结构描述的1位全加器顶层设计。
COMPONENTor2hPORT(a,b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;BEGINu1:half_addPORTMAP(a=>ain,b=>bin,co=>d,so=>e);--元件例化u2:half_addPORTMAP(a=>e,b=>cin,co=>f,so=>sum);u3:or2hPORTMAP(a=>d,b=>f,y=>cout);ENDARCHITECTUREstruct;例8.11半加器的VHDL描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYhalf_addISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYhalf_add;ARCHITECTUREoneOFhalf_addisBEGINso<=aXORb;co<=aANDb;ENDARCHITECTUREone;例8.12或门逻辑描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYor2hISPORT(a,b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYor2h;ARCHITECTUREoneOFor2hISBEGINy<=aORb;ENDARCHITECTUREone;8.4三态逻辑设计例8.16三态门。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtrigateISPORT(en,a:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDtrigate;ARCHITECTUREoneOFtrigateISBEGINy<=aWHEN(en='1')ELSE'Z';ENDone;8.4三态逻辑设计例8.171位三态双向缓冲器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYbidirISPORT(y:INOUTSTD_LOGIC;--y为双向I/O端口en,a:INSTD_LOGIC;b:OUTSTD_LOGIC);ENDbidir;ARCHITECTUREoneOFbidirISBEGINy<=aWHEN(en='1')ELSE'Z';b<=y;ENDone;8.4三态逻辑设计例8.19三态双向总线缓冲器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYttl245ISPORT(a,b:INOUTSTD_LOGIC_VECTOR(7DOWNTO0); oe,dir:INSTD_LOGIC); --使能信号和方向控制ENDttl245;ARCHITECTUREoneOFttl245ISBEGINa<=bWHEN(oe='0'ANDdir='0')ELSE(OTHERS=>'Z');b<=aWHEN(oe='0'ANDdir='1')ELSE(OTHERS=>'Z');ENDone;8.5分频器设计8.5.1占空比为50%的奇数分频8.5.2半整数分频8.5.3数控分频器例8.20占空比为50%的奇数分频电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.NUMERIC_STD.ALL;ENTITYfdivnISGENERIC(w:INTEGER:=7); --定义类属参量wPORT(clk,reset:INSTD_LOGIC;clkout:OUTSTD_LOGIC);--输出时钟END;ARCHITECTUREbehavOFfdivnISSIGNALclkout1,clkout2:STD_LOGIC;SIGNALcount1,count2:UNSIGNED(3DOWNTO0);BEGINPROCESS(clk) --计数器1BEGIN8.5.1占空比为50%的奇数分频例8.20占空比为50%的奇数分频电路。
IF(clk'eventANDclk='1')THEN--上升沿触发IF(reset='1')THENcount1<="0000";ELSEIF(count1=w-1)THENcount1<="0000";ELSEcount1<=count1+1;ENDIF;IF(count1<(w-1)/2)THENclkout1<='1';ELSEclkout1<='0';ENDIF;ENDIF;ENDIF;ENDPROCESS;例8.20占空比为50%的奇数分频电路。PROCESS(clk) --计数器2BEGINIF(clk'eventANDclk='0')THEN --下降沿触发IF(reset='1')THENcount2<="0000";ELSEIF(count2=w-1)THENcount2<="0000";ELSEcount2<=count2+1;ENDIF;IF(count2<(w-1)/2)THENclkout2<='1';ELSEclkout2<='0';ENDIF;ENDIF;ENDIF;ENDPROCESS;clkout<=clkout1ORclkout2; --相或ENDbehav;例8.21n-0.5半整数分频器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.NUMERIC_STD.ALL;ENTITYfdivn_5ISPORT(clkin,clr:INSTD_LOGIC;clkout:BUFFERSTD_LOGIC); --输出时钟END;ARCHITECTUREoneOFfdivn_5ISconstantn:UNSIGNED(3downto0):="0100"; --分频预置数nSIGNALclk2,clk1:STD_LOGIC;SIGNALcount:UNSIGNED(3DOWNTO0);BEGINclk2<=clkinXORclk1;PROCESS(clk2,clr)BEGIN8.5.2半整数分频例8.21n-0.5半整数分频器。IF(clr='1')THENcount<="0000";ELSIF(clk2'eventANDclk2='1')THENIF(count=n-1)THEN --模n计数count<="0000";clkout<='1';ELSEcount<=count+1;clkout<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(clkout)BEGINIF(clkout'eventANDclkout='1')THENclk1<=NOTclk1; --输出时钟二分频ENDIF;ENDPROCESS;ENDone;例8.22数控分频器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.NUMERIC_STD.ALL;ENTITYpdivISPORT(clk:INSTD_LOGIC;d:INUNSIGNED(7DOWNTO0);qout:OUTSTD_LOGIC);END;ARCHITECTUREoneOFpdivISSIGNALfull:STD_LOGIC;BEGINPROCESS(clk)VARIABLEcnt1:UNSIGNED(7DOWNTO0);BEGIN8.5.3数控分频器例8.22数控分频器。IFclk'EVENTANDclk='1'THENIFcnt1="11111111"THENcnt1:=d;full<='1';--使溢出标志信号full输出为高电平ELSEcnt1:=cnt1+1;full<='0';ENDIF;ENDIF;ENDPROCESS;div:PROCESS(full)VARIABLEcnt2:STD_LOGIC;BEGINIFfull'EVENTANDfull='1'THENcnt2:=NOTcnt2;IFcnt2='1'THENqout<='1';ELSEqout<='0';ENDIF;ENDIF;ENDPROCESSdiv;ENDone;数控分频器仿真波形图8.5.3数控分频器例8.23带符号8位乘法器。LIBRARYIEEE;USEIEEE.numeric_bit.all;ENTITYmult8ISGENERIC(MSB:INTEGER:=8);PORT(clk:INBIT;oper_a,oper_b:INSIGNED(MSB-1DOWNTO0);--被乘数、乘数result:OUTSIGNED(2*MSB-1DOWNTO0));--乘操作结果ENDmult8;ARCHITECTUREoneOFmult8ISSIGNALreg_a,reg_b:SIGNED(MSB-1DOWNTO0);SIGNALacc:SIGNED(2*MSB-1DOWNTO0);--乘法结果暂存ATTRIBUTEmultstyle:STRING;ATTRIBUTEmultstyleOFacc:SIGNALIS"LOGIC";8.6乘法器设计例8.23带符号8位乘法器。BEGINacc<=reg_a*reg_b;--用乘法运算符实现乘法PROCESS(clk)BEGINIFclk'EVENTANDclk='1'THENreg_a<=oper_a;reg_b<=oper_b;result<=acc;ENDIF;ENDPROCESS;ENDone;注:用ATTRIBUTE属性来指定乘法器实现的方式,其优先级要高于综合软件设置的乘法器实现方式。例8.29用常数数组实现数据存储,读出的数据用LED灯显示。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYrom_ledISPORT(clk50m:INSTD_LOGIC;data:OUTSTD_LOGIC_VECTOR(9DOWNTO0));END;ARCHITECTUREoneOFrom_ledISSIGNALclk10hz:STD_LOGIC;SIGNALaddress:INTEGERRANGE0TO19;TYPEROM_typeISARRAY(0TO19)OFSTD_LOGIC_VECTOR(9DOWNTO0);CONSTANTmyrom:ROM_type:=(0=>"0000000001",1=>"0000000011",2=>"0000000111",
8.7存储器设计例8.29用常数数组实现数据存储,读出的数据用LED灯显示。3=>"0000001111",4=>"0000011111",5=>"0000111111",6=>"0001111111",7=>"0011111111",8=>"0111111111",9=>"1111111111",10=>"0111111111",11=>"0011111111",12=>"0001111111",13=>"0000111111",14=>"0000011111",15=>"0000001111",16=>"0000000111",17=>"0000000011",
8.7存储器设计例8.29用常数数组实现数据存储,读出的数据用LED灯显示。18=>"0000000001",19=>"0000000000");COMPONENTclk_div--clk_div分频器件声明GENERIC(FREQ:INTEGER);PORT(clk:INSTD_LOGIC;--输入时钟clr:INSTD_LOGIC;clk_out:BUFFERSTD_LOGIC);--输出时钟ENDCOMPONENT;BEGINdata<=myrom(address);--从ROM中读出数据,未寄存PROCESS(clk10hz)BEGIN例8.29用常数数组实现数据存储,读出的数据用LED灯显示。IF(clk10hz'EVENTANDclk10hz='1')THENIFaddress=19THENaddress<=0;--时钟寄存ELSEaddress<=address+1;ENDIF;ENDIF;ENDPROCESS;i1:clk_div--产生10Hz信号GENERICMAP(FREQ=>10)PORTMAP(clk=>clk50m,clr=>'1',clk_out=>clk10hz);ENDone;8.7存储器设计例8.30clk_div分频子模块。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYclk_divISGENERIC(FREQ:INTEGER:=1000);--FREQ为欲得到的频率值PORT(clk:INSTD_LOGIC;clr:INSTD_LOGIC;clk_out:BUFFERSTD_LOGIC);ENDclk_div;----------------------------------------------ARCHITECTUREoneOFclk_divISCONSTANTNUM:INTEGER:=50000000/(2*FREQ);--计算得到分频比SIGNALcount:INTEGERRANGENUMDOWNTO0;BEGIN8.7存储器设计例8.30clk_div分频子模块。PROCESS(clk,clr)BEGINIF(clr='0')THENclk_out<='0';count<=0;ELSIF(clk'EVENTANDclk='1')THENIF(count=NUM-1)THENcount<=0;clk_out<=NOT(clk_out);ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;ENDone;8.7存储器设计将本例完成指定目标器件、引脚分配和锁定,并在DE10-Lite目标板上下载验证,目标器件为10M50DAF484C7G,引脚分配和锁定如下。set_location_assignmentPIN_P11-toclk50mset_location_assignmentPIN_B11-todata[9]set_location_assignmentPIN_A11-todata[8]set_location_assignmentPIN_D14-todata[7]set_location_assignmentPIN_E14-todata[6]set_location_assignmentPIN_C13-todata[5]set_location_assignmentPIN_D13-todata[4]set_location_assignmentPIN_B10-todata[3]set_location_assignmentPIN_A10-todata[2]set_location_assignmentPIN_A9-todata[1]set_location_assignmentPIN_A8-todata[0]下载配置文件.sof至FPGA目标板,观察10个LED灯的显示效果,以验证ROM数据读取是否正确。8.7存储器设计8.8流水线设计流水线设计是经常用于提高所设计系统运行速度的一种有效的方法。为了保障数据的快速传输,必须使系统运行在尽可能高的频率上,但如果某些复杂逻辑功能的完成需要较长的延时,就会使系统难以运行在高的频率上,在这种情况下,可使用流水线技术,即在长延时的逻辑功能块中插入触发器,使复杂的逻辑操作分步完成,减小每个部分的延时,从而使系统的运行频率得以提高。流水线设计的代价是增加了寄存器逻辑,增加了芯片资源的耗用。流水线操作某个复杂逻辑功能的实现需较长的延时,可将其分解为几个(如3个)步骤来实现,每一步的延时变小,在各步间加入寄存器,以暂存中间结果,这样可大大提高整个系统的最高工作频率。流水线操作的示意图非流水线方式8位全加器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder8ISPORT(ina,inb:INSTD_LOGIC_VECTOR(7DOWNTO0);cin,clk:INSTD_LOGIC;sum:OUTSTD_LOGIC_VECTOR(7DOWNTO0);cout:OUTSTD_LOGIC); --进位ENDENTITY;ARCHITECTUREoneOFadder8ISSIGNALtempa,tempb:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALtempc:STD_LOGIC;SIGNALtemp:STD_LOGIC_VECTOR(8DOWNTO0);BEGIN非流水线方式8位全加器PROCESS(clk)BEGINIFclk'EVENTANDclk='1'THENtempa<=ina;tempb<=inb;tempc<=cin;--操作数寄存ENDIF;ENDPROCESS;PROCESS(clk)BEGINIFclk'EVENTANDclk='1'THENtemp<=('0'&tempa)+tempb+tempc;sum<=temp(7DOWNTO0);cout<=temp(8);ENDIF;ENDPROCESS;ENDone;非流水线方式8位全加器非流水线方式8位加法器的RTL综合视图两级流水实现的8位加法器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder8_pipe2ISPORT(ina,inb:INSTD_LOGIC_VECTOR(7DOWNTO0);cin,clk:INSTD_LOGIC;sum:OUTSTD_LOGIC_VECTOR(7DOWNTO0);cout:OUTSTD_LOGIC);ENDENTITYadder8_pipe2;ARCHITECTUREoneOFadder8_pipe2ISSIGNALtempa,tempb:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALtempc:STD_LOGIC;SIGNALtemp1,temp2:STD_LOGIC_VECTOR(4DOWNTO0);BEGIN两级流水实现的8位加法器PROCESS(clk)BEGINIFclk'EVENTANDclk='1'THENtemp1<=('0'&ina(3DOWNTO0))+inb(3DOWNTO0)+cin;tempc<=temp1(4);tempa<=ina(7DOWNTO4);tempb<=inb(7DOWNTO4);ENDIF;ENDPROCESS;PROCESS(clk)BEGINIFclk'EVENTANDclk='1'THENtemp2<=('0'&tempa)+tempb+tempc;sum<=temp2(3DOWNTO0)&temp1(3DOWNTO0);cout<=temp2(4);ENDIF;ENDPROCESS;ENDone;设计综合到不同器件的最高工作频率用QuartusPrime对源程序进行编译后,选择菜单Tools→Advisors→TimingOptimizationAdvisor→ReportFmaxSummary,可以看到,非流水线设计允许的最大工作频率为382.7MHz,而2级流水线设计允许的最大工作频率为460.62MHz,显然,流水线设计有效地提高了系统的最高运行频率。8.9资源共享设计资源共享可用来减少系统所耗用的器件资源,尤其是将一些耗用资源较多的模块进行共享,能有效降低整个系统耗用的资源。例8.36
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 调和胆气的中医护理方法
- 产教融合型企业的“金融+财政+土地”组合政策激励效应评估-基于2024年产教融合型企业申报材料与地方政策文本的制度逻辑分析
- 血小板低的长期护理策略
- 重度子痫前期的护理个案管理
- 预防医学与护理
- 南京音乐教育试题及答案
- 海藻制醇工规程竞赛考核试卷含答案
- 飞机起落架附件装调工安全素养强化考核试卷含答案
- 化工单元操作工道德知识考核试卷含答案
- 燃气具零部件制作工安全意识强化考核试卷含答案
- 热力学与统计物理教案
- 颈部闭合性创伤患者的护理
- 违章违规行为整治与管理制度
- 23J916-1 住宅排气道(一)
- DL∕T 802.3-2023 电力电缆导管技术条件 第3部分:实壁类塑料电缆导管
- 中药热奄包疗法操作评分标准
- 2024年湖南高考化学试题及答案
- DL-T2078.2-2021调相机检修导则第2部分:保护及励磁系统
- 《说纽带》作文评讲
- 膈膨升的护理课件
- ERCP技术的临床应用-课件
评论
0/150
提交评论