作為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
+關注
關注
8文章
327瀏覽量
47340 -
語法
+關注
關注
0文章
44瀏覽量
9785
發布評論請先 登錄
相關推薦
STM32如何去使用bool類型
Q:STM32 如何使用bool類型?通常進行stm32相關編程的時候,bool類型表現更加直白,但編程過程中又不能直接使用,就可以參照工程中的頭文件進行添加定義。如:stm32f10
發表于 08-04 08:10
bool定義的類型
[]bool定義的類型只有真和假兩種值。[]Static申明的局部變量,存儲在靜態存儲區。靜態局部變量的初始化語句塊第一次執行起作用。在隨后的運行過程中,變量將保持上一次執行的值。[]枚舉
發表于 08-12 07:11
程序中使用到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里實現優雅的添加待跟蹤波形信號
的RTL代碼添加個原語約束也很容易,但學會了SpinalHDL怎么可以這么做呢,在SpinalHDL里,我們可以同樣實現。SpinalHDL提供了addAttribute語法來幫助我們
發表于 06-22 14:37
在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中Bundle數據類型的轉換
SpinalHDL中Bundle與SystemVerilog中的packed struct很像,在某些場景下,與普通數據類型之間的連接賦值可以通過asBits,assignFromBits來實現。
評論