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

上传人:文库蛋蛋多 文档编号:2880857 上传时间:2023-03-01 格式:DOC 页数:40 大小:658KB
返回 下载 相关 举报
[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc_第1页
第1页 / 共40页
[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc_第2页
第2页 / 共40页
[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc_第3页
第3页 / 共40页
[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc_第4页
第4页 / 共40页
[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc》由会员分享,可在线阅读,更多相关《[毕业设计精品] 应用VHDL引用LPM库设计32位加法器.doc(40页珍藏版)》请在三一办公上搜索。

1、 课程名称 EDA 学 院 电 信 专 业 电 信 班 级 三 班 学 号 姓 名 指导老师 目录第一章、 题目.3第二章、 设计步骤.4第三章、 设计心得.40第四章、 参考文献.41第一章 题目应用VHDL引用LPM库设计32位加法器。要求在Quartus II软件,利用VHDL完成层次式电路设计,电路中的元件可以用VHDL设计也可以用库元件连线构成再封装。借助EDA工具中的综合器,适配器,时序仿真器和编程器等工具进行相应处理。输入方法不限制。适配元件不限制。要求综合出RTL电路,并进行仿真输入波形设计并分析电路输出波形。第二章 设计步骤新建工程输入设计项目并存盘:利用lpm_add_su

2、b函数。参数设定:引脚分配:程序清单: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 = N

3、O,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, ad

4、d_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 LPM_WIDTH) ? (LATENCY - LPM_WIDTH) : 0;CONSTANT REG_LAST_ADDER = (LATENCY = LPM_WIDTH) # (REGISTERED_AT_END = 1) ? 1 : 0;DEFINE OVFLOW_EXTRA_DEPTH() = (LP

5、M_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 = FLOO

6、R(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_SI

7、ZE);- 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 1 GENERATE- carry-in nodecin_node : NODE;cout_node: NOD

8、E;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 =

9、 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_REPRESE

10、NTATION = 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 RWID

11、TH 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, DIRECTIO

12、N = 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 RWIDT

13、H 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

14、_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_WID

15、TH1 + 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_REPRESENT

16、ATION = 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)

17、# (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 : SOF

18、T; 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_late

19、ncy_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 DEB

20、UG;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 = SIGNE

21、D # LPM_REPRESENTATION = UNSIGNED)REPORT Illegal value for LPM_REPRESENTATION parameter (%) - value must be SIGNEDLPM_REPRESENTATIONSEVERITY ERRORHELP_ID LPM_ADD_SUB_REPRESENTATION;ASSERT (LPM_WIDTH 0)REPORT LPM_WIDTH parameter value must be greater than 0SEVERITY ERRORHELP_ID LPM_ADD_SUB_WIDTH;ASSE

22、RT (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 0)REPORT Value of LPM_WIDTH parameter must be greater than 0SEVERITY ERRORHELP_ID LPM_ADD_SUB_WIDT

23、H2;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 Il

24、legal 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

25、 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 impl

26、emented 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 Cant use overflow port if cout port is used-SEVERITY ERROR-HELP_ID LPM_ADD_SUB_OVERCOUT;ASSERT (FAMILY_IS_KNOWN() = 1)R

27、EPORT 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) GENERATEaut

28、o_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 USE

29、D(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号