parameter常数及常数函数的使用

打印 上一主题 下一主题

主题 917|帖子 917|积分 2751

模型功能


  • 常数在verilog设计中具备特殊的含义

    • 一个可以由编译器进行处置惩罚的数

  • 和C语言中常数一个不变的变量的作用不同
  • 在verilog中,常数更多地作为预编译变量以提高设计的灵活性

    • 在上一篇文章中已经使用的genvar i就是用于级联变量而存在

  • 也就是说

    • verilog的常数更多地服务于布局描述
    • 当然也可以作为数据,用于一些计算

  • 而常数函数,则是实现参数关联的方法
模型框图

`timescale 1ns / 1ps
/*
  1. */
  2. // *******************************************************************************
  3. // Company: Fpga Publish
  4. // Engineer: FP
  5. //
  6. // Create Date: 2024/03/24 12:39:43
  7. // Design Name:
  8. // Module Name: verilog_demo
  9. // Project Name:
  10. // Target Devices: ZYNQ7010 | XCZU2CG | Kintex7
  11. // Tool Versions: 2021.1 || 2022.2
  12. // Description:
  13. //         *
  14. // Dependencies:
  15. //         *
  16. // Revision: 0.01
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. // *******************************************************************************
  21. module verilog_demo #(
  22.     //mode
  23.     parameter MD_SIM_ABLE = 0,
  24.     //number
  25.     parameter NB_DELAY_CLK = 100,
  26.     //width
  27.     parameter WD_ERR_INFO = 4
  28.    )(
  29.     //! system signals
  30.     input           i_sys_clk   ,  
  31.     input           i_sys_resetn,  
  32.     //! @virtualbus uart_interface @dir out
  33.     output          m_uart_0_mtx, //! uart master tx
  34.     input           m_uart_0_mrx, //! uart master rx
  35.     //! @end
  36.     //! error info feedback
  37.     output   [WD_ERR_INFO-1:0]  m_err_verilog_info1
  38. );
  39. //========================================================
  40. //function to math and logic
  41. function automatic integer LOG2(input integer N);
  42. begin
  43.     N = N - 1;
  44.     for(LOG2 = 0; N > 0; LOG2 = LOG2 + 1)
  45.     begin
  46.         N = N >> 1;
  47.     end
  48. end
  49. endfunction
  50. //========================================================
  51. //localparam to converation and calculate
  52. //========================================================
  53. //register and wire to time sequence and combine
  54. //========================================================
  55. //always and assign to drive logic and connect
  56. //========================================================
  57. //module and task to build part of system
  58. //========================================================
  59. //expand and plug-in part with version
  60. //========================================================
  61. //ila and vio to debug and monitor
  62. endmodule
  63.               
  64. /* end verilog
复制代码
   */
实现步骤


  • 传递参数的使用


  • 一般是用于本模块中可以灵活顺应的常量,比如数据位宽、计算延时、处置惩罚模式等
  • 笔者更为倾向于将参数分为下列三类:

    • 位宽(WD):用于控制信号的位宽,这个和FPGA信号的连贯性有关
    • 模式(MD):一般用于某些功能的拓展,可以增强模块的复用
    • 数量(NB):一些延时个数以及公式所需的系数等


  • 本地参数的作用


  • 一般来说,localparam不能被外部的defparam修改,而parameter可以
  • 所以,对于转化参数和内部无法修改的参数,一般作为本地参数
  • 其更多用于过程量和一些不可修改的关键量

  • 常数函数的使用


  • 如第二章模型中所示的LOG2函数
  • 则是利用FPGA的移位操作实现的向下取整的LOG2函数,常用于位宽和范围的转化
  • 可以办理修改范围时位宽无法适配的问题

  • 高拓展性模块的实现


  • 将全部的位宽均纳入参数主动匹配

    • 这样才能包管位宽可以顺应全部的处置惩罚需求

  • 将新增长的功能都加入到模式控制

    • 这样可以随时打开或者关闭某些功能,实现最大化的评估各个功能的组合效果

  • 将全部可调的数量都引入传递参数

    • 这样的传递可以不用为了修改某些很小的数去修改模块内的代码
    • 达到模块的最大化复用


  • 常数在模块内部的使用


  • 纯常数计算对于FPGA来说不占额外的资源

    • 这意味着,(信号 * 常数 * 常数) 和(常数 * 常数 * 信号)所描述的硬件具备很大的差别
    • 一般前者需要两倍的资源去映射

  • 所以,对于需要按照步骤执行的计算,最好的方法是将公式的次序进行优化

    • 优先计算常数项
    • 然后计算常数项与信号项的交互

  • 另外,关于计算常数除法,如果是整型,可以利用移位操作实现乘法替换除法

    • 具体原理:Y = X / 100 = X * (2 ** 16 / 100) >> 16;
    • 此中括号中的常数项可以先计算
    • 与X相乘后即得到放大后的除法结果
    • 在后续处置惩罚中再和其他系数的放大倍数进行统一的归一
    • 可以在极短的时间内完成复杂的除法和乘法的运算结果

最终效果


  • 基于参数封装的verilog效果图
  • 可以实现xilinx的IP核形式的参数控制,获取最大的兼容性

调用接口


  • 非封装模型,无调用方法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表