基于FPGA的数字信号处理(4)--如何确定Verilog表达式的位宽
FPGA技术联盟 2024-09-12


1、一般规则

很多时候,Verilog中表达式的位宽都是被隐式确定的,即使你自己设计了位宽,它也是根据规则先确定位宽后,再扩展到你的设计位宽,这常常会导致结果产生意想不到的错误。比如:



结果是这样的:




类似的情况还有很多,为了减少设计出错的可能性,有必要探究一下表达式的位宽确定规则。


Verilog语法规定了如下的确定表达式位宽的规则:


  • 表达式的位宽由表达式中的**操作数(operands)或表达式所处的上下文(context)**决定。

  • **自决定表达式(self-determined expression)**就是表达式中所有操作数的位宽完全由自己决定。

  • **上下文决定表达式(context-determined expression)**就是表达式中所有操作数的位宽由整个表达式上下文环境中最大的位宽决定。


2、自决定表达式

这一类表达式的位宽都是根据表达式自身的位宽和运算结果来决定的。具体规则如下:



2.1、无位宽常数

这种情况它的位宽等同于整数integer,在大多数编译器中,integer的默认位宽都为32位。例如modelsim环境下的测试:



打印结果是32位宽的 “1”:



2.2、给定位宽常数

没什么好说的,位宽就是给定的这个数,比如 4‘d1的位宽就是4。例如:



打印结果:



2.3、运算(1)

i 和 j 做以下运算:+ - * / % & | ^ ^~ ~^ 时,位宽等于 i 和 j 中位宽较大者的位宽。很好理解,这些运算就是常见的 加减乘除取模 与或异或同或 运算。例如4bits数和5bits数相加:



打印结果是5bits:



2.4、运算(2)

对 i 做以下运算: + - ~ 时,位宽等于它本身。也很好理解,就是正负表达和取反,所以位宽肯定不会改变。例如:



打印结果仍是4bits:



2.5、比较

二个数的比较结果只有 不是,所以位宽只需要1位,例如:=== !== == != > >= < <=。例如:



打印结果是1bit:



2.6、逻辑与、逻辑或

逻辑与&& 和 逻辑或 || 的结果也只有1bit。



打印结果是1bit:



2.7、规约运算(Reduction)

下面这些规约运算的结果只有1位:& ~& | ~| ^ ~^ ^~ !。规约运算就是对数据本身的所有位做同样的对应的运算,例如规约与(该数的所有位相与):



打印结果是1bit:



2.8、移位和乘方

移位和乘方运算(>> << ** >>> <<<)的结果位宽是该数本身位宽。例如移位:



打印结果是4bits:



乘方运算的结果有可能会溢出,例如:



打印结果是4bits:



3**3的结果原本是27,即1_1011,高位被截断后,成了4bits的1011。


2.9、条件表达式

条件表达式(i ? j : k)的位宽等于 j 和 k 中的位宽较大者。例如:



打印结果是6bits:



尽管c为真,所以该式的结果是a,但是位宽却等于更宽的b,所以结果的高位会补2个0,扩展到6bits。


2.10、拼接

第一种拼接:{i,…,j},位宽为二者之和。例如:



打印结果是4 + 6 = 10bits:



第二种拼接:{i{j,…,k}},位宽为二者之和与系数的乘积。例如:



打印结果是2*(4 + 6) = 20bits:



3、上下文决定表达式

上下文决定表达式其实就是各种自决定表达式的集合,所以需要视具体情况而具体分析。看一个例子:



打印结果:



  • a*b原本是15×10=150,即1001_0110,但是结果的位宽是a、b中的较大位宽(6bits),所以被结果截断到 01_0110;

  • a**b原本是15^10=576,650,390,625,即1000011001000011000010101010110001100001,但是乘法的结果位宽是a的位宽(4bits),所以结果被截断到 0001;然后和 0 做拼接,相当与位宽没变,所以结果仍是0001,最后赋值给c,c的位宽为16,所以需要在高位补0,最终结果为0000000000000001

  • 第三个和第二个的区别在于没有拼接运算符,a**b的位宽结果取决于上下文环境,即c的位宽。所以在计算时,a和b都会被先拓展到16位,然后再计算结果。



声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【报名】2024 Arm Tech年度大会(上海/深圳)


  • 相关技术文库
  • FPGA
  • 可编程
  • PLC
  • verilog
  • 简单说说FPGA如何使用LUT表实现组合逻辑

    LUT,全称Look Up Table,查找表。目前主流FPGA实现的是6输入查找表。这里我

    09-26
  • ASIC设计中的常见挑战与解决方案

    在集成电路界ASIC被认为是一种为专门目的而设计的集成电路。是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。ASIC的特点是面向特定用户的需求,ASIC在批量生产时与通用集成电路相比具有体积更小、...

    09-12
  • PLC存储器使用的常见误区与解决方案

    存储器的使用范围非常广泛,可以说每个电子设备中都有存储器的身影,PLC也不例外。为增进大家对存储器的认识,本文将对PLC内部常用存储器的使用规则予以介绍。如果你对存储器具有兴趣,不妨和小编一起来继续往下阅...

    09-12
  • PLC常用物理存储器的介绍与应用

    存储器可以用来存储数据,我们每天都会使用到存储器,比如我们的手机中就有存储器。为增进大家对存储器的认识,本文将对存储器的选片和总线概念、PLC常用的几种物理存储器予以介绍。如果你对存储器具有兴趣,不妨...

    08-26
  • 硬件设计:FGPA如果带MIPI

    一、MIPI简介?\x0a二、硬件设计\x0a三.Interface Designer 设计\x0aTX\x0aRX\x0a四、代码定义\x0a总结

    08-02
  • Verilog基础语法与注意事项

    \x26amp;nbsp;基础知识1\x26amp;nbsp; 模块(Module)\x26amp;nbsp;\x26amp;nbsp;\x26amp;nbsp;\x26amp;nbsp;Ve

    07-30
  • 如何使用专用指令调整Nios II系列处理器硬件?

    前不久,Altera 正式推出了Nios II系列32位RSIC嵌入式处理器。Nios II系列软核处理器是Altera的第二代FPGA嵌入式处理器,其性能超过200DMIPS,在Altera FPGA中实现仅需35美分。Altera的Stratix 、Stratix GX、 Stra...

    07-18
  • FPGA芯片优化设计全面解析

    可编程逻辑器件是通过EDA技术将电子应用系统的既定功能和技术指标具体实现的硬件载体,FPGA作为实现这一途径的主流器件之一,具有直接面向用户,灵活性和通用性极大,使用方便,硬 件测试和实现快捷等特点。硬件描...

    07-18
  • FPGA设计流程:算法、仿真、调试

    FPGA(Field Programmable Gate Array)是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有...

    07-18
  • 简述UltraScale FPGA架构

    AMD ultrascale FPGA概述

    07-18
  • 什么是移位寄存器?什么是LFSR?

    LFSR的介绍、分类、用途及Verilog实现与仿真等功能。

    07-18
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告