iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Software Development

數位 IC 設計起手式系列 第 7

Day 07: 線路的拆與合

  • 分享至 

  • xImage
  •  

Vector 其實比我們想像的靈活,上一篇我們提到的 vector 在一開始就將線路綑綁完成了,那如果我們想要把線路拆解或是組合成更龐大的 vector 又該怎麼做呢?

線路拆解

不知道大家還記不記得我們怎麼宣告 vector 的? 語法是這樣的: wire [ MSB : LSB ]

那麼線路拆解是什麼意思呢?不就是取一部分的線路嗎?舉個例子說明:

wire [7:0] a;
wire [3:0] b;
wire [5:0] c;

assign a = 8'ha9;       // 令 a 為 0d169 或 0b10101001
assign b = a[6:3];      // b 為 a 的第 6 到第 3 個位元,即 0b0101
assign c[5:4] = a[1:0]; // c 為 a, b 的組合
assign c[3:0] = b;      // c 的數值為 0b010101

相同的,我們還是以左邊表示 MSB ,右邊表示 LSB。如此一來,我們就可以隨意分解 vector ,並用於其他處。

線路組合

關於線路的組合,我們要介紹一個 Verilog 的 concatenation operator { } ,翻成中文是接合運算子。
這個運算子的功用就是接合多條或多段線路,我們經常和線路拆解合併使用。舉個例子說明:

wire [3:0] a, b;
wire [5:0] c;
wire [1:0] d, e;
assign a = 4'b1101;
assign b = 4'b0001;
assign c = {a[3:2], b[1:0], a[1:0]};  // 重組 a, b 並賦值給 c
assign {d, e} = a;                    // 將 a 分配給 d, e

特別注意的是 { } 的內容物同樣滿足左邊為 MSB ,而右邊為 LSB 的原則。初學者容易因為重組而誤判 MSB 和 LSB 的擺放位置。

線路複製

當我們在賦值時,常常會發現有重複出現的線路組合,如:10'b1111111111
處理這種線路有沒有速解法?其實是有的。

我們要介紹一個新的運算子,叫做 replication operator {number {vector} } ,簡單來說就是我們將會複製 number 次的 vector 。舉一些簡單的例子:

wire [7:0] a, b;
assign a = {8 {1'b1} };     // a = 8'b11111111
assign b = {4 {2'b10} };    // b = 8'b10101010

綜合例題:Sign Extension

稍微進階一點,我們來實作 8 位元到 32 位元的符號延伸 (sign extension) 。

Sign Extension 是什麼?
假設我們有一個 a 位元的有號數,我們想要用 b 位元的空間來儲存這個有號數,且 b > a。
我們會用 a 位元的這個數的 MSB 來去補滿 b 位元中多餘的空間。

舉個例子:
對有號數 1010 (即十進位的 -6 ) 做符號延伸為 8 位元,結果會是 11111010

wire [7:0] v;                    // 假設 v 已經被指定為某一個有號數
wire [31:0] w;                   // 題目:請對 v 作符號延伸,並將結果儲存於 w
assign w = { {24{v[7]}} , v };   // v[7] 為有號數的 MSB ,透過它來補足多餘的空間

上一篇
Day 06: Vector 的出現
下一篇
Day 08: 第一個 Verilog 模組
系列文
數位 IC 設計起手式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言