1

カンザス溶岩紙からコードを入手しましたが、それは機能します。

counter :: Signal CLK Bool -> Signal CLK Bool -> Signal CLK Int
counter restart inc = loop
  where
    reg = register 0 loop
    reg' = mux restart (0, reg)
    loop = mux inc (reg' + 1, reg')

今、私は別の機能で同じことをしようとしましたが、これはうまくいきません。

shiftReg_d2f :: Signal CLK Bool -> Signal CLK Bool -> [Signal CLK Bool] -> [Signal CLK Bool] -> [Signal CLK Bool]
shiftReg_d2f load shift wordIn fieldIn = fieldOut
  where
    fieldOut = register 0 fieldOut''
    shiftField = drop (length wordIn) fieldOut ++ wordIn
    fieldOut' = muxl shift fieldOut shiftField
    fieldOut'' = muxl load fieldOut' fieldIn

現在、次のエラーが発生しています。

  • [Signal i0 Bool]予想されるタイプと実際のタイプを一致させることができませんでしたSignal clk0 a0(3x)
  • Signal i0 Bool予想されるタイプと実際のタイプを一致させることができませんでした[Signal i0 Bool]
  • Signal i Bool -> Signal i Bool -> Signal i Bool予想されるタイプと実際のタイプを一致させることができませんでしたSignal i Bool

私は何を間違っていますか?

助けてくれてありがとう

4

1 に答える 1

1

問題は、あなたが と混同しSignal clk [a]ていること[Signal clk a]です。前者は、その幅が無制限であり、サイクルごとに変化する可能性があるため、HDL 設定では基本的に機能しません。

代わりにできることは、fieldOutワイヤごとに定義することです。重要な洞察は、与えられた入力

fieldIn =  [x0, x1, x2, x3]
wordIn =   [w0, w1, w2]
fieldOut = [y0, y1, y2, y3]

出力は次のいずれかである必要があります

if load:   [x0, x1, x2, x3] = fieldIn
if shift:  [y3, w0, w1, w2] = drop (lenght wordIn) fieldOut ++ wordIn
otherwise: [y0, y1, y2, y3] = fieldOut

したがって、圧縮することfieldIndrop (length wordIn) fieldOut ++ wordIn、ビットごとに生成できます。

shiftReg_d2f :: Signal CLK Bool -> Signal CLK Bool -> [Signal CLK Bool] -> [Signal CLK Bool] -> [Signal CLK Bool]
shiftReg_d2f load shift wordIn fieldIn = fieldOut
  where
    fieldOut = zipWith toOutput fieldIn (drop (length wordIn) fieldOut ++ wordIn)
    toOutput input shifted = r
      where
        r = register False $ mux load (mux shift (r, shifted), input)
于 2015-02-24T04:57:53.330 に答える