設定はこのような場面です.前回説明した加算回路出力Dが18bitであるが、RAMは16bitしかないので、bit削減してからRAMに書かなくちゃイケナイという場面.
Dの信号がフルbit振幅の正弦波だと仮定して波形を描いたのが下図です.
bit削減方法その1は赤いラインのように、下2bitを捨ててしまう方法があります.つまりverilogでは、
wire [15:0] E = D[17:2];
このように表記します.D[1:0]を消滅させます.分解能が悪化する副作用があります.
bit削減方法その2は青いラインのように、16bit2進数の表現範囲±32767を超えたエリアをクリップさせる方法です.すなわち18'h07FFFを超えさせなくする、かつ18'h38001を下回らせなくするという対処をしたいわけです.
:
18'h08001 7FFFにclip
18'h08000 7FFFにclip
18'h07FFF スルー
18'h07FFE スルー
:
18'h38001 スルー
18'h38000 8001にclip ←なんで8001なのかはこちらの「不便なこと1」を参照
18'h37FFF 8001にclip
18'h37FFe 8001にclip
:
これをverilogで書くと、
wire [15:0] E = (D[17]==0 && D[16:0]>17'h7FFF) ? 16'h7FFF : // +clip
(D[17]==1 && D[16:0]<17'h18001) ? 16'h8001 : // -clip
D[15:0]; // through
このclipping処理は、目がチカチカするのでわたしはcodingするたびになにかしらバグってしまい、simulationで気づくというヘタレなことをやってしまいます.上のcodeもバグっているやもしれぬ...固定小数点信号処理のめんどくさいところの一つです.
もしも、分解能低下も嫌だし、clippingも嫌ならば、RAMを18bitに拡張するしかないってことになります.
では今回はこのへんで、 つぎへ 前へ
人気ブログランキングへ
0 件のコメント:
コメントを投稿