Verilog語法--位選擇運算(+: 和 -:)
verilog語法中使用以下兩個運算符可以簡化我們的位選擇代碼
+:
-:
這兩個的用法如下
wire[7:0]a; a[base_addr+:width] a[base_addr-:width]
其中base_addr指的是起始選擇位,width指的是選擇的位寬
比如以下使用說明
wire[31:0]a; a[0+:8]等價于a[7:0] a[0+:16]等價于a[15:0] a[16+:8]等價于a[23:16] a[7-:8]等價于a[7:0] a[15-:16]等價于a[15:0] a[15-:2]等價于a[15:14]
這樣寫有什么好處呢,比如下面兩個使用場景
假設(shè)有一個128bit的數(shù)據(jù),怎么方便的將其分割為16個8bit的數(shù)據(jù)
對一個32比特的數(shù)據(jù)進行按字節(jié)的大小端翻轉(zhuǎn)
問題一
假設(shè)有一個128bit的數(shù)據(jù),怎么方便的將其分割為16個8bit的數(shù)據(jù)
如果要解決上面的問題,我們可以直接手動的進行位選擇,代碼如下:
`timescale1ns/1ps moduletb( ); wire[127:0]a; wire[7:0]b[15:0]; assigna={8'd1,8'd2,8'd3,8'd4,8'd5,8'd6,8'd7,8'd8,8'd9,8'd10,8'd11,8'd12,8'd13,8'd14,8'd15,8'd16}; assignb[0]=[7:0]; assignb[1]=[15:8]; assignb[2]=[23:16]; assignb[3]=[31:24]; assignb[4]=[39:32]; assignb[5]=[47:40]; assignb[6]=[55:48]; assignb[7]=[63:56]; assignb[8]=[71:64]; assignb[9]=[79:72]; assignb[10]=[87:80]; assignb[11]=[95:88]; assignb[12]=[103:96]; assignb[13]=[111:104]; assignb[14]=[119:112]; assignb[15]=[127:120]; endmodule
為了方便觀察,我們將a的值賦值為1到16的特殊值,下面b里面的每一個元素都從a里面進行截取,如果bit數(shù)比較少的話,可以按上述代碼這樣完成,但是這個代碼看著也很啰嗦,所以可以按照下面的代碼進行改進
`timescale1ns/1ps moduletb( ); wire[127:0]a; wire[7:0]b[15:0]; genvari; assigna={8'd1,8'd2,8'd3,8'd4,8'd5,8'd6,8'd7,8'd8,8'd9,8'd10,8'd11,8'd12,8'd13,8'd14,8'd15,8'd16}; generate for(i=0;i16;?i?=?i+1)?begin ????????assign?b[i]?=?a[(i*8)?+:?8]; ????end endgenerate endmodule
可以看到使用位選擇加for循環(huán)的方式會很方便,以后即使位寬改變了,也僅僅只是在for循環(huán)這邊改一下就好
問題二
對一個32比特的數(shù)據(jù)進行按字節(jié)的大小端翻轉(zhuǎn)
最直接的代碼可以按下面這樣寫
`timescale1ns/1ps moduletb( ); wire[31:0]a; wire[31:0]b; assigna={8'd1,8'd2,8'd3,8'd4}; assignb={a[7:0],a[8:15],a[23:16],a[31:24]}; endmodule
當(dāng)位寬比較小的時候可以按上面的方式進行,如果位寬比較大的話,上面的這種方法就顯得很冗余了,我們就可以使用位選擇的方式來進行賦值
`timescale1ns/1ps moduletb( ); wire[31:0]a; wire[31:0]b; genvari; assigna={8'd1,8'd2,8'd3,8'd4}; generate for(i=0;i4;?i?=?i?+?1)?begin ????????assign?b[(4?-?i)?*?8?-?1?-:?8]?=?a[i?*?8?+:?8]; ????end endgenerate endmodule
可以看到正確的完成了我們的需求
-
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109931 -
代碼
+關(guān)注
關(guān)注
30文章
4726瀏覽量
68248 -
語法
+關(guān)注
關(guān)注
0文章
44瀏覽量
9772 -
運算符
+關(guān)注
關(guān)注
0文章
171瀏覽量
11052
原文標(biāo)題:Verilog語法--位選擇運算(+: 和 -:)
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論