上一篇提到一條 wire 最多表示兩種數值,那麼如果要表示更多數值,我們需要使用 vector 。
Vector 是什麼呢?中文翻譯叫向量,但是向量可能沒那麼好理解,他其實就是多條線路的綑綁。
既然 vector 是多條線的綑綁,那麼我們要怎麼知道各個線路代表的數值呢?
抑或是我們要怎麼賦值給其中的某一條線路?
我們先介紹 MSB 和 LSB 吧!
MSB 是 Most Significant Bit 的縮寫,而 LSB 是 Least Significant Bit 的縮寫。
以一個二進位的 39 來說好了。 39 以二進位表示是 100111 ,最左邊的位元稱之為 MSB ,因為 MSB 越大,整體數值會越來越大,代表著他的重要性 (Significant) ; 相反的,最右邊的位元稱之為 LSB ,因為他的改變對整體數值來說是最微乎其微的。
為什麼我們需要知道 MSB 和 LSB 呢?因為定義了這兩個數值後,我們可以在一組線路中知道方向性。
Vector 其實就是很多個 wire 的綑綁,因此宣告與賦值的過程其實大致相同。
我們以 39 作為 vector 中存入的數值,因為進制的選用不同,相同的數字可以用不同的方式表示。
wire [5:0] a, b, c, d;
assign a = 6'b100111;
assign b = 6'o47;
assign c = 6'd39;
assign d = 6'h27;
說明一下上方的程式碼:
wire [ MSB : LSB ]
'
前的數字代表的是該數字所需的位元,而不是在該進制下需要幾個數字來表示。因此 b, c, d 的第一個數字為 6 ,而非 2 。為什麼是宣告 6 條線路?多或少可以嗎?
少自然是不行,因為你無法在少於 6 位元的情況下完整表達 39。多是可以的喔!因為多餘的位元可以用 0 來表示,同時也可以完整表達這個數字。但是要特別注意,如果我們想使用 8 位元來表達該數,型別應宣告為 wire [7:0]
或是等價的表示,如 wire [8:1]
等。
wire [ LSB : MSB ]
這樣宣告可以嗎?
其實也沒有不行,但是我們必須確保整份程式碼都用相同的規範,即 wire [ LSB : MSB ]
或 wire [ MSB : LSB ]
。不過,按照常理,我們會以 wire [ MSB : LSB ]
為宣告的依據,因為在位元表示上 MSB 是最左邊的位元,而 LSB 是最右邊的位元。