close

轉自:

http://lihaichuan.blog.51cto.com/498079/1087651

http://zhishidian1.kandianshi.com/Verilogchengxushejiwentisom__d/

 

 

取絕對值問題這是數位邏輯設計的問題,要求任一數之二補數方法:x = (not x) + 1 以4 bits而言,回憶一下-2是怎麼算的?

步驟一-先寫+2 : 0010 

步驟二-將+2取1補數: 1101 

步驟三-將步驟二所得+1: 1110  所求得即為-2

現在是反過來,給了1110 ,怎麼知道其十進制?

步驟A -將1110取1補數: 0001 

步驟B -將步驟A所得+1 : 0010 ,解釋為+2 

步驟C -將步驟B所得再加負號:答案即為-2  

看出來了嗎?假設輸入為a3 a2 a1 a0,你要的東西-取絕對值就變這樣:

步驟1:判斷a3是否為0,若為0即為正數,直接到總合裡面

步驟2:若a3為1,則將a3 a2 a1 a0全取NOT,再將結果+1即為所得。

其實我認為你們用符號大小表示法會簡單很多,就一個bit去判斷為+/- ,要取絕對值就直接拿掉singed bit;其它的加法動作都一樣。

 

function [7:0] abs;

     input [8:0] data_in;

     if(data_in[8]) abs=1+(~data[7:0]);     // 判斷最前面的位元是否為1 , 是1代表是負數 .  ~data[7:0]取1的補數     取完補數之後,再將結果+1.

     else abs=data[7:0];                    // 如果最前面的位元不是1 , 代表他是正數,也不須取絕對值

endfunction

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小穎 的頭像
    小穎

    屬於自己世界 ﹋ 穎〃    Black×Sky,,

    小穎 發表在 痞客邦 留言(0) 人氣()