主要参考ug479.pdf。之前的文章:FIR调用DSP48E_05。本文主要记录基本用法。

一、DSP48核

  A-参数说明

  • instrctions,多个功能,通过sel选用

目前没发现C勾选与否,有何影响。

如上图所示,结果3拍后输出:

其他参数:

  B-IP调用

生成IP核,参数设置完毕直接调用即可

  1. dsp48_ex dsp_inst(
  2. .CLK(clk),
  3. .A(a),
  4. .B(b),
  5. .C(c),
  6. .P(p)
  7. );

  

二、原语示例

主要参考pg148-dsp48 macro.pdf用到再细化补充。

  Ex1

// m = b * (a + d)
// p = c+m or p+m

  1. `timescale 1ns / 1ps
  2.  
  3. // m = b * (a + d)
  4. // p = c+m or p+m
  5. module dsp48_wrap_f
  6. (
  7. input clock,
  8. input ce1,
  9. input ce2,
  10. input cem,
  11. input cep,
  12. input signed [24:0] a,
  13. input signed [17:0] b,
  14. input signed [47:0] c,
  15. input signed [24:0] d, // this has two fewer pipe stages
  16. // X+Y is usually the multiplier output (M)
  17. // Z is either P, PCIN or C
  18. // bit 1:0: 0: Z+X+Y 3:Z-(X+Y) 1: -Z + (X+Y) 2: -1*(Z+X+Y+1)
  19. // bits 3:2, 0: Z=0, 1: Z=PCIN, 2: Z=P, 3: Z = C
  20. // bit 4: sub in pre add
  21. input [4:0] mode,
  22. input signed [47:0] pcin,
  23. output signed [47:0] pcout,
  24. output signed [47-S:0] p);
  25.  
  26. parameter S = 0;
  27.  
  28. parameter USE_DPORT = "FALSE"; // enabling adds 1 reg to A path
  29. parameter AREG = 1;
  30. parameter BREG = 1; // 0 - 2
  31.  
  32. wire signed [47:0] dsp_p;
  33. assign p = dsp_p[47:S];
  34.  
  35. DSP48E1
  36. #(
  37. .A_INPUT("DIRECT"), // "DIRECT" "CASCADE"
  38. .B_INPUT("DIRECT"), // "DIRECT" "CASCADE"
  39. .USE_DPORT(USE_DPORT),
  40. .USE_MULT("MULTIPLY"),// "MULTIPLY" "DYNAMIC" "NONE"
  41. .USE_SIMD("ONE48"), // "ONE48" "TWO24" "FOUR12"
  42. // pattern detector - not used
  43. .AUTORESET_PATDET("NO_RESET"), .MASK(48'h3fffffffffff),
  44. .PATTERN(48'h000000000000), .SEL_MASK("MASK"),
  45. .SEL_PATTERN("PATTERN"), .USE_PATTERN_DETECT("NO_PATDET"),
  46. // register enables
  47. .ACASCREG(1), // pipeline stages between A/ACIN and ACOUT (0, 1 or 2)
  48. .ADREG(1), // pipeline stages for pre-adder (0 or 1)
  49. .ALUMODEREG(1), // pipeline stages for ALUMODE (0 or 1)
  50. .AREG(AREG), // pipeline stages for A (0, 1 or 2)
  51. .BCASCREG(1), // pipeline stages between B/BCIN and BCOUT (0, 1 or 2)
  52. .BREG(BREG), // pipeline stages for B (0, 1 or 2)
  53. .CARRYINREG(1), // this and below are 0 or 1
  54. .CARRYINSELREG(1),
  55. .CREG(1),
  56. .DREG(1),
  57. .INMODEREG(1),
  58. .MREG(1),
  59. .OPMODEREG(1),
  60. .PREG(1))
  61. dsp48_i
  62. (
  63. // status
  64. .OVERFLOW(),
  65. .PATTERNDETECT(), .PATTERNBDETECT(),
  66. .UNDERFLOW(),
  67. // outs
  68. .CARRYOUT(),
  69. .P(dsp_p),
  70. // control
  71. .ALUMODE({2'd0, mode[1:0]}),
  72. .CARRYINSEL(3'd0),
  73. .CLK(clock),
  74. .INMODE({1'b0,mode[4],3'b100}),
  75. .OPMODE({1'b0,mode[3:2],4'b0101}),
  76. // signal inputs
  77. .A({5'd0,a}), // 30
  78. .B(b), // 18
  79. .C(c), // 48
  80. .CARRYIN(1'b0),
  81. .D(d), // 25
  82. // cascade ports
  83. .ACOUT(),
  84. .BCOUT(),
  85. .CARRYCASCOUT(),
  86. .MULTSIGNOUT(),
  87. .PCOUT(pcout),
  88. .ACIN(30'h0),
  89. .BCIN(18'h0),
  90. .CARRYCASCIN(1'b0),
  91. .MULTSIGNIN(1'b0),
  92. .PCIN(pcin),
  93. // clock enables
  94. .CEA1(ce1), .CEA2(ce2),
  95. .CEAD(1'b1),
  96. .CEALUMODE(1'b1),
  97. .CEB1(ce1), .CEB2(ce2),
  98. .CEC(1'b1),
  99. .CECARRYIN(1'b1),
  100. .CECTRL(1'b1), // opmode
  101. .CED(1'b1),
  102. .CEINMODE(1'b1),
  103. .CEM(cem), .CEP(cep),
  104. .RSTA(1'b0),
  105. .RSTALLCARRYIN(1'b0),
  106. .RSTALUMODE(1'b0),
  107. .RSTB(1'b0),
  108. .RSTC(1'b0),
  109. .RSTCTRL(1'b0),
  110. .RSTD(1'b0),
  111. .RSTINMODE(1'b0),
  112. .RSTM(1'b0),
  113. .RSTP(1'b0)
  114. );
  115.  
  116. endmodule // dsp48_wrap_f

  Ex2

/ /p = c + b * a 3 cycles if r else p = p + b * a

  1. // p = c + b * a 3 cycles if r else p = p + b * a
  2. module macc
  3. (
  4. input clock,
  5. input [2:0] ce, // bit 0 = a, 1 = b , 2 = c
  6. input r, // reset accumulator to c + a*b
  7. input signed [24:0] a,
  8. input signed [17:0] b,
  9. input signed [47:0] c,
  10. output signed [47-S:0] p;
  11.  
  12. parameter S = 0;
  13. parameter AREG = 1; // 0 - 2
  14. parameter BREG = 1; // 0 - 2
  15.  
  16. wire signed [47:0] dsp_p;
  17. assign p = dsp_p[47:S];
  18.  
  19. // X+Y is usually the multiplier output (M)
  20. // Z is either P, PCIN or C
  21. // bit 1:0: 0: Z+X+Y 3:Z-(X+Y) 1: -Z + (X+Y) 2: -1*(Z+X+Y+1)
  22. // bits 3:2, 0: Z=0, 1: Z=PCIN, 2: Z=P, 3: Z = C
  23. // bit 4: sub in pre add
  24. wire [4:0] mode = {1'b0, r ? 2'b11 : 2'b10, 2'b00};
  25.  
  26. DSP48E1
  27. #(
  28. .A_INPUT("DIRECT"), // "DIRECT" "CASCADE"
  29. .B_INPUT("DIRECT"), // "DIRECT" "CASCADE"
  30. .USE_DPORT("FALSE"),
  31. .USE_MULT("MULTIPLY"),// "MULTIPLY" "DYNAMIC" "NONE"
  32. .USE_SIMD("ONE48"), // "ONE48" "TWO24" "FOUR12"
  33. // pattern detector - not used
  34. .AUTORESET_PATDET("NO_RESET"), .MASK(48'h3fffffffffff),
  35. .PATTERN(48'h000000000000), .SEL_MASK("MASK"),
  36. .SEL_PATTERN("PATTERN"), .USE_PATTERN_DETECT("NO_PATDET"),
  37. // register enables
  38. .ACASCREG(1), // pipeline stages between A/ACIN and ACOUT (0, 1 or 2)
  39. .ADREG(1), // pipeline stages for pre-adder (0 or 1)
  40. .ALUMODEREG(1), // pipeline stages for ALUMODE (0 or 1)
  41. .AREG(AREG), // pipeline stages for A (0, 1 or 2)
  42. .BCASCREG(1), // pipeline stages between B/BCIN and BCOUT (0, 1 or 2)
  43. .BREG(BREG), // pipeline stages for B (0, 1 or 2)
  44. .CARRYINREG(1), // this and below are 0 or 1
  45. .CARRYINSELREG(1),
  46. .CREG(1),
  47. .DREG(1),
  48. .INMODEREG(1),
  49. .MREG(1),
  50. .OPMODEREG(1),
  51. .PREG(1))
  52. dsp48_i
  53. (
  54. // status
  55. .OVERFLOW(),
  56. .PATTERNDETECT(), .PATTERNBDETECT(),
  57. .UNDERFLOW(),
  58. // outs
  59. .CARRYOUT(),
  60. .P(dsp_p),
  61. // control
  62. .ALUMODE({2'd0, mode[1:0]}),
  63. .CARRYINSEL(3'd0),
  64. .CLK(clock),
  65. .INMODE({1'b0,mode[4],3'b100}),
  66. .OPMODE({1'b0,mode[3:2],4'b0101}),
  67. // signal inputs
  68. .A({5'd0,a}), // 30
  69. .B(b), // 18
  70. .C(c), // 48
  71. .CARRYIN(1'b0),
  72. .D(25'd0), // 25
  73. // cascade ports
  74. .ACOUT(),
  75. .BCOUT(),
  76. .CARRYCASCOUT(),
  77. .MULTSIGNOUT(),
  78. .PCOUT(),
  79. .ACIN(30'h0),
  80. .BCIN(18'h0),
  81. .CARRYCASCIN(1'b0),
  82. .MULTSIGNIN(1'b0),
  83. .PCIN(48'h0),
  84. // clock enables
  85. .CEA1(1'b1), .CEA2(ce[0]),
  86. .CEAD(1'b1),
  87. .CEALUMODE(1'b1),
  88. .CEB1(1'b1), .CEB2(ce[1]),
  89. .CEC(ce[2]),
  90. .CECARRYIN(1'b1),
  91. .CECTRL(1'b1), // opmode
  92. .CED(1'b1),
  93. .CEINMODE(1'b1),
  94. .CEM(1'b1), .CEP(1'b1),
  95. .RSTA(1'b0),
  96. .RSTALLCARRYIN(1'b0),
  97. .RSTALUMODE(1'b0),
  98. .RSTB(1'b0),
  99. .RSTC(1'b0),
  100. .RSTCTRL(1'b0),
  101. .RSTD(1'b0),
  102. .RSTINMODE(1'b0),
  103. .RSTM(1'b0),
  104. .RSTP(1'b0)
  105. );
  106.  
  107. endmodule

  Ex3:(35bit * 25bit,级联)

// wide multiply using 2x DSP48E1
// p = ((a * b) + c), 4 clock pipe delay

  1. `timescale 1ns / 1ps
  2.  
  3. // wide multiply using 2x DSP48E1
  4. // p = ((a * b) + c), 4 clock pipe delay
  5. module mult_35x25
  6. (
  7. input clock,
  8. input signed [24:0] a,
  9. input signed [34:0] b,
  10. input signed [47:0] c,
  11. output signed [64:0] p);
  12.  
  13. wire signed [29:0] low_acout;
  14. wire signed [47:0] low_pcout;
  15. wire [47:0] p_low3;
  16. reg [16:0] p_low4;
  17.  
  18. DSP48E1 #(.A_INPUT("CASCADE"), .AREG(1), .BREG(2)) dsp48_high
  19. (
  20. // status
  21. .OVERFLOW(), .PATTERNDETECT(), .PATTERNBDETECT(), .UNDERFLOW(),
  22. // outs
  23. .P(p[64:17]), .CARRYOUT(),
  24. // control
  25. .ALUMODE(4'b0), .CARRYINSEL(3'd0),
  26. .CLK(clock),
  27. .INMODE(5'b00000),
  28. .OPMODE(7'b1010101), // a*b + pcin >> 17
  29. // signal inputs
  30. .A(30'b0), .B(b[34:17]), .C(48'b0), .CARRYIN(1'b0), .D(25'b0),
  31. // cascade ports
  32. .ACOUT(), .BCOUT(), .CARRYCASCOUT(), .MULTSIGNOUT(), .PCOUT(),
  33. .ACIN(low_acout), .BCIN(18'h0), .CARRYCASCIN(1'b0), .MULTSIGNIN(1'b0),
  34. .PCIN(low_pcout),
  35. // clock enables, resets
  36. .CEA1(1'b1), .CEA2(1'b1), .CEAD(1'b1), .CEALUMODE(1'b1),
  37. .CEB1(1'b1), .CEB2(1'b1), .CEC(1'b1), .CECARRYIN(1'b1),
  38. .CECTRL(1'b1), .CED(1'b1), .CEINMODE(1'b1), .CEM(1'b1), .CEP(1'b1),
  39. .RSTA(1'b0), .RSTALLCARRYIN(1'b0), .RSTALUMODE(1'b0),
  40. .RSTB(1'b0), .RSTC(1'b0), .RSTCTRL(1'b0), .RSTD(1'b0),
  41. .RSTINMODE(1'b0), .RSTM(1'b0), .RSTP(1'b0)
  42. );
  43.  
  44. DSP48E1 #(.ACASCREG(1), .AREG(1), .BREG(1)) dsp48_low
  45. (
  46. // status
  47. .OVERFLOW(), .PATTERNDETECT(), .PATTERNBDETECT(), .UNDERFLOW(),
  48. // outs
  49. .P(p_low3), .CARRYOUT(),
  50. // control
  51. .ALUMODE(4'b0), .CARRYINSEL(3'd0),
  52. .CLK(clock),
  53. .INMODE(5'b00000), .OPMODE(7'b0110101),
  54. // signal inputs
  55. .A({{5{a[24]}},a}), .B({1'b0,b[16:0]}),
  56. .C(c),
  57. .CARRYIN(1'b0),
  58. .D(25'b0),
  59. // cascade ports
  60. .ACOUT(low_acout), .BCOUT(), .CARRYCASCOUT(), .MULTSIGNOUT(), .PCOUT(low_pcout),
  61. .ACIN(30'h0), .BCIN(18'h0), .CARRYCASCIN(1'b0), .MULTSIGNIN(1'b0), .PCIN(48'h0),
  62. // clock enables, resets
  63. .CEA1(1'b1), .CEA2(1'b1), .CEAD(1'b1), .CEALUMODE(1'b1),
  64. .CEB1(1'b1), .CEB2(1'b1), .CEC(1'b1), .CECARRYIN(1'b1),
  65. .CECTRL(1'b1), .CED(1'b1), .CEINMODE(1'b1), .CEM(1'b1), .CEP(1'b1),
  66. .RSTA(1'b0), .RSTALLCARRYIN(1'b0), .RSTALUMODE(1'b0),
  67. .RSTB(1'b0), .RSTC(1'b0), .RSTCTRL(1'b0), .RSTD(1'b0),
  68. .RSTINMODE(1'b0), .RSTM(1'b0), .RSTP(1'b0)
  69. );
  70.  
  71. always @ (posedge clock)
  72. begin
  73. p_low4 <= p_low3[16:0];
  74. end
  75.  
  76. assign p[16:0] = p_low4;
  77.  
  78. initial
  79. begin
  80. $dumpfile("dump.vcd");
  81. $dumpvars(0);
  82. end
  83.  
  84. endmodule

  

基础004_V7-DSP Slice的更多相关文章

  1. 【前端基础系列】slice方法将类数组转换数组实现原理

    问题描述 在日常编码中会遇到将类数组对象转换为数组的问题,其中常用到的一种方式使用Array.prototype.slice()方法. 类数组对象 所谓的类数组对象,JavaScript对它们定义为: ...

  2. golang基础---Slice切片

    切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度 ...

  3. 基础008_定浮点转化[floating point IP]

    作者:桂. 时间:2018-05-15  21:55:50 链接:http://www.cnblogs.com/xingshansi/p/9042564.html 前言 本文为Xilinx float ...

  4. 【不定期更新】FPGA/IC岗位常见笔试面试题总结(基础知识)

    1 数字IC(ASIC)设计流程: IC设计分为前端和后端.前端设计主要将HDL语言-->网表,后端设计是网表-->芯片版图. 前端主要有需求分析与架构设计.RTL设计.仿真验证.逻辑综合 ...

  5. [转] 对Array.prototype.slice.call()方法的理解

    在看别人代码时,发现有这么个写法:[].slice.call(arguments, 0),这到底是什么意思呢? 1.基础 1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规 ...

  6. 对Array.prototype.slice.call()方法的理解

    在看别人代码时,发现有这么个写法:[].slice.call(arguments, 0),这到底是什么意思呢? 1.基础 1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规 ...

  7. TI DSP 6657 SRIO 简介

    目录 TI DSP 6657 SRIO 简介 SRIO 协议介绍 RapidIO 基础 TI DSP 6657 SRIO 简介 SRIO 协议介绍 TI 的 KeyStone 系列设备中实现了 Rap ...

  8. 对Array.prototype.slice.call()方法的理解在看别人代码时,发现有这么个写法:[].slice.call(arguments, 0),这到底是什么意思呢?

    1.基础 1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第 ...

  9. 【转】DSP是什么--DSP是神马东东??

    原文:http://www.eepw.com.cn/article/272908.htm 导读:本文主要介绍的是DSP是什么,不懂得童鞋们快随小编一起学习一下DSP到底是个神马东东吧! 本文引用地址: ...

  10. Array.prototype.slice.call()方法的理解

    1.基础1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第二 ...

随机推荐

  1. JDK5.0 特性-线程任务执行架构 ScheduledExecutorService

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html import java.util.concurrent.Callable ...

  2. 微信小程序图片上传并展示

    1.首先编写微信小程序的页面和样式: index.js var total = []; Page({ data: { perImgSrc: [] }, onLoad: function (option ...

  3. pip安装psutil模块时候报错:yum install python-devel mysql-devel zlib-devel openssl-devel

    yum install python-devel mysql-devel zlib-devel openssl-devel [root@localhost software]# pip install ...

  4. centos6.5关闭ipv6

    万境归空,道法自然 1.在/etc/modprobe.d/目录下增加一个新的配置文件ipv6.conf cat << EOF > /etc/modprobe.d/ipv6.confa ...

  5. 【jquery】ajax 动态 改变 select下拉框选中的值

    //JS<script type="text/javascript> //ajax动态给添加原料的[商品名称]下拉框绑定selected属性 $("#origin_co ...

  6. iOS设置圆角的四种方法

    小小圆角问题,正常情况下,我们不需要过多关心,但当屏幕内比较多的时候,还是有必要了解下性能问题的 一.设置CALayer的cornerRadius 这是最常用的,也是最简单的. cornerRadiu ...

  7. jsp之radio取值与赋值

    转自:https://blog.csdn.net/dongfengkuayue/article/details/50352937 取radio的值: js代码 $("input[name=' ...

  8. git difftool 详解

    一.如何比较两个版本之间的差异 1.显示版本得到版本的commit id 2.执行difftool命令 按Y进行比较,我用的是DiffMerge这个软件对代码进行比较的 二.比较当前所修改的内容 gi ...

  9. java struts2入门学习--基于xml文件的声明式验证

    一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...

  10. JavaScript Window History 浏览器的历史

    window.history 对象在编写时可不使用 window 这个前缀. 为了保护用户隐私,对 JavaScript 访问该对象的方法做出了限制. 一些方法: history.back() - 与 ...