parameter常数及常数函数的使用

这篇具有很好参考价值的文章主要介绍了parameter常数及常数函数的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型功能

  • 常数在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

*/文章来源地址https://www.toymoban.com/news/detail-843674.html

实现步骤

  1. 传递参数的使用
  • 一般是用于本模块中可以灵活适应的常量,比如数据位宽、计算延时、处理模式等
  • 笔者更为倾向于将参数分为下列三类:
    • 位宽(WD):用于控制信号的位宽,这个和FPGA信号的连贯性有关
    • 模式(MD):一般用于某些功能的拓展,可以增强模块的复用
    • 数量(NB):一些延时个数以及公式所需的系数等
  1. 本地参数的作用
  • 一般来说,localparam不能被外部的defparam修改,而parameter可以
  • 所以,对于转化参数和内部无法修改的参数,一般作为本地参数
  • 其更多用于过程量和一些不可修改的关键量
  1. 常数函数的使用
  • 如第二章模型中所示的LOG2函数
  • 则是利用FPGA的移位操作实现的向下取整的LOG2函数,常用于位宽和范围的转化
  • 可以解决修改范围时位宽无法适配的问题
  1. 高拓展性模块的实现
  • 将所有的位宽均纳入参数自动匹配
    • 这样才能保证位宽可以适应所有的处理需求
  • 将新增加的功能都加入到模式控制
    • 这样可以随时打开或者关闭某些功能,实现最大化的评估各个功能的组合效果
  • 将所有可调的数量都引入传递参数
    • 这样的传递可以不用为了修改某些很小的数去修改模块内的代码
    • 达到模块的最大化复用
  1. 常数在模块内部的使用
  • 纯常数计算对于FPGA来说不占额外的资源
    • 这意味着,(信号 * 常数 * 常数) 和(常数 * 常数 * 信号)所描述的硬件具备很大的差别
    • 一般前者需要两倍的资源去映射
  • 所以,对于需要按照步骤执行的计算,最好的方法是将公式的顺序进行优化
    • 优先计算常数项
    • 然后计算常数项与信号项的交互
  • 另外,关于计算常数除法,如果是整型,可以利用移位操作实现乘法替换除法
    • 具体原理:Y = X / 100 = X * (2 ** 16 / 100) >> 16;
    • 其中括号中的常数项可以先计算
    • 与X相乘后即得到放大后的除法结果
    • 在后续处理中再和其他系数的放大倍数进行统一的归一
    • 可以在极短的时间内完成复杂的除法和乘法的运算结果

最终效果

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

调用接口

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

到了这里,关于parameter常数及常数函数的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.cnblogs.com/electricdream/p/18098004

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog语法学习——LV10_使用函数实现数据大小端转换

    题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page=1tab=Verilog篇topicId=301) 描述 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的

    2024年02月15日
    浏览(10)
  • 了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

    🍉 CSDN 叶庭云 : https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要巨大的计算资源来运行。特别是,当需要为特定的下游

    2024年04月14日
    浏览(1)
  • FPGA实现的多波形信号发生器,支持正弦、方波、锯齿波、三角波及调制,配备仿真和实物制作功能,使用Verilog HDL编写

    基于FPGA的DDS多波形信号发生器,可以产生正弦波,方波,锯齿波三角波,调制波形2psk.2askAM调制,可以仿真,可以制作实物,可以进行讲解! 使用可以使用Quarter9.0自带仿真软件进行仿真波形。 也可以使用quarter13.1与modesim进行联合仿真进行仿真波形! 使用verilog HDL语言进行编

    2024年04月12日
    浏览(4)
  • The fifth parameter of the qt slot function(qt Connect函数的第五个参数)

    在Qt中,信号槽机制是允许对象之间通信的核心特性。 在处理线程时,非常必要了解信号和插槽在多线程环境中的工作方式。 关于connect函数的“第五个参数”,指的是 connect() 方法中的 Qt::ConnectionType 参数。此参数确定连接的类型,这在多线程应用程序中非常重要。 现在让我

    2024年01月21日
    浏览(17)
  • golang使用高阶函数优化业务功能

            两个接口(新增Tag和更新Tag),在业务层均需要添加两个校验,校验Tag信息是否重复和Tag的数据中的编码是否重复。         对应的增加两个校验的函数/方法,在接口实现中依次调用两个函数/方法进行校验。         实现简单;但重复代码多,后期再增加其他

    2024年02月07日
    浏览(12)
  • 使用std::function 来实现回调函数、委托的功能

    std::function 可以用来实现回调函数和委托的功能。下面是一个回调函数的示例: 在上述示例中,我们定义了回调函数 printText ,这个函数接受一个字符型指针参数,并打印出这个字符串。然后,我们定义了函数 processText ,该函数接受两个参数:文本和一个 std::function 类型的对

    2024年02月09日
    浏览(11)
  • getchar函数详解看这一篇就够了-C语言(函数功能、使用、返回值)

    首先要明确getchar的功能是:从计算机终端(一般是键盘)输入一个字符,其值就是输入得到的字符。 目录 getchar函数简介 getchar函数执行过程详解(配图)  getchar用法示例 解释一下:while ((ch=getchar()) != \\\'EOF\\\') 函数原型:int getchar(void);                                 返回

    2024年02月07日
    浏览(12)
  • vue写法——使用js高阶函数实现多条件搜索功能

    🙂博主:小猫娃来啦 🙂本文核心: vue封装——使用js高阶函数实现多条件搜索功能 之前出过一个react写法的前端搜索(react写法——使用js高阶函数实现多条件搜索功能) 今天我们再研究一下vue中怎么实现。 react和vue有什么区别? 这个区别要细说可太多了,但是最终都能归

    2024年02月11日
    浏览(13)
  • jenkins pipeline使用Git Parameter

    在 Jenkins Pipeline 中使用 Git Parameter 可以方便地从 Git 仓库中选择分支或标签进行构建。Git Parameter 是 Jenkins 的插件之一,可以在 Jenkins 构建参数中提供一个 Git 版本选择器。 要在 Jenkins Pipeline 中使用 Git Parameter,首先需要安装 Git Parameter 插件。安装完成后,可以在 Jenkins 中创建

    2024年02月16日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包