0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpinalHDL語法之Bool類型

jf_78858299 ? 來源:傅里葉的貓 ? 作者: 張大俠 ? 2023-05-05 16:01 ? 次閱讀

作為SpinalHDL語法篇的第一節(jié),我們也從最簡單的開始。

Bool類型定義

Bool類型就是Verilog中的單bit類型,定義方式如下:

Syntax Description Return
Bool() 創(chuàng)建Bool類型變量 Bool
True 創(chuàng)建Bool類型變量,并賦值true Bool
False 創(chuàng)建Bool類型變量,并賦值false Bool
Bool(value: Boolean) 創(chuàng)建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) #關(guān)于寄存器類型,這里先熟悉一下,后面章節(jié)會講到
  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)

轉(zhuǎn)換后的代碼為:

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
}

數(shù)值比對

Operator Description Return type
x === y Equality Bool
x =/= y Inequality Bool
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HDL
    HDL
    +關(guān)注

    關(guān)注

    8

    文章

    327

    瀏覽量

    47392
  • 語法
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    9818
收藏 人收藏

    評論

    相關(guān)推薦

    STM32如何去使用bool類型

    Q:STM32 如何使用bool類型?通常進行stm32相關(guān)編程的時候,bool類型表現(xiàn)更加直白,但編程過程中又不能直接使用,就可以參照工程中的頭文件進行添加定義。如:stm32f10
    發(fā)表于 08-04 08:10

    bool定義的類型

    []bool定義的類型只有真和假兩種值。[]Static申明的局部變量,存儲在靜態(tài)存儲區(qū)。靜態(tài)局部變量的初始化語句塊第一次執(zhí)行起作用。在隨后的運行過程中,變量將保持上一次執(zhí)行的值。[]枚舉
    發(fā)表于 08-12 07:11

    請問一下STM32是如何使用bool類型

    STM32是如何使用bool類型的?怎樣進行stm32相關(guān)編程呢?
    發(fā)表于 10-18 06:03

    請問在C語言中如何使用bool類型?

    在C語言中如何使用bool類型?
    發(fā)表于 10-22 07:20

    程序中使用到bool類型,但編譯時提示類型未定義的原因?

    如果程序中使用到bool類型,但編譯時提示類型未定義,這個時候可在頭文件中加入下面一句:typedef enum {FALSE = 0,TRUE = 1} bool;
    發(fā)表于 12-24 08:11

    SpinalHDL里switch方法有何用處呢

    可以更快速高效的實現(xiàn)tkeep到byteCnt的轉(zhuǎn)換:SpinalHDL在生成RTL時,僅SpinalHDL提供的語法會生成RTL電路,而其他代碼則是起指導(dǎo)生成電路的作用,在上面代碼里
    發(fā)表于 06-22 14:25

    SpinalHDL里實現(xiàn)優(yōu)雅的添加待跟蹤波形信號

    的RTL代碼添加個原語約束也很容易,但學(xué)會了SpinalHDL怎么可以這么做呢,在SpinalHDL里,我們可以同樣實現(xiàn)。SpinalHDL提供了addAttribute語法來幫助我們
    發(fā)表于 06-22 14:37

    SpinalHDL中定義各種各樣的復(fù)合數(shù)據(jù)類型

    通過繼承Bundle,在SpinalHDL中我們可以定義各種各樣的復(fù)合數(shù)據(jù)類型。今天,關(guān)于Bundle的幾個容易被忽略的點,一同來看下?!稡undle個人在使用SpinalHDL來描述電路時,凡是
    發(fā)表于 06-28 15:21

    SpinalHDL中關(guān)于casez的使用

    我們常常采用?表示我們不關(guān)心的位,而在SpinalHDL中,也存在這么一種表示方式。SpinalHDL整體的數(shù)據(jù)結(jié)構(gòu)如下圖所示:針對BitVector及其子類,SpinalHDL定義了一種特殊的
    發(fā)表于 07-06 10:59

    就Bits數(shù)據(jù)類型的初始化及使用方式做一個總結(jié)

    Bits:初始化Bits意味這一組有Bool類型組成的向量,類似與我們在Verilog中的多比特位寬變量。在SpinalHDL中,聲明一個Bits變量可采用如下形式(“[]”中為可選項):相較于
    發(fā)表于 07-12 16:31

    SpinalHDL的UInt與SInt數(shù)據(jù)類型能夠進行有符號/無符號數(shù)操作

    在Bits的基礎(chǔ)上,SpinalHDL提供了UInt、SInt數(shù)據(jù)類型,從而能夠進行有符號/無符號數(shù)操作。變量定義/初始化UInt/SInt的初始化與Bits類型相似:邏輯操作符UInt/SInt
    發(fā)表于 07-14 14:45

    SpinalHDL中Bundle與普通數(shù)據(jù)類型之間的連接賦值轉(zhuǎn)換

    SpinalHDL中Bundle與SystemVerilog中的packed struct很像,在某些場景下,與普通數(shù)據(jù)類型之間的連接賦值可以通過asBits,assignFromBits來實現(xiàn)
    發(fā)表于 10-18 14:22

    SpinalHDL中的對應(yīng)關(guān)系及聲明形式

    針對SpinalHDL中的兩大類型Reg、Wire,來梳理下在SpinalHDL中的對應(yīng)關(guān)系及聲明形式。
    的頭像 發(fā)表于 07-03 11:02 ?1569次閱讀

    SpinalHDL中Bundle數(shù)據(jù)類型的轉(zhuǎn)換

    SpinalHDL中Bundle與SystemVerilog中的packed struct很像,在某些場景下,與普通數(shù)據(jù)類型之間的連接賦值可以通過asBits,assignFromBits來實現(xiàn)。
    的頭像 發(fā)表于 10-17 09:51 ?1331次閱讀

    SpinalHDL語法Bool類型

    作為SpinalHDL語法篇的第一節(jié),我們也從最簡單的開始。
    的頭像 發(fā)表于 10-31 10:56 ?1250次閱讀