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

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

3天内不再提示

SpinalHDL中的一别两宽式设计方式介绍

冬至配饺子 来源:Spinal FPGA 作者:玉骐 2022-08-09 14:45 次阅读

在SpinalHDL里,其lib库处处可见Stream的身影,而在常用的逻辑设计里,尤其接口的处理中,握手信号的处理也是老生常谈的话题。而在接受设计里,SpinalHDL中的“一别两宽”式设计方式,着实让我赞同。

》》Stream

Stream本质上是一个带数据的握手协议:

pYYBAGLyAeeAQudEAABsdJZDejI825.png

在数字逻辑电路里,无论是普通的模块接口之间,还是标准的AMBA、Avalon等总线,都处处可见Stream的身影:

pYYBAGLyAgCACDW5AABltE0LoO4450.png

》》握手之殇,纠缠不清

无论是新手还是老手,对于Stream这种握手形式的逻辑处理还是挺烦的。Stream这种握手形式的逻辑仅仅是添加一级寄存器还是颇显得繁琐的,需要小心翼翼的处理。更遑论当设计里还牵涉到数据的处理。这种在处理功能逻辑的同时又要考虑握手信号的处理时在设计逻辑电路时还是显得颇头大的,毕竟“一心二用”还是颇有不便……

仔细想想,在接口信号处理时,功能性的设计往往是组合逻辑颇多,而为了更好的满足时序约束,往往需要添加寄存器来优化时序,单独处理或许并不显得复杂,但当把两者混在一块儿便极易“按起葫芦浮起瓢”,导致设计功能性错误了。倘若纠缠不清令人头大,那一别两宽呢?把功能逻辑和为了优化时序的pipeline分开岂不是设计极其简单。

》》Stream pipeline

Stream的pipeline处理在SpinalHDL里提供了很好的封装:

pYYBAGLyAiKATTnJAACkV2_B_dY034.png

Stream接口的pipeline里有三种类型:

m2sPipe: 为两个Stream接口之间的valid,payload之间添加一级寄存器。

s2mPipe:为两个Stream接口之间的ready路径添加一级寄存器。

s2mPipe().m2sPipe():在两个Stream接口之间的valid,payload、ready之间均添加一级寄存器。

上面的三种接口pipeline方式能够很好的满足接口中的时序优化。SpinalHDL里也提供了相应简单的连接符(箭头指向谁谁就是目的端)。关于这里面的源代码分析可参见文章《打个拍,握个手可以么》。

》》功能处理

有了前面Stream接口的pipeline方式,在Stream接口信号中的处理功能性逻辑时,我们便可以采用组合逻辑的方式进行处理。举个简单的例子,在逻辑设计里对输入的Stream信号中的payload如果大于0x80加1输出,小于0x80减1输出。那么这里便可以仅以组合逻辑的形式进行处理:

pYYBAGLyAj6ABHgvAAB4mVS2_oE958.png

在上面的逻辑处理里,整个设计均采用组合逻辑的形式进行处理。

》》合二为一

有了上面的那些,那么合二为一便很容易了。功能处理采用组合逻辑,时序处理采用pipeline。“一别两宽”之后,合二为一便好了:



》》写在最后

就个人使用来讲,在SpinalHDL的设计里,这种方式极大的简化了电路设计的复杂度。理解了Stream的使用,那么对于SpinalHDL中lib的大多数功能也能够有一个很好的了解与使用。


审核编辑:刘清

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

    关注

    30

    文章

    5028

    浏览量

    117712
  • AMBA
    +关注

    关注

    0

    文章

    67

    浏览量

    14811
  • 数字逻辑电路

    关注

    0

    文章

    65

    浏览量

    15649
收藏 人收藏

    评论

    相关推荐

    浅析SpinalHDL中Pipeline中的复位定制

    之前有系列文章介绍SpinalHDL中Pipeline的使用,最近在一个功能模块中真实的使用了这个lib。
    的头像 发表于 03-17 17:31 559次阅读
    浅析<b class='flag-5'>SpinalHDL</b>中Pipeline中的复位定制

    2024中国云计算大分野:重回当年,还是走向未来?

    从你追我赶,到一别两宽
    的头像 发表于 03-04 09:47 1816次阅读

    #2024,立Flag了嘛? #在win平台搭建SpinalHDL开发环境

    ,这个步需要勾选红框的这项; 对应的IDEA的插件安装Scala和SBT: Scala插件安装: SBT插件安装 2.2、JDK安装 直接到JDK官网下载安装包下载即可: JD
    发表于 01-21 10:52

    6SE70变频器控制字的OFF1/OFF2/OFF3分表示什么意思呀?

    6SE70变频器控制字的OFF1/OFF2/OFF3分表示什么意思呀?每般现场控制都怎么应用!!
    发表于 12-21 08:03

    请问片AD2S1210分采集到的速度数据能向位置数据那样进行粗精组合吗?

    片AD2S1210来对个双通道多极旋变信号进行解码,请问片AD2S1210分采集到的速度数据能向位置数据那样进行粗精组合吗?如果能这样那就能提高速度检测的精度。谢谢!
    发表于 12-13 07:31

    SpinalHDL 1.9.4版本中的PackedBundle、PackedWordBundle的使用

        聊一聊SpinalHDL 1.9.4版本中的PackedBundle、PackedWordBundle的使用 位域的提取与封装     在逻辑设计里,但凡牵涉到协议,一般都避免不了协议字段
    的头像 发表于 11-11 15:35 828次阅读
    <b class='flag-5'>SpinalHDL</b> 1.9.4版本中的PackedBundle、PackedWordBundle的使用

    pipeline高端玩法—优先级介绍

    无论是SystemVerilog还是SpinalHDL,都有Last valid assignment wins的语法特征。如在SpinalHDL-Doc中所描述
    的头像 发表于 11-04 10:13 379次阅读
    pipeline高端玩法—优先级<b class='flag-5'>介绍</b>

    IAR调试不同复位类型的介绍

    IAR调试不同复位类型的介绍在IAR 环境下调试有不同的复位类型,其中些只复位内核不复位MCU 外设的复位方式在特定情况下可能会造成仿真问题
    发表于 10-19 07:54

    SpinalHDL Simulation性能提升测试

    昨晚看SpinalHDL的Issues,其中有一个关于性能提升的case 吸引到了我,尝试实验到深夜,测试下在SpinalHDL以及cocotb下的性能优化手段。
    的头像 发表于 08-06 17:10 416次阅读
    <b class='flag-5'>SpinalHDL</b> Simulation性能提升测试

    spinalhdl转Verilog可读性 SpinalHDL开发流程

    SpinalHDL是基于Scala全新的硬件描述语言,解决了不少Verilog等传统HDL语言的痛点,可以快速的完成某些IP的开发,和完美的融入现有的开发流程。 诚然SpinalHDL的学习路线
    的头像 发表于 07-27 09:29 857次阅读
    <b class='flag-5'>spinalhdl</b>转Verilog可读性 <b class='flag-5'>SpinalHDL</b>开发流程

    原来SpinalHDL中BlackBox封装数组接口如此简单

    当在SpinalHDL中调用别人的RTL代码时,需要采用BlackBox进行封装。对于大多数场景,想必小伙伴们都已轻车熟路。今天着重来看下当RTL代码的接口中存在数组形式的接口时如何处理。
    的头像 发表于 05-22 10:04 444次阅读
    原来<b class='flag-5'>SpinalHDL</b>中BlackBox封装数组接口如此简单

    SpinalHDL语法之Bool类型

    作为SpinalHDL语法篇的第一节,我们也从最简单的开始。 Bool类型定义
    的头像 发表于 05-05 16:01 388次阅读

    SpinalHDL入坑之旅

    可以下载scala的安装包,然后进行安装,方式如下:(但我没有安装成功) scala下载地址:必须要安装2.11.xx,这里我们安装2.11.12,下载地址如下:
    的头像 发表于 05-05 15:57 414次阅读
    <b class='flag-5'>SpinalHDL</b>入坑之旅

    简述开关式稳压电源的工作原理

    开关式稳压电源接控制方式分为调宽式和调频式两种,在实际的应用中,调宽式使用得较多,在目前开发和使用的开关电源集成电路中,绝大多数也为脉宽调制型。因此下面就主要介绍
    的头像 发表于 05-04 15:29 1106次阅读

    SpinalHDL BlackBox时钟与复位

    SpinalHDL中使用之前已有的Verilog等代码的时候需要将这些代码包在一个BlackBox里面,但是如果这些代码里面有时钟和复位,我们需要怎么将时钟和复位端口和SpinalHDL中已有的时钟域连接起来呢?
    的头像 发表于 05-04 11:13 508次阅读
    <b class='flag-5'>SpinalHDL</b> BlackBox时钟与复位