2 / 63 · 概念
数体系と固定幅の表現
基数変換にとどまらず、表現範囲・必要なビット数・切り捨てによる誤差を計算します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
このコースの出発点
高校程度の代数と基礎的なプログラミング経験を推奨します。二進数とブール代数ブール代数 0 と 1、AND・OR・NOT を扱う代数です。加算記号は通常 OR を表すので、整数の足し算とは規則が異なります。詳しく見るはコース内で整理し、大学初級のデジタル論理設計の水準でテンポよく進めます。公式の暗記より、入力条件・ビット幅・観測時点を定め、例で検証することに集中してください。
ビット列と値を区別します
回路が記憶するのは有限のビット列です。それを整数、符号付きの値、固定小数点固定小数点 小数点位置をあらかじめ固定し、整数のビット列に一定の倍率を適用する数の表現です。幅・符号・小数部のビット数を合わせて定めます。詳しく見るのどれとして解釈するかは、設計の取り決めで定めます。この講義では整数演算と累乗を知っていることを前提に、RTL で必要な範囲計算に進みます。
ビットの unsignedunsigned ビット列を非負整数として解釈する規則です。n ビットの範囲は 0 から 2^n−1 で、同じビット列の signed 解釈と異なる場合があります。 値は次のように解釈します。
10110110 は です。4 ビットずつまとめると B6 なので、8'hB6 と 8'b10110110 は同じビット列です。16 進数の一桁は常に 4 ビットを表すため、アドレス・マスク・波形を読むときに素早く変換できます。
ビット列は同じでも、解釈は変わります
下の b7 を切り替えてみてください。unsigned として解釈すると桁の重み 128 が加わりますが、2 の補数2 の補数 固定幅のビット列で符号付き整数を表す方式です。n ビットの範囲は −2^(n−1) から 2^(n−1)−1 です。詳しく見るでは最上位ビットの重みは −128 です。まず 0x7F と 0x80 を作り、二つの解釈の境界を比較してください。
10110110 → unsigned 182 · signed -74 · hex 0xB6
ビット列を変えることと、signed として解釈することは別の操作です。回路の幅が同じ 8 ビットでも、演算子に渡す符号情報によって比較結果は変わります。
まず範囲、その後にビット幅
異なる 個の状態を区別するのに必要な最小ビット数は次のとおりです。
0 から 999 まで数えるには 1000 個の値を表すので 10 ビット必要です。0 から 1024 までは 1025 個なので 11 ビットです。最大値と状態数を混同すると、ちょうど境界で 1 ビット不足します。RTL を までパラメータ化する場合は、0 ビットのベクトルが生じないよう、幅を最小 1 に制限する必要があります。
狭い信号に格納するとどうなるか
上位ビットを捨て、 ビットだけ残す unsigned の格納は、剰余演算です。
例えば 9 ビットの計算結果 300 を 8 ビットに格納すると、44 が残ります。これは丸めでも飽和でもありません。飽和演算が必要なら、範囲超過を検出し最大値を選ぶ回路を別途設計します。
logic [7:0] a, b, low;
logic [8:0] full_sum;
assign full_sum = {1'b0, a} + {1'b0, b};
assign low = full_sum[7:0];両方のオペランドを先に拡張したので、キャリーまで保存する意図が明確です。基数表記だけで符号や結果幅も決まると考えないでください。波形の解釈には 幅・符号・基数がすべて必要です。
自分で考えてみましょう
0 から 4095 まで数える値と、4096 まで数える値には、それぞれ何ビット必要でしょうか。8 ビット unsigned に 511 を格納すると何が残りますか。
解説を見る
最初の範囲は 個なので 12 ビット、次は 4097 個なので 13 ビットです。 なので格納値は 8'hFF です。これだけでオーバーフローがなかったとは判断できません。