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

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

3天内不再提示

在SpinalHDL电路中进行信号的赋值

冬至配饺子 来源:Spinal FPGA 作者:玉骐 2022-07-28 18:16 次阅读

对于SpinalHDL电路描述,信号的赋值不免有些小伙伴带有些许迷茫,本篇抽丝剥茧,一块儿来梳理。

是val还是var?

先来看两个语法:

poYBAGLiYUaAerlMAAAxyFuFyMg400.png

对于变量a,声明为val,在对其进行第二次赋值时发现会报错,而声明为var的变量则正常。在Scala里,对于val和var的定义:

**val:不可变变量类型。

var:可变变量类型

这似乎与我们在其他语言中所接触的有些冲突,变量是不可变的为什么还叫变量呢?Scala是一门函数式编程语言,而在函数式编程里,其所倡导的往往是变量的赋值仅有一次,对于其他地方不会对该变量进行重新赋值,这也是引入val类型的原因,颇有些C语言中const类型的意味。

而下面的语句:

pYYBAGLiYVyAePMYAABN4KsGDp4153.png

这里变量c声明为val,其意味着c所指向的地址不可变更,但我们仍可以修改其指向的内容,这也正式为什么我们能对c(0)赋值,而无法再将c指向一个新声明的Array。

声明师=,赋值靠:=

有了上面的了解,再回到SpinalHDL电路描述里,我们在描述电路时,无论是寄存器还是Mem、这些都是电路对象,其声明有且仅应当只有一次,因而我们在定义变量时,往往这么来定义:

pYYBAGLiYW6AFeTiAAAS6hNzlwM758.png

在Scala里一切皆为class,这里我们声明a为一个UInt对象、b为一个RegNext(a)对象,即这里声明a、b均为8比特的寄存器,而寄存器本身一旦定义了是不可变的,为val类型。想一想倘若一会儿将a声明为8bit寄存器,一会儿声明为9比特寄存器,像Verilog中这么写:

pYYBAGLiYYKAE1_nAAARNt06Qp4376.png

想必没人会在Verilog中这么来写吧。同理,在SpinalHDL里,我们声明一个电路对象时,自然是=。

虽然电路对象不可改,就像声明了a是8bit,其一定是8bit,但这8bit所代表的值是可以改变的!!!这也正是我们描述电路里的赋值。

SpinalHDL里为电路对象的赋值提供了三种形式:

pYYBAGLiYZeABewYAACSCwiQpKs514.png

我们是为电路对象所代表的值进行赋值,而不是改变电路对象本身(把电路对象指向另一个对象,想一想是否和上面Array的赋值有点儿类似),因而这里我们是不能用=(=在Scala中本身也是一个方法,是改变变量指向的位置,玩不可行),因而所要采用的是SpinalHDL中提供的:=或者\=来给电路对象所代表的含义进行赋值:

pYYBAGLiYauAKkVMAAAeLVny_28278.png

由于只有声明为Reg类型的变量才会被当成寄存器类型,这里即可放心使用“:=”。

小结

劝君莫惧Scala,我们在电路描述里用到的语法特性并不多,若有systemverilog的基础那么对于这类软件语言入门没那么可怕,毕竟又不是去转大数据不是么?


审核编辑:刘清

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

    关注

    31

    文章

    5336

    浏览量

    120257
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136713
  • 编程语言
    +关注

    关注

    10

    文章

    1942

    浏览量

    34711
收藏 人收藏

    评论

    相关推荐

    数组名之间可以直接赋值

    ;     return 0;} 想把数组 a 里面的数据全部赋值给 b,写成 b = a 行不行? 和这个问题类似的还有,数组名为什么不能进行 ++ 操作? char array[5] = {0};array++; 比如
    的头像 发表于 11-26 11:23 136次阅读

    ADS131M03的寄存器读写是要在转换触发的中断中进行配置,还是可以standby状态下进行

    我使用32位M4单片机,通过SPI总线与AD进行通信。 基本情况: ADC外接晶振8.192MHz,晶振信号板子上电后一直连着ADC的时钟引脚,片选信号通过单片机CS程序控制,SP
    发表于 11-13 07:08

    进行高速信号放大设计时,往往需要用到反馈电路,是否反馈电路越短越好?

    进行高速信号放大设计时,往往需要用到反馈电路,是否反馈电路越短越好,不同封装是否在这方面有不同优势?
    发表于 09-26 07:55

    使用霍尔效应传感器电子智能锁中进行位置感应应用说明

    电子发烧友网站提供《使用霍尔效应传感器电子智能锁中进行位置感应应用说明.pdf》资料免费下载
    发表于 09-12 14:03 0次下载
    使用霍尔效应传感器<b class='flag-5'>在</b>电子智能锁<b class='flag-5'>中进行</b>位置感应应用说明

    数字电路是对什么信号进行传输的

    数字电路是一种电子系统,它使用数字信号进行信息传输和处理。数字信号是由离散的电压水平或电流水平表示的信号,通常用二进制代码表示。与模拟
    的头像 发表于 08-11 11:00 744次阅读

    为什么指针之间不要随意赋值呢?

    指针之间也不能随意赋值
    的头像 发表于 03-28 17:13 654次阅读
    为什么指针之间不要随意<b class='flag-5'>赋值</b>呢?

    浅析SpinalHDL中Pipeline中的复位定制

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

    mapgis如何给区属性赋值

    进行数据分析和可视化。 MapGIS中给区属性赋值有多种方法,下面将详细介绍其中的几种常用方法。 1.手动赋值 手动赋值是最直接和简单的
    的头像 发表于 02-23 17:49 2247次阅读

    proteus属性赋值工具怎么用

    Proteus是一种电路设计和仿真软件,进行电路设计和仿真时,属性赋值是非常重要的步骤。属性赋值
    的头像 发表于 02-23 17:19 4579次阅读

    verilog同步和异步的区别 verilog阻塞赋值和非阻塞赋值的区别

    Verilog是一种硬件描述语言,用于设计和模拟数字电路Verilog中,同步和异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值和非阻塞
    的头像 发表于 02-22 15:33 1702次阅读

    G10指令可以对参数进行赋值,位型参数可以吗?

    G10指令可以对参数进行赋值,位型参数可以吗? G10指令是用于加工程序中进行参数赋值的指令。它可以用于指定数值型参数或位型参数。 首先,
    的头像 发表于 02-18 10:49 851次阅读

    用TC399Aurix development studio中进行裸机驱动调试,有些全局变量不能被正确赋值的原因?

    最近用TC399Aurix development studio中进行裸机驱动调试,编译器选择HeghTec,驱动库用的是TC399 iLLD,Aurix development studio
    发表于 02-05 06:04

    贴片电感和贴片磁珠的特性?如何在贴片电感和贴片磁珠中进行选择?

    贴片电感和贴片磁珠的特性有哪些?如何在贴片电感和贴片磁珠中进行选择 ? 贴片电感和贴片磁珠是电子元器件中常见的两种被动元件,它们电路中起到了稳压、滤波、隔离等关键作用。下面将详细介绍它们的特性
    的头像 发表于 02-03 14:49 755次阅读

    TC234boot中进行Deinit CANFD失败了的原因?

    大家好: 问题描述:项目已从启动切换到应用程序。 如果在应用程序中使用不同的 MO 并以相同的 ID 启动,则无法接收应用程序中的消息。 我本来希望 boot 中进行 Deinit CANFD,但我失败了。 预期的解决方案
    发表于 01-31 06:31

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

    %\\\\lib; 系统变量path的 值里面添加%JAVA_HOME%\\\\bin和%JRE_HOME%\\\\jre\\\\bin 至此,对应的开发所用的软件安装结束,对应的仿真和波形显示不再赘述; 还有就是要在SBT文件中进行改写: 到此就所有工作完成了。
    发表于 01-21 10:52