Verilog語法--位選擇運(yùn)算(+: 和 -:)
verilog語法中使用以下兩個(gè)運(yùn)算符可以簡化我們的位選擇代碼
+:
-:
這兩個(gè)的用法如下
wire[7:0]a; a[base_addr+:width] a[base_addr-:width]
其中base_addr指的是起始選擇位,width指的是選擇的位寬
比如以下使用說明
wire[31:0]a; a[0+:8]等價(jià)于a[7:0] a[0+:16]等價(jià)于a[15:0] a[16+:8]等價(jià)于a[23:16] a[7-:8]等價(jià)于a[7:0] a[15-:16]等價(jià)于a[15:0] a[15-:2]等價(jià)于a[15:14]
這樣寫有什么好處呢,比如下面兩個(gè)使用場景
假設(shè)有一個(gè)128bit的數(shù)據(jù),怎么方便的將其分割為16個(gè)8bit的數(shù)據(jù)
對一個(gè)32比特的數(shù)據(jù)進(jìn)行按字節(jié)的大小端翻轉(zhuǎn)
問題一
假設(shè)有一個(gè)128bit的數(shù)據(jù),怎么方便的將其分割為16個(gè)8bit的數(shù)據(jù)
如果要解決上面的問題,我們可以直接手動(dòng)的進(jìn)行位選擇,代碼如下:
`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里面的每一個(gè)元素都從a里面進(jìn)行截取,如果bit數(shù)比較少的話,可以按上述代碼這樣完成,但是這個(gè)代碼看著也很啰嗦,所以可以按照下面的代碼進(jìn)行改進(jìn)
`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)的方式會(huì)很方便,以后即使位寬改變了,也僅僅只是在for循環(huán)這邊改一下就好
問題二
對一個(gè)32比特的數(shù)據(jù)進(jìn)行按字節(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)位寬比較小的時(shí)候可以按上面的方式進(jìn)行,如果位寬比較大的話,上面的這種方法就顯得很冗余了,我們就可以使用位選擇的方式來進(jìn)行賦值
`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文章
1339瀏覽量
109880 -
代碼
+關(guān)注
關(guān)注
30文章
4700瀏覽量
68108 -
語法
+關(guān)注
關(guān)注
0文章
43瀏覽量
9751 -
運(yùn)算符
+關(guān)注
關(guān)注
0文章
169瀏覽量
11036
原文標(biāo)題:Verilog語法--位選擇運(yùn)算(+: 和 -:)
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論