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

    文章

    5377

    浏览量

    121396
  • C语言
    +关注

    关注

    180

    文章

    7616

    浏览量

    138007
  • 编程语言
    +关注

    关注

    10

    文章

    1951

    浏览量

    35054
收藏 人收藏

    评论

    相关推荐

    数组名之间可以直接赋值

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

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

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

    FPGA无芯片怎么进行HDMI信号输入

    FPGA 无外部PHY芯片情况下输出HDMI,目前是比较成熟的方案(外部电路需要转换成TMDS电平)。无PHY芯片情况下怎么进行HDMI信号
    的头像 发表于 10-24 18:11 1692次阅读
    FPGA无芯片怎么<b class='flag-5'>进行</b>HDMI<b class='flag-5'>信号</b>输入

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

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

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

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

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

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

    INA321放大器输出不了信号是怎么回事?如何解决?

    电路连接如上图,仿真TINA-Ti中进行的,放大倍数和结果都是可以的 但打板之后,信号输入之后,电路没有
    发表于 08-09 07:13

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

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

    浅析SpinalHDL中Pipeline中的复位定制

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

    cyusb3014将固件程序编程到SPI Flash中进行调试,系统会提示我重置设备怎么解决?

    你好,我现在想把我的固件程序编程到 SPI Flash 中进行调试。 但是,第一次烧录之后,如果我想再次烧录它,系统会提示我重置设备。 重置或关闭电源不允许我重新编程,但我想在每次编写固件时将其
    发表于 02-27 08:21

    mapgis如何给区属性赋值

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

    proteus属性赋值工具怎么用

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

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

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

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

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

    通过Bifaces生成的elf文件,如何在HighTec集成的UDE中进行仿真?

    通过Bifaces生成的elf文件,如何在HighTec集成的UDE中进行仿真?
    发表于 02-18 07:51