2017-03-08 5 views
4

これは醜いような方法です。Chisel3の2つの符号なし数値の差を二乗する方法を教えてください。

class DiffSquared extends Module { 
    val inputWidth = 8 
    val width = 16 
    val io = IO(new Bundle { 
    val X = Input(UInt(inputWidth.W)) 
    val M = Input(UInt(inputWidth.W)) 
    val Out = Output(UInt(width.W)) 
    }) 
    val x = Wire(UInt((inputWidth+1).W)) 
    val m = Wire(UInt((inputWidth+1).W)) 
    x := io.X 
    m := io.M 
    val diff = Wire(SInt((inputWidth+1).W)) 
    diff := x.asSInt - m.asSInt 
    io.Out := (diff*diff).asUInt 
} 

9ビットSIntのにUINTをゼロ拡張に良い方法は何ですか、違いを行い、それを二乗し、16ビットのUINTとして結果を表していますか?

答えて

1

これ以上の改善はありません。 これを改善するために、UIntにゼロ拡張メソッドを追加する必要がありますか? すでにそこにはありますか?

class DiffSquared extends Module { 
    val inputWidth = 8 
    val width = 16 
    val io = IO(new Bundle{ 
    val X = Input(UInt(inputWidth.W)) 
    val M = Input(UInt(inputWidth.W)) 
    val Out = Output(UInt(width.W)) 
    }) 
    def zX(w:UInt) = Wire(UInt((w.getWidth+1).W),init=w).asSInt 
    val diff = Wire(init=zX(io.X)-zX(io.M)) 
    io.Out := (diff*diff).asUInt 
} 
+0

zextは、としてこのように、あなたがコードを書くことができ、ゼロがUINTの幅+ 1のSIntのにUINTを拡張していること有用。お気軽に機能リクエストを提出してください! – jkoenig

1

ここで便利な機能があります:一般的な符号拡張メソッドは、可能性が

class DiffSquared extends Module { 
    val inputWidth = 8 
    val width = 16 
    val io = IO(new Bundle { 
    val X = Input(UInt(inputWidth.W)) 
    val M = Input(UInt(inputWidth.W)) 
    val Out = Output(UInt(width.W)) 
    }) 
    val diff = io.X.zext() - io.M.zext() 
    io.Out := (diff*diff).asUInt 
} 
関連する問題