欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    [毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc

    • 资源ID:2880857       资源大小:658KB        全文页数:40页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc

    课程名称 EDA 学 院 电 信 专 业 电 信 班 级 三 班 学 号 姓 名 指导老师 目录第一章、 题目.3第二章、 设计步骤.4第三章、 设计心得.40第四章、 参考文献.41第一章 题目应用VHDL引用LPM库设计32位加法器。要求在Quartus II软件,利用VHDL完成层次式电路设计,电路中的元件可以用VHDL设计也可以用库元件连线构成再封装。借助EDA工具中的综合器,适配器,时序仿真器和编程器等工具进行相应处理。输入方法不限制。适配元件不限制。要求综合出RTL电路,并进行仿真输入波形设计并分析电路输出波形。第二章 设计步骤新建工程输入设计项目并存盘:利用lpm_add_sub函数。参数设定:引脚分配:程序清单:OPTIONS NAME_SUBSTITUTION = ON;INCLUDE "addcore"INCLUDE "look_add"INCLUDE "bypassff"INCLUDE "altshift"INCLUDE "alt_stratix_add_sub"INCLUDE "alt_mercury_add_sub"PARAMETERS (LPM_WIDTH,LPM_REPRESENTATION = "SIGNED",LPM_DIRECTION = "DEFAULT",- controlled by add_sub portONE_INPUT_IS_CONSTANT = "NO",LPM_PIPELINE = 0,MAXIMIZE_SPEED = 5,REGISTERED_AT_END = 0,OPTIMIZE_FOR_SPEED = 5,USE_CS_BUFFERS = 1,CARRY_CHAIN = "IGNORE",CARRY_CHAIN_LENGTH = 32,DEVICE_FAMILY,USE_WYS = "OFF",STYLE = "NORMAL",CBXI_PARAMETER = "NOTHING");INCLUDE "aglobal90.inc"% device family definitions %FUNCTION CBXI_PARAMETER (aclr, add_sub, cin, clken, clock, dataaLPM_WIDTH-1.0, databLPM_WIDTH-1.RETURNS (cout, overflow, resultLPM_WIDTH-1.0);- a useful macroDEFINE MIN(a, b) = a < b ? a : b;- LPM_PIPELINE became the new name for LATENCY. Will keep LATENCY in the code.CONSTANT LATENCY = LPM_PIPELINE;- Determine the effective speed (vs. size) optimization factor: If The local - param is used, take it as the effective value, otherwise use the global valueCONSTANT SPEED_MAX_FACTOR = USED(MAXIMIZE_SPEED) ? MAXIMIZE_SPEED : OPTIMIZE_FOR_SPEED; - Internal and external latencyCONSTANT LAST_STAGE_INDEX = (REGISTERED_AT_END = 1) ? 1 : 0;CONSTANT INT_STAGES_NUM = LATENCY + 1 - LAST_STAGE_INDEX;CONSTANT INT_LATENCY = (LATENCY = 0) ? 1 : MIN(LPM_WIDTH, INT_STAGES_NUM);CONSTANT EXT_LATENCY = (LATENCY > LPM_WIDTH) ? (LATENCY - LPM_WIDTH) : 0;CONSTANT REG_LAST_ADDER = (LATENCY >= LPM_WIDTH) # (REGISTERED_AT_END = 1) ? 1 : 0;DEFINE OVFLOW_EXTRA_DEPTH() = (LPM_REPRESENTATION = "SIGNED" # LPM_REPRESENTATION = "UNSIGNED" & USED(add_sub) ? REG_LAST_ADDER :- Partial adders (for pipelined cases)CONSTANT RWIDTH = LPM_WIDTH MOD INT_LATENCY;- # of adders on the right sideCONSTANT LWIDTH = INT_LATENCY - RWIDTH;- # of adders on the left sideCONSTANT SUB_WIDTH1 = FLOOR(LPM_WIDTH DIV INT_LATENCY);- Width of right-side addersCONSTANT SUB_WIDTH0 = SUB_WIDTH1 + 1;- Width of left-side adders- =- Look-ahead adder section- =- Number of 8-bit adder blocks in carry-look-ahead casesCONSTANT LOOK_AHEAD_BLOCK_SIZE = 8;CONSTANT BLOCKS = CEIL(LPM_WIDTH DIV LOOK_AHEAD_BLOCK_SIZE);- Will use the look-ahead adder?CONSTANT USE_LOOK_AHEAD = -(!(LPM_WIDTH < LOOK_AHEAD_BLOCK_SIZE) #(FAMILY_FLEX() = 1) & (USE_CARRY_CHAINS() # (!USE_CARRY_CHAINS() & SPEED_MAX_FACTOR <= (!(FAMILY_FLEX() = 1) & (STYLE = "NORMAL" & SPEED_MAX_FACTOR <= 5);DEFINE CBX_FAMILY()= (FAMILY_STRATIXII() = 1 # FAMILY_CYCLONEII() = 1) ? 1 : 0);SUBDESIGN lpm_add_sub( dataaLPM_WIDTH-1.0: INPUT = GND;databLPM_WIDTH-1.0: INPUT = GND;cin: INPUT = GND;add_sub: INPUT = VCC;clock: INPUT = GND;aclr: INPUT = GND;clken: INPUT = VCC;resultLPM_WIDTH-1.0: OUTPUT;cout: OUTPUT;overflow: OUTPUT;)VARIABLEIF CBX_FAMILY() = 1 & CBXI_PARAMETER != "NOTHING" GENERATEauto_generated : CBXI_PARAMETER WITH ( CBXI_PARAMETER = "NOTHING" );ELSE GENERATE- Use wysiwyg implementation for mercury if USE_WYS option is turned onIF FAMILY_MERCURY() = 1 & USE_WYS = "ON" GENERATEmercury_adder : alt_mercury_add_sub WITH(LPM_WIDTH = LPM_WIDTH,LPM_REPRESENTATION = LPM_REPRESENTATION,LPM_DIRECTION = LPM_DIRECTION,ONE_INPUT_IS_CONSTANT = ONE_INPUT_IS_CONSTANT,LPM_PIPELINE = LPM_PIPELINE,MAXIMIZE_SPEED = MAXIMIZE_SPEED,REGISTERED_AT_END = REGISTERED_AT_END,OPTIMIZE_FOR_SPEED = OPTIMIZE_FOR_SPEED,USE_CS_BUFFERS = USE_CS_BUFFERS,CARRY_CHAIN_LENGTH = CARRY_CHAIN_LENGTH,STYLE = STYLE);ELSE GENERATE- Use wysisyg implementation for stratix if USE_WYS is ON or add_sub signal is usedIF FAMILY_STRATIX() = 1 & (USE_WYS = "ON" # USED(add_sub) & (USE_CARRY_CHAINS() GENERATEstratix_adder : alt_stratix_add_sub WITH(LPM_WIDTH = LPM_WIDTH,LPM_REPRESENTATION = LPM_REPRESENTATION,LPM_DIRECTION = LPM_DIRECTION,ONE_INPUT_IS_CONSTANT = ONE_INPUT_IS_CONSTANT,LPM_PIPELINE = LPM_PIPELINE,MAXIMIZE_SPEED = MAXIMIZE_SPEED,REGISTERED_AT_END = REGISTERED_AT_END,OPTIMIZE_FOR_SPEED = OPTIMIZE_FOR_SPEED,USE_CS_BUFFERS = USE_CS_BUFFERS,CARRY_CHAIN_LENGTH = CARRY_CHAIN_LENGTH,STYLE = STYLE);ELSE GENERATEIF INT_LATENCY > 1 GENERATE- carry-in nodecin_node : NODE;cout_node: NODE;unreg_cout_node : NODE;- datab nodesIF (FAMILY_FLEX() = 1) GENERATEIF (USE_CARRY_CHAINS() GENERATEIF USED(add_sub) & ONE_INPUT_IS_CONSTANT = "NO" GENERATEdatab_nodeLPM_WIDTH-1.0 : LCELL; ELSE GENERATEdatab_nodeLPM_WIDTH-1.0 : NODE; END GENERATE;ELSE GENERATEIF USED(add_sub) & ONE_INPUT_IS_CONSTANT = "NO" GENERATEdatab_nodeLPM_WIDTH-1.0 : SOFT; ELSE GENERATEdatab_nodeLPM_WIDTH-1.0 : NODE; END GENERATE;END GENERATE;ELSE GENERATEIF USED(add_sub) & ONE_INPUT_IS_CONSTANT = "NO" GENERATEdatab_nodeLPM_WIDTH-1.0 : SOFT; ELSE GENERATEdatab_nodeLPM_WIDTH-1.0 : SOFT; END GENERATE;END GENERATE;IF (LPM_REPRESENTATION = "UNSIGNED" & LPM_DIRECTION != "SUB") & USED(add_sub) GENERATEadd_sub_ffINT_LATENCY-2.0: bypassff WITH (WIDTH = 1);END GENERATE;- cases where pipeline structure is needed -IF !(FAMILY_FLEX() = 1) GENERATE- Non-FLEX cases- if a nonhomogenous adder, generate the longer (right side) adders IF RWIDTH > 0 GENERATE adder0RWIDTH-1.0 : addcore WITH (WIDTH = SUB_WIDTH0,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);datab0_ffINT_LATENCY-1.0RWIDTH-1.0: bypassff WITH (WIDTH = SUB_WIDTH0);END GENERATE;- generate the shorter (left side) addersadder1LWIDTH-1.0: addcore WITH (WIDTH = SUB_WIDTH1, DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);datab1_ffINT_LATENCY-1.0LWIDTH-1.0 : bypassff WITH (WIDTH = SUB_WIDTH1);- dataa pipeline registers dataa_ffINT_LATENCY-2.0: bypassff WITH (WIDTH = LPM_WIDTH);ELSE GENERATE- FLEX cases- if a nonhomogenous adder, generate the longer (right side) adders IF RWIDTH > 0 GENERATEadder0RWIDTH-1.0 : addcore WITH (WIDTH = SUB_WIDTH0 + 1,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);IF RWIDTH > 1 GENERATEadder0_0RWIDTH-1.1 : addcore WITH (WIDTH = SUB_WIDTH0 + 1,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);END GENERATE;adder1LWIDTH-1.0: addcore WITH (WIDTH = SUB_WIDTH1 + 1,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);adder1_0LWIDTH-1.0: addcore WITH (WIDTH = SUB_WIDTH1 + 1,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);datab0_ffINT_LATENCY-1.0RWIDTH-1.0: bypassff WITH (WIDTH = SUB_WIDTH0+1);ELSE GENERATEadder1LWIDTH-1.0: addcore WITH (WIDTH = SUB_WIDTH1 + 1,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);IF LWIDTH > 1 GENERATEadder1_0LWIDTH-1.1: addcore WITH (WIDTH = SUB_WIDTH1 + 1,DIRECTION = "ADD",USE_CS_BUFFERS = USE_CS_BUFFERS);END GENERATE; END GENERATE;datab1_ffINT_LATENCY-1.0LWIDTH-1.0 : bypassff WITH (WIDTH = SUB_WIDTH1+1);IF LPM_REPRESENTATION = "SIGNED" GENERATEsign_ffINT_LATENCY-2.0: bypassff WITH (WIDTH = 2);END GENERATE;END GENERATE; ELSE GENERATE- non-pipelined adder cases- Will use a look-ahead type adder for FLEX/NORMAL with SPEED_MAX_FACTOR > 5 or- MAX/FAST cases. Will use a ripple type adder for all other cases. IF USED(clock) # (USE_LOOK_AHEAD = 0) GENERATEadder : addcore WITH (WIDTH = LPM_WIDTH, DIRECTION = LPM_DIRECTION, REPRESENTATION = LPM_REPRESENTATION, USE_CS_BUFFERS = USE_CS_BUFFERS);cout_node : NODE;oflow_node : NODE;ELSE GENERATE cin_node : NODE; cout_node : NODE; oflow_node : NODE;datab_nodeLPM_WIDTH-1.0 : SOFT; adderBLOCKS-1.0 : addcore WITH (WIDTH = 8,DIRECTION = "DEFAULT",USE_CS_BUFFERS = USE_CS_BUFFERS);look_ahead_unit : look_add WITH (WIDTH = BLOCKS);END GENERATE; END GENERATE; result_nodeLPM_WIDTH-1.0 : NODE;result_ext_latency_ffs: altshift WITH (WIDTH = LPM_WIDTH, DEPTH = EXT_LATENCY);carry_ext_latency_ffs: altshift WITH (WIDTH = 1, DEPTH = EXT_LATENCY);oflow_ext_latency_ffs: altshift WITH (WIDTH = 1, DEPTH = EXT_LATENCY);END GENERATE; - stratixEND GENERATE; -mercuryEND GENERATE; - StratixIIBEGINASSERT REPORT "LPM_WIDTH = %" LPM_WIDTH SEVERITY DEBUG;ASSERT REPORT "LATENCY = %" LATENCY SEVERITY DEBUG;ASSERT REPORT "LWIDTH = %" LWIDTH SEVERITY DEBUG;ASSERT REPORT "RWIDTH = %" RWIDTH SEVERITY DEBUG;ASSERT REPORT "INT_LATENCY = %" INT_LATENCY SEVERITY DEBUG;ASSERT REPORT "EXT_LATENCY = %" EXT_LATENCY SEVERITY DEBUG;ASSERT REPORT "SUB_WIDTH1 = %" SUB_WIDTH1 SEVERITY DEBUG;ASSERT (LPM_REPRESENTATION = "SIGNED" # LPM_REPRESENTATION = "UNSIGNED")REPORT "Illegal value for LPM_REPRESENTATION parameter (""%"") - value must be ""SIGNED"LPM_REPRESENTATIONSEVERITY ERRORHELP_ID LPM_ADD_SUB_REPRESENTATION;ASSERT (LPM_WIDTH > 0)REPORT "LPM_WIDTH parameter value must be greater than 0"SEVERITY ERRORHELP_ID LPM_ADD_SUB_WIDTH;ASSERT (USED(clock) ? LATENCY > 0 : LATENCY = 0)REPORT "Value of LPM_PIPELINE parameter must be greater than 0 if clock input is used andSEVERITY ERRORHELP_ID LPM_ADD_SUB_CLOCK_WITHOUT_LATENCY;ASSERT (LATENCY <= LPM_WIDTH)REPORT "Value of LPM_PIPELINE parameter (%) should be lower - use % for best performanceSEVERITY INFOHELP_ID LPM_ADD_SUB_CLOCK_LATENCY_VALUE;ASSERT (LPM_WIDTH > 0)REPORT "Value of LPM_WIDTH parameter must be greater than 0"SEVERITY ERRORHELP_ID LPM_ADD_SUB_WIDTH2;ASSERT (LPM_REPRESENTATION = "UNSIGNED" # LPM_REPRESENTATION = "SIGNED")REPORT "Illegal value for LPM_REPRESENTATION parameter (%) - value must be UNSIGNED (theLPM_REPRESENTATIONSEVERITY ERRORHELP_ID LPM_ADD_SUB_REPRESENTATION2;ASSERT (ONE_INPUT_IS_CONSTANT = "YES" # ONE_INPUT_IS_CONSTANT = "NO")REPORT "Illegal value for ONE_INPUT_IS_CONSTANT parameter (%) - value must be YES or NO ONE_INPUT_IS_CONSTANTSEVERITY ERRORHELP_ID LPM_ADD_SUB_ICONSTANT;ASSERT (LPM_DIRECTION = "DEFAULT" # LPM_DIRECTION = "ADD" # LPM_DIRECTION = "SUB")REPORT "Illegal value for LPM_DIRECTION parameter (%) - value must be ADD, SUB, or DEFAULPM_DIRECTIONSEVERITY ERRORHELP_ID LPM_ADD_SUB_DIRECTION;ASSERT (LPM_DIRECTION = "DEFAULT" # USED(add_sub) = 0)REPORT "Value of LPM_DIRECTION parameter (%) is not consistent with the use of the add_suLPM_DIRECTIONSEVERITY ERRORHELP_ID LPM_ADD_SUB_DIRECTION_ADD_SUB;- The next assertion is not implemented because MAX+PLUS II implementation - differs from the LPM standard. Both overflow and cout are allowed - in MAX+PLUS II.-ASSERT (USED(overflow) = 0 # USED(cout) = 0)-REPORT "Can't use overflow port if cout port is used"-SEVERITY ERROR-HELP_ID LPM_ADD_SUB_OVERCOUT;ASSERT (FAMILY_IS_KNOWN() = 1)REPORT "Megafunction lpm_add_sub does not recognize the current device family (%) - ensure tDEVICE_FAMILYSEVERITY WARNINGHELP_ID LPM_ADD_SUB_FAMILY_UNKNOWN;IF CBX_FAMILY() = 1 & CBXI_PARAMETER != "NOTHING" GENERATEIF USED(aclr) GENERATEauto_generated.aclr = aclr;END GENERATE;IF USED(add_sub) GENERATEauto_generated.add_sub = add_sub;END GENERATE;IF USED(cin) GENERATEauto_generated.cin = cin;END GENERATE;IF USED(clken) GENERATEauto_generated.clken = clken;END GENERATE;IF USED(clock) GENERATEauto_generated.clock = clock;END GENERATE;IF USED(cout) GENERATEcout = auto_generated.cout;END GENERATE;IF USED(dataa) GENERATEauto_generated.dataa = dataa;END GENERATE;IF USED(datab) GENERATEauto_generated.datab = datab;END GENERATE;IF USED(overflow) GENERATEoverflow = auto_generated.overflow;END GENERATE;IF USED(result) GENERATEresult = auto_generated.result;END GENERATE;ELSE GENERATE- mercury wysiwyg adderIF FAMILY_MERCURY() = 1 & USE_WYS = "ON" GENERATEresult = mercury_adder.result;IF USED (cout) GENERATEcout = mercury_adder.cout;END GENERATE;IF U

    注意事项

    本文([毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开