模型功能

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

*/

实现步骤

  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常数及常数函数的使用的更多相关文章

  1. 零值初始化&字符串常数作为函数模板参数

    1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...

  2. ARM的常数表达式

    ARM的常数表达式   如果说Intel指令中的立即数,相信大家都很熟悉.类似的,Arm指令中的“立即数”就是常数表达式.之所以称为常数表达式,而不称为立即数是有原因的. Intel指令属于CISC指 ...

  3. 【DSA MOOC】起泡排序的原理及常数优化

    根据学堂在线TsinghuaX: 30240184X 数据结构(2015秋)这门课的内容,对bubblesort做了一些总结. 1. bubblesort(起泡排序),原理来自这样一个观察规律:若序列 ...

  4. 数学黑洞:卡普雷卡尔常数的php算法实现

    首先看一篇文章: 英国广播公司报道,6174乍看没什么奇特之处,但是,自从1949年以来,它一直令数学家.数字控抓狂.痴迷. 不管你挑的四位数是什么,早早晚晚你都会遇到6174:而且,遇到6174就只 ...

  5. Sigmoid函数

    Sigmoid函数是一个S型函数. Sigmoid函数的数学公式为: 它是常微分方程 的一个解. Sigmoid函数具有如下基本性质: 定义域为 值域为, 为有界函数 函数在定义域内为连续和光滑函数 ...

  6. Visual Basic 函数速查

    Calendar 常数 可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbCalGreg 0 指出使用的是阳历. vbCalHijri 1 指出使用的是伊斯兰历法. Color 常数 可 ...

  7. opencv中矩阵计算的一些函数

    转自:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html 综述: OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口 ...

  8. Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))

    F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. js常用函数总结

    字符串函数 indexOf 返回字符串中一个子串第一处出现的索引(从左到右搜索).如果没有匹配项,返回 -1 . var index1 = a.indexOf("l"); //in ...

  10. 聚合函数与SQL排序

    聚合查询 通过SQL对数据进行某种操作或计算时需要使用函数(聚合函数,将多行汇为一行). 常用函数(5个): COUNT:计算表中的记录数(行数) SUM: 计算表中数值列中数据的合计值 AVG: 计 ...

随机推荐

  1. Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列

    写在开头 队列是Java中的一个集合接口,之前的文章已经讲解了List和Set,那么今天就来唠一唠它吧.队列的特点:存储的元素是有序的.可重复的. 队列的两大接口Queue vs Deque Queu ...

  2. wordpress设置固定链接404及伪静态配置

    说明 最近在将wordpress设置中文章url修改为月份和名称型 之后访问文章出现404.原因是配有配置好apache的伪静态. 配置步骤 1.修改httpd.conf 我这里是centos7,默认 ...

  3. OCP试题解析之053-61 RMAN set command id to

    61.You frequently have multiple RMAN sessions running, and you want to be able to easily identify ea ...

  4. 硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

    前言   前面输出了HDMI,LVDS,MIPI-DSI,这里还有一个常用的显示接口就是VGA了,这个用的不多了,一般板子都是hdmi了.  本篇分析底板VGA电路.   VGA接口   VGA(Vi ...

  5. MPG线程模型简介

    概述 go语言中的MPG线程模型对两级线程模型进行了一定程度的改进,使它能够更加灵活的进行线程之间的调度. 它由3个主要模块构成,如下图: MPG的3个主要模块以及功能,我们通过下表所示. 模块 功能 ...

  6. 记录一个错误:Traceback (most recent call last): from pip._internal.cli.main import main ImportError: No module named pip._internal.cli.main

    问题描述 在安装yaml时得到报错如下 root@ag-virtual-machine:/home/ag/test_script# pip install pyyaml Traceback (most ...

  7. C/C++ 的 指针/引用 传参

    #include <stdio.h> //指针传值 void addOne(int *a) { printf("%8p\n",a); *a = *a+1; } //引用 ...

  8. linux复习基础命令

    Linux基础命令 学习目标 了解vm备份的两种方式 了解快照和克隆的区别 了解linux系统文件 掌握基础命令 指定vmtools的作用 1 vm两种备份方式 为什么要进行备份 保证centos操作 ...

  9. Java --- 多线程 创建线程的方式四: 使用线程池

    1 package bytezero.thread2; 2 3 import java.security.Provider; 4 import java.util.concurrent.Executo ...

  10. Spring 知识点

    Spring Spring 是什么? Spring为了解决企业级应用的复杂性而创建,简化开发. 如下简化: 基于POJO的轻量级和最小侵入性编程: 以IoC(控制反转).DI(依赖注入)和面向接口实现 ...