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

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

3天内不再提示

SpinalHDL语法之Bool类型

jf_78858299 来源:傅里叶的猫 作者: 张大侠 2023-05-05 16:01 次阅读

作为SpinalHDL语法篇的第一节,我们也从最简单的开始。

Bool类型定义

Bool类型就是Verilog中的单bit类型,定义方式如下:

Syntax Description Return
Bool() 创建Bool类型变量 Bool
True 创建Bool类型变量,并赋值true Bool
False 创建Bool类型变量,并赋值false Bool
Bool(value: Boolean) 创建Bool类型变量,并使用Scala表达式赋值 Bool

Example:

val a = Bool()
val b = True
val c = False
val d = Bool( 1 > 2)

生成的Verilog代码如下:

wire                a;
wire                b;
wire                c;
wire                d;

assign b = 1'b1;
assign c = 1'b0;
assign d = 1'b0;

逻辑运算

下图为官方的逻辑运算解释,也不翻译了,很容易理解。

Operator Description Return type
!x Logical NOT Bool
x && y Logical And Bool
x & y Logical And Bool
x y
x y Logical OR
x ^ y Logical XOR Bool
x.set[()] Set x to True Bool
x.clear[()] Set x to False Bool
x.setWhen(cond) Set x when cond is True Bool
x.clearWhen(cond) Clear x when cond is True Bool
x.riseWhen(cond) Set x when x is False and cond is True Bool
x.fallWhen(cond) Clear x when x is True and cond is True Bool
val e = a & b
  val f = a | b
  val g = a ^ b
  val h = !a

  val i = Bool()
  i.set()
  val j = Bool()
  j.clear()

  val k = True #这里必须有初值,否则下一句会报错
  k.clearWhen(b)

  val l = True
  when(b){
    l := False
  }

  val m = RegInit(False) #关于寄存器类型,这里先熟悉一下,后面章节会讲到
  m.riseWhen(b)

边缘检测

Operator Description Return type
x.edge[()] Return True when x changes state Bool
x.edge(initAt: bool) Same as x.edge but with a reset value Bool
x.rise[()] Return True when x was low at the last cycle and is now high Bool
x.rise(initAt: Bool) Same as x.rise but with a reset value Bool
x.fall[()] Return True when x was high at the last cycle and is now low Bool
x.fall(initAt: Bool) Same as x.fall but with a reset value Bool
x.edges[()] Return a bundle (rise, fall, toggle) BoolEdges
x.edges(initAt: Bool) Same as x.edges but with a reset value BoolEdges
val a = Bool()
val b = False
when(a.edge()){
b := True
}
val c = a.edge(False)

转换后的代码为:

module DemoBool (
  input               clk,
  input               reset
);

  wire                a;
  reg                 b;
  reg                 a_regNext;
  wire                when_DemoBool_l35;
  reg                 a_regNext_1;
  wire                c;

  always @(*) begin
    b = 1'b0;
    if(when_DemoBool_l35) begin
      b = 1'b1;
    end
  end

  assign when_DemoBool_l35 = (a ^ a_regNext);
  assign c = (a ^ a_regNext_1);
  always @(posedge clk) begin
    a_regNext <= a;
  end

  always @(posedge clk or posedge reset) begin
    if(reset) begin
      a_regNext_1 <= 1'b0;
    end else begin
      a_regNext_1 <= a;
    end
  end

endmodule
val edgeBundle = myBool_2.edges(False)
when(edgeBundle.rise) {
    // do something when a rising edge is detected
}
when(edgeBundle.fall) {
    // do something when a falling edge is detected
}
when(edgeBundle.toggle) {
    // do something at each edge
}

数值比对

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

    关注

    8

    文章

    323

    浏览量

    47104
  • 语法
    +关注

    关注

    0

    文章

    40

    浏览量

    9669
收藏 人收藏

    评论

    相关推荐

    spinalhdl转Verilog可读性 SpinalHDL开发流程

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

    STM32如何去使用bool类型

    Q:STM32 如何使用bool类型?通常进行stm32相关编程的时候,bool类型表现更加直白,但编程过程中又不能直接使用,就可以参照工程中的头文件进行添加定义。如:stm32f10
    发表于 08-04 08:10

    bool定义的类型

    []bool定义的类型只有真和假两种值。[]Static申明的局部变量,存储在静态存储区。静态局部变量的初始化语句块第一次执行起作用。在随后的运行过程中,变量将保持上一次执行的值。[]枚举
    发表于 08-12 07:11

    请问一下STM32是如何使用bool类型

    STM32是如何使用bool类型的?怎样进行stm32相关编程呢?
    发表于 10-18 06:03

    请问在C语言中如何使用bool类型

    在C语言中如何使用bool类型
    发表于 10-22 07:20

    程序中使用到bool类型,但编译时提示类型未定义的原因?

    如果程序中使用到bool类型,但编译时提示类型未定义,这个时候可在头文件中加入下面一句:typedef enum {FALSE = 0,TRUE = 1} bool
    发表于 12-24 08:11

    SpinalHDL里switch方法有何用处呢

    可以更快速高效的实现tkeep到byteCnt的转换:SpinalHDL在生成RTL时,仅SpinalHDL提供的语法会生成RTL电路,而其他代码则是起指导生成电路的作用,在上面代码里
    发表于 06-22 14:25

    SpinalHDL中定义各种各样的复合数据类型

    通过继承Bundle,在SpinalHDL中我们可以定义各种各样的复合数据类型。今天,关于Bundle的几个容易被忽略的点,一同来看下。》Bundle个人在使用SpinalHDL来描述电路时,凡是
    发表于 06-28 15:21

    SpinalHDL中关于casez的使用

    我们常常采用?表示我们不关心的位,而在SpinalHDL中,也存在这么一种表示方式。SpinalHDL整体的数据结构如下图所示:针对BitVector及其子类,SpinalHDL定义了一种特殊的
    发表于 07-06 10:59

    就Bits数据类型的初始化及使用方式做一个总结

    Bits:初始化Bits意味这一组有Bool类型组成的向量,类似与我们在Verilog中的多比特位宽变量。在SpinalHDL中,声明一个Bits变量可采用如下形式(“[]”中为可选项):相较于
    发表于 07-12 16:31

    SpinalHDL的UInt与SInt数据类型能够进行有符号/无符号数操作

    在Bits的基础上,SpinalHDL提供了UInt、SInt数据类型,从而能够进行有符号/无符号数操作。变量定义/初始化UInt/SInt的初始化与Bits类型相似:逻辑操作符UInt/SInt
    发表于 07-14 14:45

    SpinalHDL中Bundle与普通数据类型之间的连接赋值转换

    SpinalHDL中Bundle与SystemVerilog中的packed struct很像,在某些场景下,与普通数据类型之间的连接赋值可以通过asBits,assignFromBits来实现
    发表于 10-18 14:22

    SpinalHDL中的对应关系及声明形式

    针对SpinalHDL中的两大类型Reg、Wire,来梳理下在SpinalHDL中的对应关系及声明形式。
    的头像 发表于 07-03 11:02 1155次阅读

    SpinalHDL中Bundle数据类型的转换

    SpinalHDL中Bundle与SystemVerilog中的packed struct很像,在某些场景下,与普通数据类型之间的连接赋值可以通过asBits,assignFromBits来实现。
    的头像 发表于 10-17 09:51 999次阅读

    SpinalHDL语法篇之Bool类型

    作为SpinalHDL语法篇的第一节,我们也从最简单的开始。
    的头像 发表于 10-31 10:56 944次阅读