模型功能
- 常数在verilog设计中具备特殊的含义
- 和C语言中常数一个不变的变量的作用不同
- 在verilog中,常数更多地作为预编译变量以提高设计的灵活性
- 在上一篇文章中已经使用的genvar i就是用于级联变量而存在
- 也就是说
- verilog的常数更多地服务于布局描述
- 当然也可以作为数据,用于一些计算
- 而常数函数,则是实现参数关联的方法
模型框图
`timescale 1ns / 1ps
/*
- */
- // *******************************************************************************
- // Company: Fpga Publish
- // Engineer: FP
- //
- // Create Date: 2024/03/24 12:39:43
- // Design Name:
- // Module Name: verilog_demo
- // Project Name:
- // Target Devices: ZYNQ7010 | XCZU2CG | Kintex7
- // Tool Versions: 2021.1 || 2022.2
- // Description:
- // *
- // Dependencies:
- // *
- // Revision: 0.01
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- // *******************************************************************************
- module verilog_demo #(
- //mode
- parameter MD_SIM_ABLE = 0,
- //number
- parameter NB_DELAY_CLK = 100,
- //width
- parameter WD_ERR_INFO = 4
- )(
- //! system signals
- input i_sys_clk ,
- input i_sys_resetn,
- //! @virtualbus uart_interface @dir out
- output m_uart_0_mtx, //! uart master tx
- input m_uart_0_mrx, //! uart master rx
- //! @end
- //! error info feedback
- output [WD_ERR_INFO-1:0] m_err_verilog_info1
- );
- //========================================================
- //function to math and logic
- function automatic integer LOG2(input integer N);
- begin
- N = N - 1;
- for(LOG2 = 0; N > 0; LOG2 = LOG2 + 1)
- begin
- N = N >> 1;
- end
- end
- endfunction
- //========================================================
- //localparam to converation and calculate
- //========================================================
- //register and wire to time sequence and combine
- //========================================================
- //always and assign to drive logic and connect
- //========================================================
- //module and task to build part of system
- //========================================================
- //expand and plug-in part with version
- //========================================================
- //ila and vio to debug and monitor
- endmodule
-
- /* 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企服之家,中国第一个企服评测及商务社交产业平台。 |