0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用函数表示组合逻辑的方法

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-12-21 09:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

数字门级电路可分为两大类:组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点,在后面会作为单独的主题处理。

组合逻辑描述了门级电路,其中逻辑块的输出直接反映到该块的输入值的组合,例如,双输入AND门的输出是两个输入的逻辑与。如果输入值发生变化,输出值将反映这一变化,组合逻辑的RTL模型需要反映这种门级行为,这意味着逻辑块的输出必须始终反映该逻辑块当前输入值的组合。

SystemVerilog有三种在可综合RTL级别表示组合逻辑的方法:连续赋值语句、always程序块和函数。接下来几篇文章将探讨每种编码风格,并推荐最佳实践编码风格。

425b3fb4-80cc-11ed-8abf-dac502259ad0.png

使用函数表示组合逻辑

当编码正确时,函数的行为和综合就像组合逻辑一样。

最佳实践指南7-7
将RTL模型中使用的函数声明为自动automatic。

为了表示组合逻辑行为,每次调用函数时都必须计算一个新的函数返回值。如果调用了静态函数,但没有指定返回值,则静态函数将隐式返回其上一次调用的值。这是锁存逻辑的行为,而不是组合逻辑。通过将RTL模型中使用的所有函数声明为自动函数(automatic),可以避免这种编码错误。

例7-2定义了一个使用Russian Peasant Multiplication算法(一系列加法和移位运算)计算乘法运算的函数。该函数被定义在一个包中,任何模块都可以使用该乘法器算法。

SystemVerilog会推断出一个与函数名称和数据类型相同的变量,示例7-2中的代码就是利用了这一点。函数名multiply_f被用作临时变量来保存for循环中的中间计算结果,函数名中存储的最终值在函数退出时成为函数返回值。

图7-2显示了综合该函数的结果,以及从连续赋值语句调用该函数的模块。

示例7-2:定义乘法运算的算法函数

//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
packagedefinitions_pkg;
timeunit1ns;timeprecision1ns;

//RussianPeasantMultiplicationAlgorithm
functionautomatic[7:0]multiply_f([7:0]a,b);
multiply_f=0;
for(inti=0;i<=3; i++) begin 
      if (b == 0) continue; // all done, finish looping
      else begin 
         if (b & 1) multiply_f += a;
         a <<= 1;  // multiply by 2
         b >>=1;//divideby2
end
end
endfunction
endpackage:definitions_pkg
//`end_keywords

//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
modulealgorithmic_multiplier
importdefinitions_pkg::*;
(inputlogic[3:0]a,b,
outputlogic[7:0]result
);
timeunit1ns;timeprecision1ns;

assignresult=multiply_f(a,b);

endmodule:algorithmic_multiplier
//`end_keywords
图7-2:示例7-2的综合结果:作为组合逻辑的函数

42abd94c-80cc-11ed-8abf-dac502259ad0.png

最佳实践指南7-8
在可能的情况下,使用SystemVerilog运算符,如*,而不是使用循环和其他编程语句。

算法乘法器的示例7-2还说明了为什么在乘法和除法等复杂运算中最好使用SystemVerilog运算符。如果在示例7-2中使用了乘法运算符(*),则综合编译器可以将该运算符映射到ASICFPGA的最有效的乘法器。

设计工程师在使用算术运算符或算法来表示复杂操作时需要谨慎。RTL模型不是在具有大量内存资源的通用计算机上运行的软件程序。RTL模型是门级实现的抽象。所表示的功能需要在物理上适合目标ASIC或FPGA,并且在时间上在有限的数量或时钟周期内。之前的文章有详细介绍了在RTL模型中使用算术运算符(如乘法和除法)的指导原则。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 锁存器
    +关注

    关注

    8

    文章

    952

    浏览量

    43846
  • 组合逻辑
    +关注

    关注

    0

    文章

    48

    浏览量

    10323
  • and
    and
    +关注

    关注

    0

    文章

    36

    浏览量

    7689

原文标题:使用函数表示组合逻辑

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    定点数表示实数的方法以及定点数在硬件上的运算验证

    本篇主要介绍定点数表示实数的方法以及定点数在硬件上的运算验证 为什么选定点数 32位单精度浮点数: 32位的单精度浮点数为例,IEE754标准规定,一个flaot类型的浮点数X可以
    发表于 10-28 08:13

    电压放大器驱动的混凝土组合结构界面损伤高灵敏检测方法研究

    钢-混组合结构无损检测技术,可用于指导MASW方法的实际工程应用。 测试设备: ATA-2041高压放大器、采集卡、示波器、任意函数波形发生器。 实验过程: 图:MASW试验检测系统 搭建MASW检测系统,MASW检测系统的硬件
    的头像 发表于 08-05 11:42 505次阅读
    电压放大器驱动的混凝土<b class='flag-5'>组合</b>结构界面损伤高灵敏检测<b class='flag-5'>方法</b>研究

    C语言中的内联函数与宏

    在C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1718次阅读
    C语言中的内联<b class='flag-5'>函数</b>与宏

    深入理解C语言:函数—编程中的“积木块”艺术

    在编程的世界里,函数就像建筑中的“积木块”——它们是构建复杂程序的基石。通过灵活组合这些模块,开发者能打造出功能强大且结构清晰的代码。函数之所以成为C语言的核心,正是因为它解决了编程中的三大关
    的头像 发表于 06-30 17:26 1495次阅读
    深入理解C语言:<b class='flag-5'>函数</b>—编程中的“积木块”艺术

    实用电子电路设计(全6本)——数字逻辑电路的ASIC设计

    门电路、逻辑压缩、组合电路、Johnson计数器、定序器设计及应用等,并介绍了实现最佳设计的各种工程设计方法。 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~)
    发表于 05-15 15:22

    WP4000变频功率分析仪的精度表示与常规仪表精度表示方法有什么不同?

    WP4000变频功率分析仪的精度表示与常规仪表精度表示方法有什么不同呢? 一 相对误差与引用误差的概念 相对误差是指测量所造成的绝对误差与被测量真值之比,一般以百分数表示。 由于被测量
    的头像 发表于 05-13 09:58 473次阅读

    用电设备功率因数表

    用电设备功率因数表
    发表于 04-01 16:25 0次下载

    数字电路—22、时序逻辑电路

    时序电路的逻辑功能可用逻辑表达式、状态表、卡诺图、状态图、时序图和逻辑图6种方式表示,这些表示方法
    发表于 03-26 15:03

    数字电路—6、逻辑函数表示方法

    发表于 03-25 10:26

    迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-UART应用开发-UART驱动API接口介绍

    ,返回值为负数表示 UART 设置设备属性失败。 (5) UartGetAttribute 设置 UART 的设备属性后,可以通过获取设备属性接口来查看 UART 当前的设备属性。函数原型如下所示
    发表于 03-24 11:19

    复合光缆型号怎么表示

    复合光缆的型号表示方法通常遵循一定的命名规则,这些规则有助于用户识别光缆的特性、用途和规格。以下是对复合光缆型号表示方法的详细解释: 一、型号构成 复合光缆的型号通常由光缆型式的代号和
    的头像 发表于 03-18 09:50 1328次阅读

    解锁TSMaster fifo函数:报文读取的高效方法

    前言:TSMaster目前有两种读取报文的模式:回调函数模式和fifo模式。fifo函数是TSMaster近期新增的函数,本文将重点介绍fifo模块。关于回调函数的使用
    的头像 发表于 03-14 20:04 943次阅读
    解锁TSMaster fifo<b class='flag-5'>函数</b>:报文读取的高效<b class='flag-5'>方法</b>

    迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-UART应用开发-UART驱动API接口介绍

    属性成功,返回值为负数表示 UART 设置设备属性失败。 (5) UartGetAttribute 设置 UART 的设备属性后,可以通过获取设备属性接口来查看 UART 当前的设备属性。函数原型如下
    发表于 03-11 10:27

    请问AFE5801 AD转换后数字信号是用有符号数还是无符号数表示的?

    请问AFE5801 AD转换后数字信号是用有符号数还是无符号数表示的啊?
    发表于 02-11 07:18

    解密逻辑单元与CoreScore得分的关系

    FPGA 通过查找表 (LUT) 实现逻辑功能。这些 LUT 类似于真值表或卡诺图 (Karnaugh map),FPGA 可以通过组合多个 LUT ,来实现几乎任何你所需的逻辑功能。
    的头像 发表于 02-06 15:06 696次阅读
    解密<b class='flag-5'>逻辑</b>单元与CoreScore得分的关系